“對待端到端傳輸,信息不足就要少干預,越干預越糟糕”,這是我的信條,這次再來說說 MPTCP。
Linux 內核 MPTCP 最好的調度算法就是 default 算法,沒有之一,因為它以代價最小,最自然的方式做到了保序和聚合:
- 按最小 rtt 調度 next,確保多條 subflow 按序到達;
- 最小 rtt subflow 不斷填充至非最小 rtt,回到 1,開始 roundrobin 聚合;
- 始終保持最小 rtt 的 subflow 將自然放棄聚合 subflow,說明數據量不足;
- 最小 rtt 調度,只要時間足夠久,一定能穩定到最優狀態,其它任何算法都能歸結為最小 rtt 調度的
不同場景,只是為照顧某些特征,使用一些額外推算的信息優化局部指標,但在本質上,rtt 是唯一的輸入信息,即便如此,仍需要對其平滑,以 srtt 算。
其它任何信息,注入實時吞吐的計算,rtt 梯度等均是二手信息,且屬于高階二手信息,而信息只有單方向作用力,一旦誤判將會加倍抵消已獲得的微弱收益。例如,本身 srtt 即加工信息,使用它做輸入獲得的任何新信息均屬于高階二手信息,風險極大。
大量論文上展示的花哨算法之所以中看不中用,恰在于它們假設高階二手信息均是可信的,而在特定的仿真環境,它們確實可信,因為環境是可控的,而非實際現網隨機的復雜自適應環境,甚至不攜帶最簡單的統計復用特征。
我也玩過花活,提出笨鳥先飛的策略,先發送緩沖區后半部到 rtt 最大的 subflow,實屬與最小 rtt 調度反著來,但多笨的鳥先飛多久馬上浮現,循著這思路,同時堅守 “不使用高階二手信息” 的原則,最終就走向了分 block,徹底解耦各 subflow 序列關聯,最后把問題推給 buffer 管理,buffer 屬空間維度,與最小 rtt 正交,看起來相互不犯也和諧。
空間策略與時間策略不同的是 buffer 管理得先有足夠數據才能被調度,不是所有流都能隨時產生足夠多的數據,而時間流逝卻不止,遵循文初描述的三點即可,這么看來,我的花活的適應性還是不如最小 rtt 調度。
在更一般的范疇,時間一直均勻流逝,時間維度的策略比空間維度的策略更加能適應幾乎所有場景,而空間維度的策略更適用于單獨追求高性能的場景,而性能等效于時間的倒數,用空間換時間自然而然,但空間策略的適應性更弱,統觀全局,若要生存,若要展開,適應性要比高性能更重要,這又是一個辯證。
續噴 MPTCP,在于我要澄清另一個原則,“非技術經理不要追求技術指標,而要追求體驗,QoE”。
一個商務經理(很多商務經理總強調自己以前搞過技術,估計是怕被忽悠,商務就商務,裝什么懂技術)整天追 “MPTCP 的聚合效率” 是一種什么體驗,比如他非要將 1Mpbs 和 100Mbps 聚合成 101Mbps,結果聚合結果只有 50Mbps,比不聚合還要差,到底誰錯了?在我看來,我得告訴他正確結果不是 101Mbps,而是 100.373Mbps,我還要強調我是算出來的,真 TM 想扇他。
誰也沒錯,邊界亂了。從一開始就不該讓經理知道 “帶寬”,“帶寬聚合” 等名詞,他們應該知道的是 “卡頓”。否則很容易陷入 “為聚合而聚合” 的陷阱,最終工人們會想花活來應對技術指標要求,弄巧成拙,比如要聚合 rtt = 1ms,300ms 路徑,為 rtt = 1ms 的那條主動增加 300ms,結果卻嚴重損害了體驗。
做 TCP 優化時曾遇到過一位經理,嫌 srtt 抖動,要我們周內消除 srtt 抖動,經理以為這是個很難的工作,但對我們太簡單了,把 srtt 歷史權重提高到 0.95,經理的問題就解決了。如果經理不知道 rtt 這個概念,我們本想利用那周剩下的幾天挑選長尾噪點做針對性優化。第二周經理發現 srtt 抖動降低了,吞吐還是不行,我怕他是不是又要折騰幺蛾子,果斷請假,利用休假完成了我那經典的 1000 個 if 分支。
經理不應該學習技術,技術因果和管理因果完全不同,后者的對象是不講內稟的。堅信 rtt 抖動消除了性能就提升比堅信加班就能完成工作更天真,因為 rtt 抖動是內稟的,而加班或許真的能完成工作,雖然大多數情況下不能。
說回 MPTCP。MPTCP 聚合路由器的意義是聚合不同運營商不同代系的帶寬,平滑波動,使得在各種代系以及運營商覆蓋率的場景下都能提供穩定高速的帶寬,其中高速并非重點,由于各運營商地域覆蓋率并不重疊,聚合路由器平滑差異,穩定少斷網才是關鍵。
在技術層面,多路徑是多路徑,聚合是聚合,二者沒什么太值得一提的關聯,多路徑算是未來傳輸技術的趨勢,特別是未來摩爾定律失效后的高速傳輸領域,而聚合只是過渡技術,要聚合說明不夠,夠了就不需要聚合了。
噴 TCP,噴 BBR,噴 MPTCP,根本上還是看不慣有人不懂,怒其不爭。
最后,做道題目:
一根長度為 L,截面積為 S 的厚橡皮水管,兩個端點分別為 A,B,從 A 端注水,B 端出水時可充滿截面積 S,假設在距離 A 端 x 處的水管上開一個面積為 y 的口漏水,若此時仍要 B 端出水時可充滿截面積 S,對 A 端注水應該有何要求,從檢測到漏口,A 端需要執行該要求多久,B 端才能重新充滿截面積 S,與 x,y 的關系是什么?
然后用它來對帶寬聚合建模。
浙江溫州皮鞋濕,下雨進水不會胖。