提高頻寬利用率!為什麼要Pacing?
1986年的TCP擁塞崩潰事件讓AIMD模型在1988年後出來應對時局,從此以後網際網路協議的設計者和實現者聚焦於如何讓網路不擁塞。
毫無疑問,這裡最重要的是公平性,而非效率。不管是慢啟動,加性增窗,乘性減窗,還是後來的Vegas演算法的主動退讓,其目標都在於保證多條流經過共享鏈路時能公平共享頻寬。這種機制的目標不是讓單條流跑得更快。
換句話說,1988年的模型是不患寡而患不均的模型。其中的 “不患寡” 給很多人帶來了誤解。
事情在2010年前後悄悄地起了變化。
AIMD模型的目標是不患寡,而患不均,這注定單條TCP的頻寬利用率極低,因此HTTP協議一般會採用多條TCP流捆綁的方式來傳輸Web伺服器的資料以增加頻寬,然而多TCP連線意味著連線管理的開銷會增大,同時資料同步的開銷也會增加,這導致了人們傾向於使用單獨的連線來完成所有的事情。
然而,又是一個然而,TCP固有的隊頭擁塞問題導致單獨的TCP連線無法很好的進行HTTP流的多路複用,這個難題促進了Google對QUIC協議的設計和釋出,同時,QUIC的一些顯而易見的優勢點也逐步的回移進了TCP(如果可能的話)。
不管怎樣,如今確實是傾向於減少TCP連線數量,這便弱化了公平性的約束,如今,提高單條連線的頻寬利用率,成了迫在眉睫的硬需求。
如何度量頻寬利用率?
我傾向於用一種 綜合的效用 來度量,而不僅僅是 把頻寬跑滿, 倘若如此,一個包發十遍肯定能把頻寬跑滿,然而此時的利用率高嗎?
我傾向於把代價也算進去,最終,我們需要,在頻寬儘可能大的同時,保證代價儘可能小。
設G GG為收益,P PP為代價或者成本,那麼一個綜合效用可以用以下的比值表示:
E=GP E=\dfrac{G}{P}E=
P
G
我們的任務是,求出一組約束,使得E EE的值最大,此時頻寬的利用率最大。
上面的式子中,請注意P PP由兩部分組成:
本文以下的討論,假設鏈路的處理頻寬為常數U UU,處理方式為固定速率處理,處理單位為包粒度而不是位元組,那麼處理一個包的時間便是1U \dfrac{1}{U}
U
1
,我們從一種極端情況開始,經由一種一般的情況,最終會得出結論,只有均勻按照每1U \dfrac{1}{U}
U
1
時間勻速到達的資料包,其E EE值最大,而這種方式就是Pacing!
先看以極端情況下完全突發到達的資料包,即當到達率為λ \lambdaλ時,單位時間內所有的λ \lambdaλ個資料包同時到達。
我們知道,單位時間內系統可以處理U UU個資料包,是為服務率為U UU,然而當λ \lambdaλ個資料包在1U \dfrac{1}{U}
U
1
時間同時到達時,必然會有λ−1 \lambda-1λ−1個資料包排隊,而單位時間的空置時延依然是1−λU 1-\dfrac{\lambda}{U}1−
U
λ
,因此總代價就是常數。如下圖所示:
雖然看樣子利用率接近了100%,然而代價確實巨大的!透過計算可知,這種情況下的E EE值並不高。然而這麼多年,TCP的AIMD正是工作在這個模型上。
然而,正如我們分析網路資料流看到的那樣,情況可能比上面的模型展示的結果更加糟糕,這是為什麼?我們來接著分析。
下面我們看一種更加一般,更加符合真實環境的情況,即泊松到達的情況。這裡將會揭示一個關於 100%利用率的神話永不可達 的事實:
至於說泊松到達的情況下,這張圖為什麼長這個樣子,我就不推導了,從排隊論的公式簡單理解作圖就能得到。注意這裡的事實,最佳利用率而不是最大利用率,為什麼?
從圖上可以看出,如果我們在泊松到達的情況下想逼近收益牆附近的最大100%利用率,代價將是無法承受的,我們看到佇列長度將趨向無窮大,這是根本無法處理的情況!
這背後的原因其實非常簡單,即在泊松到達到達的情況下,單位時間到達的資料包會有機率性的大於μ \muμ,此時就將付出排隊延時的代價,而同樣會有機率性的小於μ \muμ,此時便要付出空置的代價,而不管是排隊還是空置,對於服務方而言,都是成本,不幸的是,這兩種成本是疊加而非抵消的關係!它們對資料包到達的影響效果僅僅是在數值意義上使得其到達均值為到達率λ \lambdaλ!
這便是100%利用率永不可達的神話!
這個故事不斷在我們生活中上演,這也是為什麼運維們很怕CPU利用率達到100%的原因,100%並不意味著系統利用率高,而是意味著系統卡死!
同樣,我們的工作看上去永遠也做不完,因為你永遠不知道接下來會發生什麼,只要你沒有空閒的時候,那麼就意味著你將永遠沒有空閒的時候。你仔細想想,是不是這個道理。
如何解決這個問題呢?
破除泊松到達模式即可,取而代之,我們要適配固定的服務速率,即頻寬μ \muμ,如果我們能完全按照每1μ \dfrac{1}{\mu}
μ
1
的時間傳送一個資料包,那豈不是意味著 既不用排隊,也不會空置 了嗎?這才是真正的100%的利用率!
是的,這就是Pacing!
完全按照瓶頸頻寬來空置傳送的速率,使其和服務速率完全相匹配!這就是提高頻寬利用率的最佳方法。上圖也是TCP BBR的理論基礎。
然而,說起來容易做起來難,首先,端到端的TCP如何知道頻寬到底是多少?你又要說測量是不是?測量結果具有一個RTT的滯後性。因此你測得的結果永遠都是以前的結果而不是現在的結果,由於網路情況存在隨機性,更無法預測未來的情景,於是乎,完全按照瓶頸頻寬來傳送資料是不可能的,我們意識到一旦不可能實現這一點,就意味著會出現隨機的排隊或者資源空置,這無可避免!
其次,Pacing的方法增加了TCP端到端實現的複雜性,破壞了TCP完美的 自時鐘。這個倒是有幾句話可以說說。
事實上TCP的AIMD在設計之初就將Pacing的希望寄託於其ACK自時鐘了。因為當時的設計者們相信,完美的 雅各布森管道 會把突發出去的資料包整成Pacing的方式到達對端,進而針對這些資料包ACK也會是Pacing的方式到達傳送端,從而驅動下一輪的資料以Pacing的方式傳送。
以上這個過程詳見《TCP/IP詳解(卷1)》。
然而事實證明,TCP的雅各布森管道並不完美,很少有網路能把突發的TCP資料整成Pacing的,最終,TCP便背上了突發協議的罵名。那麼,雅各布森管道為什麼不完美?有以下原因:
網路上存在多個TCP流而不是一個,新流的出現和舊流的消失不可預知;
ACK的反向路徑與資料包正向路徑不對稱導致形成的Pacing序列被破壞;
ACK本身的丟失會導致突發;
一些路由器為了限制包量會根據TCP的積累應答機制將多個連續ACK聚合,造成突發;
…
總之,網路鏈路太複雜,這使得依賴自時鐘形成Pacing是不現實的,那麼就不得不自己去算Pacing Rate了,而這個結果又是滯後的,或者說我們採集到的資訊僅僅夠算一個所謂的均值,這些資訊遠遠不足以指導Pacing傳送。
不管怎麼樣,我們依然會選擇Pacing的方式來傳送資料,至少在沒有新的有別於AIMD的全新數學模型出現之前吧。
如此一來,只要我們選擇了Pacing,那麼就必然要在TCP傳送端內建一套資料採集和計算引擎,這是AIMD模型所不需要的。
其實,很早以前就曾出現過一些爭論,比如關於完全速率控制的Pacing Rate傳送和完全ACK自時鐘驅動的傳送之間的爭論,非常類似於中斷和輪詢之間的爭論,最終,我們現在使用的Pacing傳送,比如BBR的Pacing方式,事實上是融合了兩者:
用ACK來驅動Pacing Rate的計算;
基於Pacing Rate來平滑傳送資料。
總之,提高頻寬的利用率的方法已經從捆綁多條TCP連線的方式進化到了提高單條TCP連線的頻寬利用率。理論上證明Pacing的方法是最好的,但是如何精確計算Pacing卻成了新的問題。
那麼怎麼辦?
---------------------
作者:dog250
來源:CSDN
原文:https://blog.csdn.net/dog250/article/details/83116575
版權宣告:本文為博主原創文章,轉載請附上博文連結!
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/31557905/viewspace-2217448/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 頻寬是什麼意思 頻寬和寬頻網速有什麼區別關係
- 上行頻寬和下行頻寬是什麼意思,各有什麼作用
- 伺服器上行頻寬和下行頻寬指的是什麼伺服器
- 伺服器頻寬是什麼伺服器
- 為什麼要虛擬化,為什麼要容器,為什麼要Docker,為什麼要K8S?DockerK8S
- 什麼是大頻寬伺服器伺服器
- 什麼是“假寬頻”,它是如何造假的
- Win10系統怎麼解除寬頻限制提高網速Win10
- 什麼是大頻寬伺服器?大頻寬伺服器的優勢有哪些?伺服器
- 大寬頻伺服器有什麼優勢?伺服器
- 頻寬與網速的區別是什麼?
- 大頻寬伺服器是什麼?RAKsmart怎麼樣伺服器
- 頻寬利用率提升50%,騰訊雲聯網架構方案解析架構
- 什麼是裸機雲大頻寬伺服器?伺服器
- 怎麼區分伺服器頻寬和家用網路寬頻?伺服器
- 頻寬
- 為什麼要code reviewView
- 為什麼要寫作
- 普通寬頻上網和專線有什麼區別
- Python是什麼?為什麼要掌握python?Python
- 為什麼要學習Netty?Netty
- 為什麼要學習 RustRust
- 為什麼要學習 Julia
- 為什麼要指令重排序?排序
- 為什麼要財務自由
- 為什麼要學習 Vim?
- 寬頻連線720錯誤是什麼意思?Win10寬頻連線720錯誤的解決辦法Win10
- 為提高效能go的slice和陣列要什麼初始化才好Go陣列
- 為什麼 JavaScript 的 this 要這麼用?JavaScript
- 【知識分享】高防伺服器對頻寬有什麼要求伺服器
- 【知識分享】伺服器使用大頻寬有什麼特點伺服器
- 小電容為什麼可以通高頻阻低頻?
- Python到底是什麼?為什麼要學Python?Python
- Python優勢是什麼?為什麼要學習?Python
- 我為什麼要學技術
- 為什麼要“東數西算”?
- 為什麼要分庫分表?
- 為什麼還要記密碼密碼