再看 BBR 到 BBRv3 的公平性改進

從看一篇論文開始:Performance Evaluation of TCP BBRv3 in Networks with Multiple Round Trip Times,結論比較悲觀:

  • 雖然 BBRv2/3 試圖解決 BBRv1 的公平性問題,但結果依舊不夠理想,BBR 的迭代依舊任重而道遠。

BBR 即使到了 v3 也依然不能論證穩定收斂,也因此它沒辦法成為默認擁塞控制算法。工程界和學界雖越發成為熟人社會卷得厲害,以前也不入流的東西最后可能通過類似 “送禮”,“互捧”,“交易” 的途徑就能標準化,但下限至少是能基本論證穩定和收斂,BBR 目前還差點。

總體而言,此文觀點很明確且有用,比提出個優化點,實驗室用 mininet,ns3,tc 模擬仿真一下吊打原生算法幾十個百分點,然后水一篇論文強很多,說實話那些東西也只是像我這樣沒事寫篇隨筆發個朋友圈的水準。也許稍微好一點,也許還不如我,誰知道呢。

本文剩下的部分主要談 BBR 內部公平性,展示它的難度,最后以描述外部公平性同樣難甚至更難結尾。

作為常識,公平性必須靠 buffer 動力學驅動,在 buffer 擠兌中獲得,遺憾的是,BBR 的 Probe 行為不但沒有利用 buffer 制造多流收斂,反而放大了差異,傾向于利好 RTT 偏大的流,這是不公平性的根源。就好像一個胖子一點點把瘦子擠到邊邊一樣,在不斷接觸中,一次挪一點。

來看看 Why。

此前我分析過,若不是 ProbeRTT 主動清空 buffer 堆積,實踐中的 BBR 將占 buffer 越來越多(雖然在理論分析中,BBR 從不堆積 buffer 制造隊列),這事實即使不看 draft 和代碼,稍微想一下就能明白。這里我再重復講一次(不啰嗦這些,本文也不剩啥了)。

只要 BBR 多流共存,任意一條當前 pacing rate 為 B1 的流只要 Probe 就一定能獲得更大的 buffer 占比,從而一定能擠占出哪怕一丁點帶寬 B2,且 B2 > B1 作為新的 maxbw 被 max-filter 記住,它隨后的 Drain phase 僅能 drain 掉 inflight 中比 B2 · minrtt 多出來的那部分,剩下的 B2 · minrtt - B1 · minrtt 的部分就留在了 buffer 中。

現在用控制變量法,讓其它流不進行 Probe,由于已經完成 Probe 的流擠出了更大的 B2,剩下的流即使保持各自當前 pacing rate,buffer 占用仍會增加,一直到這些流的 maxbw 紛紛過期,buffer 才停止增長。現在釋放控制變量,讓其自由 Probe,不等式傳遞原理,這種真實情況下一定比假設的情況占用更多 buffer。如此反復,隨著 BBR 流持續,buffer 占用將越來越大。

Probe 停止,maxbw 會過期并跌落,buffer 會停漲,但它不會自動清空,只是維持。類似河流經過已經填滿的湖泊,除非枯水不會自動排空湖泊一樣。更何況,Probe 不會停止,因此 buffer 會一直漲下去:
在這里插入圖片描述

若沒有 ProbeRTT,buffer 將類似上圖指示,從終點不斷堆積下去。但在 ProbeRTT 之前,還得先看下 cwnd gain 對 inflight 的約束。

不知是有意還是無意(也許 Google BBR 團隊從最開始真的就沒意識到這個問題),BBR 增加了 cwnd_gain 作為約束,限制 inflight 最大只能到 2 · BDP,以限制 buffer 的瘋漲,但這個限制讓 RTT 更小的流的處境更加雪上加霜。

BDP = bw · RTT,先看 bw,BBR 流的 bw 通過 Qp = 1.25 · maxbw · minrtt 的 Probe 量在 buffer 擠占出來, 可見 minrtt 越小,Qp 越小,再看 RTT,由于 buffer 占用持續增長,RTT = RTprop + RTwait 持續增長,管道容量增加,inflight = maxbw · (minrtt + RTwait) > 2 · maxbw · minrtt 更容易首先滿足 minrtt 小的流,因此 minrtt 小的流首先被 cwnd 限制。

不光如此,這個 cwnd-limited 問題甚至限制 Probe,越是被壓制的流越是被繼續壓制。由于 minrtt 更小流的 BDP 組分中 RTwait 占比很大,即使它的 Probe 加速比更高,其 bw 增量也不足以彌補 RTwait,maxbw 漲太慢,RTwait 值太大,BDP = maxbw · (minrtt + RTwait) 很快遭遇它的上限 2 · maxbw2 · minrtt。BBR 團隊和討論組早就發現這個問題,BBRv3 進行了修正,Probe 期間的 cwnd_gain 從 2 提升到了 2.25,但并沒解決本質問題。

所以,BBR 高度依賴 ProbeRTT,但主動突然排空 buffer 的行為讓 BBR 的 ProbeBW 狀態被中斷,buffer 隊列沒了,但只是把隊列轉到了 sender 的發送緩沖區,在端到端的數據生成處看來,數據只是 bufferbloat 在了尚未進入網絡協議棧的第 0 跳,ProbeRTT 遠沒有解決問題,只是轉移了問題。
核心問題還是要讓算法自動感知 RTT 的升高,無論是 RTwait 的升高還是 minrtt 本來就高,這兩種情況下,算法都要傾向于抑制 Probe,無論是縮短 Probe 時間,還是降低 pacing gain。

再一次,第一個想到的還得是靠 sigmoid 做激發函數,不過這次先簡單點,直接用兩個 sigmoid 來線性疊加,背后的意思是提供兩個負反饋:

  • 隊列越長,即 RTT - minrtt 越大,越傾向于抑制 Probe;
  • RTprop 越長,越傾向于抑制 Probe;
  • 用 sigmoid 函數去量綱,歸一。

操作如下:

S i g m o i d ( x , α , β , γ ) = α 1 + e β ? x + γ \mathrm{Sigmoid}(x,\alpha,\beta,\gamma)=\dfrac{\alpha}{1+e^{\beta\cdot x}}+\gamma Sigmoid(x,α,β,γ)=1+eβ?xα?+γ

A = B = 1 A=B=1 A=B=1

K = A ? S i g m o i d ( R T T ? R T p r o p , α 1 , β 1 , γ 1 ) + B ? S i g m o i d ( R T p r o p , α 2 , β 2 , γ 2 ) K=A\cdot\mathrm{Sigmoid}(\mathrm{RTT-RTprop},\alpha_1,\beta_1,\gamma_1)+B\cdot\mathrm{Sigmoid}(\mathrm{RTprop},\alpha_2,\beta_2,\gamma_2) K=A?Sigmoid(RTT?RTprop,α1?,β1?,γ1?)+B?Sigmoid(RTprop,α2?,β2?,γ2?)

G a i n = S i g m o i d ( K , α , β , γ ) \mathrm{Gain}=\mathrm{Sigmoid}(K,\alpha,\beta,\gamma) Gain=Sigmoid(K,α,β,γ)

用實際現網數據訓練,求出最佳擬合的幾個 α,β,γ 就可以了。那句廢話 A = B = 1 旨在表明一個點,兩個并列的 Sigmoid 函數沒必要加權,也許你會覺得 “單純 RTprop 大” 和 “單純 RTwait 大” 需要區別對待,其實不必,因為 Sigmoid 有個激發特性,只要 RTprop 和 RTwait 沒有一起大,它們和的 Sigmoid 函數就可以很小,只需調整 α2,β2,γ2 讓其向右偏,這意味著 RTprop 的作用力比 RTwait 更大,反之向左偏就傾向于 RTwait 的作用力更大。

如果不想實現復雜函數(特別是內核中),可分析現網數據后直接用 python 生成一張算好的表,將其粘貼在代碼里,代碼里查表大概就跟我一個函數幾千個 if 分支差不多的意思了。

為了能抵抗并容忍 minrtt 噪聲,前幾天剛發明一個 minrtt 采集算法,參考 BBR minrtt 的采集,兩個算法疊加,讓人不明覺厲,可以水一篇論文了。

但且慢,這些啟發式把戲難道不是我一直嗤之以鼻的嗎,我一再強調 RTT 的不準確性,算不準就別算,所以除卻這些可能適合論文或蒙騙經理的把戲,還有一個更加實用的方法。

參考 L4S & TCP Prague,TCP Prague 的 draft 提到一種 極簡主義算法 來去除 RTT 相關性,從而解決 AIMD 場景的 RTT 不公平性。模仿該思想,一個正確實用的算法就來了:

P r o b e Q u o t a = M a x B W ? R T p r o p + 0.25 ? min ? ( R T p r o p , δ ) \mathrm{ProbeQuota}=\mathrm{MaxBW}\cdot \mathrm{RTprop}+0.25\cdot\min(\mathrm{RTprop},\delta) ProbeQuota=MaxBW?RTprop+0.25?min(RTprop,δ)

其中 δ 為一個經驗的,統計意義上的 RTprop 中位數或其它的典型值,在不同網絡中有不同的典型值。

修改下面的函數即可:

static void bbr_update_cycle_phase(struct sock *sk,const struct rate_sample *rs,struct bbr_context *ctx)
{...case BBR_BW_PROBE_UP:

總之,BBR 的公平性之路還有很長的路要走,不僅僅是 BBR 內部的公平性,還有與 cubic 等 AIMD 算法共存時的外部公平性。

外部公平性,這很大程度上是因為存量 TCP 多數使用久經考驗和論證的 cubic 等 AIMD 算法,想當年 Reno AIMD 算法上線時,它是一個從零到一的過程,并不需要考慮外部公平性,而內部公平性非常好論證,隨后的 bic,cubic 也只是簡單迭代,可一旦涉及完全不同的機制,比如 Vegas,考慮到部署后的公平性,基本就是胎死腹中。看,BBR 為了外部公平性,又回到了老路,哪怕只是為了兼容,可能它必須兼容。

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

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/903257.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/903257.shtml
英文地址,請注明出處:http://en.pswp.cn/news/903257.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

locust壓力測試

安裝 pip install locust驗證是否安裝成功 locust -V使用 網上的教程基本上是前幾年的,locust已經更新了好幾個版本,有點過時了,在此做一個總結 啟動 默認是使用瀏覽器進行設置的 # 使用瀏覽器 locust -f .\main.py其他參數 Usage: locust […

優先隊列和單調隊列(雙端隊列實現的)

這里寫自定義目錄標題 一、優先隊列與單調隊列二、優先隊列2.1 概念2.2 增刪查 判空2.3 示例代碼 三、雙端隊列四、單調隊列4.1 單調遞增隊列4.2 單調遞減隊列 一、優先隊列與單調隊列 二、優先隊列 2.1 概念 一種特殊的隊列,它與普通隊列的主要區別在于元素的出…

如何在idea中寫spark程序

在 IntelliJ IDEA 中編寫 Spark 程序是一個高效且便捷的方式,以下是一個詳細的步驟指南,幫助你在 IntelliJ IDEA 中創建和運行 Spark 程序。 一、環境準備 安裝 Java: 確保已經安裝了 JDK 1.8 或更高版本。可以通過以下命令檢查:…

BERT BERT

BERT ***** 2020年3月11日更新:更小的BERT模型 ***** 這是在《深閱讀的學生學得更好:預訓練緊湊模型的重要性》(arXiv:1908.08962)中提到的24種較小規模的英文未分詞BERT模型的發布。 我們已經證明,標準的BERT架構和…

SpringBoot啟動警告:OpenJDK 64-Bit Server VM warning

問題描述 以Debug模式啟動Spring boot項目之后,日志打印:OpenJDK 64-Bit Server VM warning: Sharing is only supported for boot loader classes because bootstrap classpath has been appended, 警告信息 解決方案:配置VM opt…

“該虛擬機似乎正在使用中“

當某一天打開虛擬機突然彈出"該虛擬機似乎正在使用中"。 遇到這種問題的解決方法很簡單,出現這種問題是因為錯誤關閉虛擬機導致,當我們點擊獲取所有權時發現不能解決問題。這里分享一種簡單的解決方法。 打開虛擬機的文件目錄 找到lck文件夾下…

【CSS】層疊,優先級與繼承(三):超詳細繼承知識點

目錄 繼承一、什么是繼承?2.1 祖先元素2.2 默認繼承/默認不繼承 二、可繼承屬性2.1 字體相關屬性2.2 文本相關屬性2.3 列表相關屬性 三、不可繼承屬性3.1 盒模型相關屬性3.2 背景相關屬性 四、屬性初始值4.1 根元素4.2 屬性的初始值4.3 得出結論 五、強制繼承5.1 in…

Android LiveData關鍵代碼

1、observer方法 public void observe(NonNull LifecycleOwner owner, NonNull Observer<? super T> observer) {assertMainThread("observe");if (owner.getLifecycle().getCurrentState() DESTROYED) {// ignorereturn;}LifecycleBoundObserver wrapper …

Docker-高級使用

前言 書接上文Docker-初級安裝及使用_用docker安裝doccano-CSDN博客&#xff0c;我們講解了Docker的基本操作&#xff0c;下面我們講解的是高級使用&#xff0c;請大家做好準備&#xff01; 大家如果是從初級安裝使用過來的話&#xff0c;建議把之前鏡像和搭載的容器數據卷里面…

Spring Boot常用注解詳解:實例與核心概念

Spring Boot常用注解詳解&#xff1a;實例與核心概念 前言 Spring Boot作為Java領域最受歡迎的快速開發框架&#xff0c;其核心特性之一是通過注解&#xff08;Annotation&#xff09;簡化配置&#xff0c;提高開發效率。注解驅動開發模式讓開發者告別繁瑣的XML配置&#xff…

TRO再添新案 TME再拿下一熱門IP,涉及Paddington多個商標

4月2日和4月8日&#xff0c;TME律所代理Paddington & Company Ltd.對熱門IP Paddington Bear帕丁頓熊的多類商標發起維權&#xff0c;覆蓋文具、家居用品、毛絨玩具、紡織用品、游戲、電影、咖啡、填充玩具等領域。跨境賣家需立即排查店鋪內的相關產品&#xff01; 案件基…

經驗分享-上傳ios的ipa文件

.ipa格式的二進制文件&#xff0c;是打包后生成的文件&#xff0c;無論我們是放上去testflight測試還是正式上傳到app store&#xff0c;都需要先上傳到蘋果開發者中心的app store connect上的構建版本上。 在app store connect上&#xff0c;上傳構建版本的功能&#xff0c;它…

docker(3) -- 圖形界面

1. 前言 在wsl(8) – 圖形界面文章中介紹了wsl2默認是支持圖形界面的&#xff0c;現在我們嘗試下在docker中運行gui程序試試看。 2. x11-apps 啟動一個docker&#xff0c;安裝一些gui小程序&#xff0c;然后運行&#xff0c;發現會失敗。ubuntu_base詳見文章wsl(6) – 安裝d…

Docker容器跑定時任務腳本

最近搞了一個Docker容器跑腳本&#xff0c;想設置一個定時任務&#xff0c;每天8點運行一次&#xff0c;結果死活不成功。排查了一天&#xff0c;有一點當局者迷了&#xff0c;明明時間是對的&#xff0c;明明時區是對的&#xff0c;定時任務也是啟動的&#xff0c;它就是不執行…

【Linux】什么是完全限定域名

FQDN 是 “完全限定域名” (Fully Qualified Domain Name) 的縮寫。 FQDN 是一個互聯網上特定計算機或主機的完整且唯一的域名。它詳細說明了該主機在域名系統 (DNS) 層級結構中的確切位置。 一個 FQDN 通常由以下幾個部分組成&#xff0c;從左到右依次是&#xff1a; 主機名…

小結:BFD

*BFD&#xff08;雙向轉發檢測&#xff0c;Bidirectional Forwarding Detection&#xff09;是一種快速、輕量級的故障檢測機制&#xff0c;用于檢測網絡中兩點之間的連通性。它廣泛應用于各種場景 1. 檢測 IP 鏈路 應用場景&#xff1a; BFD 用于檢測兩臺設備之間的 IP 層連…

配置Spark歷史服務器,輕松查看任務記錄

在大數據處理中&#xff0c;Spark是一個強大的分布式計算框架。但當Spark服務重啟后&#xff0c;之前的運行記錄就會消失&#xff0c;給我們排查問題和分析任務執行情況帶來不便。這時&#xff0c;配置Spark歷史服務器就顯得尤為重要&#xff0c;它能幫助我們保存和查看歷史任務…

(六)RestAPI 毛子(外部導入打卡/游標分頁/Refit/Http resilience/批量提交/Quartz后臺任務/Hateoas Driven)

文章目錄 項目地址一、外部導入打卡功能1.1 創建實體1. Entry實體2. EntryImport實體3. 添加數據庫配置4. 創建表 1.2 創建DTOs1.3 創建GetEnties Controller 二、游標分頁2.1 創建所需要的DTOs1. 創建游標分頁的請求參數2. 創建CollectionResponse3. 添加游標編碼和解碼的DTO …

Node.js CSRF 保護指南:示例及啟用方法

解釋 CSRF 跨站請求偽造 (CSRF/XSRF) 是一種利用用戶權限劫持會話的攻擊。這種攻擊策略允許攻擊者通過誘騙用戶以攻擊者的名義提交惡意請求,從而繞過我們的安全措施。 CSRF 攻擊之所以可能發生,是因為兩個原因。首先,CSRF 攻擊利用了用戶無法辨別看似合法的 HTML 元素是否…

Flink介紹——實時計算核心論文之Dataflow論文總結

數據流處理的演變與 Dataflow 模型的革新 在大數據處理領域&#xff0c;流式數據處理系統的發展歷程充滿了創新與變革。從早期的 S4 到 Storm&#xff0c;再到 MillWheel&#xff0c;每一個系統都以其獨特的方式推動了技術的進步。S4 以其無中心架構和 PE&#xff08;Processi…