昨晚讀了一篇Paper:
https://penberg.org/parakernel-hotos19.pdf
大意是說,随着IO裝置的進化,它們的存取/傳輸速率已經超過了CPU到記憶體的存儲/傳輸速率,再也不再是慢速 外設 了,是以,對這些快速裝置的管理和操作要發生改變才能适應,從這個意義上講,幾乎一成不變的Linux kernel在很多方面确實阻滞了性能的優化。
這可能是現如今人們紛紛轉向DPDK/netmap或者XDP的本質原因了。怎麼說呢?周末回上海前,發一篇感想。
在人們的印象中,一台标準的計算機包含三大件:
- CPU,即中央處理器。
- 記憶體,懸挂在類似叫做北橋的晶片上。
- 外設,慢速IO裝置,懸挂在類似叫做南橋的晶片上。
這也是我們在《計算機組成原理》這門課中學到的。其實這就是現實中的計算機,就這樣子,如果按照抽象的馮諾伊曼計算機來看,計算機是不包含外設的,它隻有CPU和記憶體,強調存儲和執行,是為 存儲執行計算機。
有了現實中的計算機組成後,下一步就是設計作業系統來管理這些東西,事實上,幾乎任何作業系統都可以按照這堆東西劃分為不同的子產品:
- 程序管理,管理CPU分時和排程。
- 記憶體管理,管理記憶體配置設定。
- 檔案系統,管理檔案組織。
- 網絡協定棧,管理網絡IO。
- 磁盤驅動,…
- …
其實一開始從名字上将除CPU,記憶體之外的物件叫做 外設 (某種意義上磁盤也是),并且将其連接配接到相對慢速的橋片上,背後的假設就是 相對于CPU和記憶體,這些IO裝置是慢速的。
于是作業系統為了管理這些慢速裝置,不得不設計出複雜的機制來進行速率的适配,資料的緩存等,無論是Unix/Linux還是Windows,均是在這個假設下設計出來的。
但是,事情在悄悄地起變化,外設也逐漸高速化,智能化,變得和CPU差不多了,越來越多的外設自帶了存儲晶片,俨然另一組CPU/記憶體挂在同一塊主機闆上…
這個時候,作業系統應該作為一個協調者更合适,而不再适合繼續作為管理者了,但是那些舊時代複雜的管理機制依然存在。以網絡協定棧為例:
- 各類連結清單在多CPU環境下的同步開銷。
- 不可睡眠的軟中斷路徑過長。
- sk_buff的配置設定和釋放。
- 記憶體拷貝的開銷。
- 上下文切換造成的cache miss。
- …
顯然這些機制在10Mbps/100Mbps網卡的慢速時代是沒有任何問題的,那個時候 應用程式大部分時間在等網卡送上來資料。 現在到了1000Mbps/10Gbps/40Gbps網卡的時代,竟然反過來了,資料被很快地收入,卻全部堵在核心裡。
于是,各種優化措施應着需求而來:
- 網卡RSS,多隊列。
- 中斷線程化。
- 分割鎖粒度。
- Busypoll。
- …
但卻都是見招拆招,治标不治本。問題的根源不是這些機制需要優化,而是這些機制需要推倒重構。 蒸汽機車剛出來的時候,馬車夫為了保持競争優勢,不是去換一匹昂貴的快馬,而是賣掉馬去買一台蒸汽機裝上。 基本就是這個意思。
重構的思路很顯然有兩個:
- upload方法:别讓應用程式等核心了,讓應用程式自己去網卡直接拉資料。
- offload方法:别讓核心處理網絡邏輯了,讓網卡自己處理。
總之,繞過核心就對了。
人們肯定知道如何處理這種高速的網絡流,但是核心代碼是寫死的,版本疊代周期漫長,很難重構,那麼如何讓懂行的人自己的代碼處理高速流就是唯一要解決的問題,很顯然就有upload和offload兩種方法了。
- DPDK讓使用者态程式直接處理網絡流,bypass掉核心,使用獨立的CPU專門幹這個事。
- XDP讓灌入網卡的eBPF程式直接處理網絡流,bypass掉核心,使用網卡NPU專門幹這個事。
如此一來,核心協定棧就不再參與資料平面的事了,留下來專門處理諸如路由協定,遠端登入等控制平面和管理平面的資料流,妥妥的。
自2012年開始我就一直在關注Linux網絡協定棧轉發平面的性能優化,到2015年已經有很多想法落地,但都是基于Linux核心協定棧的優化,那個時候還沒有智能網卡,DPDK也不火爆,能做的隻是優化協定棧,當時除了華為等大廠也很少有做這塊工作的,像BAT這種網際網路公司開始疊代的第一代雲網絡也都是從核心協定棧起步的,即便如此也很少有人專門做這個。
…
時光流逝,不禁感慨,到了2016年,2017年至今,幾乎相關公司招聘網絡方面研發人員的任何JD上都會要求類似DPDK/eBPF,進而幾乎人人的履歷上都會寫上相關的經驗,我顯然已經落後于時代,或者說前些年太過超前,結果被後來的曆史車輪碾成了碎片。
時代發生了變化。
…
不變的則是擁抱變化。
你們知道擁抱變化出自哪裡嗎?其實我也不知道,但一定不是出自阿裡巴巴,阿裡巴巴隻是借用了它。中文 “擁抱變化” 這個詞我見到最早的是一本書中譯本的名字,它是《解析極限程式設計-擁抱變化》,就是下面這本:這本書出版于2002年,英文版的或許更早。我在2005年的時候還買了這本書。![]()
Linux網絡資料轉發平面的變遷-從核心協定棧到DPDK/XDP
浙江溫州皮鞋濕,下雨進水不會胖。