網絡Midbox處理TCP的方式對TCP吞吐的影響

昨天下班的路上,我發了一則朋友圈:

今天抓到一條大魚,隧道的TCP載荷吞吐提升一倍多,哈哈,週末愉快!

很多隧道都用同一個線程處理同一個tcp流,這顯然不對,應該用不同的線程分別處理一個流的兩個方向。

但很多用戶態隧道都是同一個線程處理同一條tcp連接的,這是問題。

這個問題在很多人看來真的很low,依然是那種不過如此的問題,因爲怕被笑話,我故意把事情說的很low,但這只是一種措辭處理的技巧,本來這事兒就這麼過去了。

但深入思考是我的習慣,我發現這竟然是一個普遍的問題,就準備記錄下來。

這不是一個和性能有關的多處理優化問題,這只是一個非常簡單的保持全雙工的問題!

如果一個midbox無法保持全雙工處理,那麼它便破壞了互聯網的基本原則。

當一條TCP流經過一個隧道的時候,它的trace波形圖是下面的樣子:

而正常的trace圖應該是下面的:

關於TCP是如何均勻填滿整個BDP管道的動力學我就不分析了,之前說過太多。只是看到上述的 *階梯狀 *trace圖之後,你會怎麼做?

我先說我會怎麼做。

很明顯,首先,我不會去查什麼中間鏈路上的隧道之類的,看到如此明顯的 *空窗期 *,見招拆招 *填充它 *便是了。於是:

調試TCP CC絕對是一個類似拆彈的手藝活兒,但往往也能體現一個人的技術素質,比如我就不合格:

  • 我不去分析造成這種階梯波形的原因,反而一上來就見招拆招地填補空窗期…

如此填窗是很簡單的,一個stap -g腳本就能搞定。然而填窗之後,trace波形慘不忍睹…大量丟包,一片紅,隊形全亂!

嗯,我就是沒有坐診直接開顱的那個庸醫華佗!

好了,現在收起生鏽的手術刀,開始分析根因。同時比對一下接收端的trace波形就能發現端倪:

TCP平滑的trace波形是背靠背的數據和ACK形成的,ACK提供反饋,促發數據的發送:

平滑的trace圖意味着什麼?

平滑的trace圖意味着 *每一個數據段之間的間隔相同或者大致相同! *這要求:

  • 每一個ACK之間的間隔相同或者大致相同(不考慮延遲ACK或者完全考慮延遲ACK)。

平滑的ACK流促發平滑的數據流!

簡而言之, *網絡必須“同時”處理數據段和ACK段! *只有這樣數據段和ACK段之間纔不會因爲互斥而引入延遲,我們知道,任意持續引入的延遲都會逐漸放大,讓trace波形變成階梯。

如果網絡中間有一個midbox,它只能每次處理一個報文,那麼會怎樣?

本來背靠背的流量被midbox整形成了帶有gap的,那麼trace波形圖顯然也就從一條斜線變成階梯狀了。

僅僅變成階梯狀嗎?它實際的後果是什麼?我們觀察階梯狀的trace圖,發送方向的那個空窗期其實是midbox在處理另一個方向的ACK,顯而易見,時間被兩個方向共享了,吞吐即下降一倍。

當分離兩個方向的處理後,正如預期的,吞吐翻倍。

好的,現在的結論很明確了,就是midbox的鍋!但是midbox到底是什麼?midbox具有什麼特徵纔會造成階梯狀的trace波形呢?

如果midbox是一個單進程單線程的服務,必須OpenVXY,那必然結果如此。但如果midbox是一個多進程多線程的服務,相比之下是不是會避開這個坑呢?

也未必。當說到這個midbox多處理話題的時候,很多人會想當然認爲直接打散就好了,要麼按流打散,要麼按包打散,但都有坑:

  • 按流打散,會造成本文所描述的現象,一個流被同一個線程處理,但一個線程同時只能處理一個方向啊!
  • 按包打散,會造成單流亂序的增加,如果SACK超過了發送端對亂序度的忍耐程度,便會增加重傳降低有效帶寬。

實際上還有一個維度,即 *按方向打散 *,然後在每個方向上再按流打散。我們有一個現成的實例,就是這麼做的,那就是Linux內核協議棧:

  • 網卡可以按包元組hash做RSS(這顯然是區分方向的),然後Linux內核協議棧確保在同一個CPU Core上完成從接收到轉發的流程。

說來很挺簡單, 網絡是什麼樣子的,midbox不要破壞它便是了。顯然,網絡是全雙工的,midbox也要設計成全雙工的,而要實現全雙工,至少需要兩個線程,一個方向一個,不是嗎?

這裏的道理顯然很簡單,與併發,多核編程模型毫無關係,與hash也沒關係,這裏只是一個保持全雙工的問題。

還有一個buffer bloat的問題。

單線程處理一個流的半雙工midbox實際上促使了數據段和ACK段的排隊,如果一個方向上過來的包不能馬上被處理,當然要排隊了。正如我們想象的,很多midbox其實都可以被戲稱爲排隊buffer,所以pacing隊形在經過了幾跳之後很難再被保持,這也是爲什麼BBR很多情況下不符合預期的原因之一。

總之,我對運營商的大多數轉發設備是不信任的,我不覺得它們能保持你的pacing rate( *如果它們不是因爲沒有這個義務而不做,那就是它們沒有這個能力 *),即便這個pacing rate低於它們的限速值,它們也能給你整成burst。純正的BBR行爲還是要內網觀測,放到運營商公網,純正的隊形就像坎尼會戰中的羅馬軍團,剎那間被衝散!

浙江溫州皮鞋溼,下雨進水不會胖。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章