DPDK系列(二)——效能提升
首先,DPDK和核心網路協議棧不是對等的概念。
DPDK只是單純的從驅動拿資料,然後組織成資料塊給人用,跑在使用者態。功能相當於linux的裝置無關介面層,處於socket之下,驅動之上。只不過linux協議棧的這部分在核心態。
你說的包處理器,很多時候是不用linux核心協議棧的,而是用專用包處理程式,類似於DPDK加上層應用處理。通常會有些硬體加速器,包處理效率更高些。缺點是一旦用不上某些功能,那些加速器就白費了。而純軟體處理就非常靈活,不過代價就是功耗和效能。
純DPDK效能非常高,intel自己給出的資料是,處理一個包80時鐘週期。一個3.6Ghz的單核雙執行緒至強,64位元組小包,純轉發能力超過90Mpps,也就是每秒9千萬包。
不知你有沒有看出來,80週期是一個非常驚人的數字?正常情況下,處理器訪問一下ddr3記憶體都需要200個週期,而包處理程式所需要操作的資料,是從pcie裝置送到ddr記憶體的,然後再由處理器讀出來,也就是說,通常至少需要200週期。為啥現在80週期就能完成所有處理?我查了下文件,發現原因是使用了stashing或者叫direct cache access技術,對於PCIe網絡卡發過來的包,會存在一個特殊欄位。x86的pcie控制器看到這個欄位後,會把包頭自動塞到處理器的快取,無序處理器來干預。由於包頭肯定是會被讀取的,這樣相當於提前預測,訪問的時間大大縮短。
如果加上linux socket協議棧,比如跑個純http包反彈,那麼根據我的測量,會掉到3000-4000週期處理一個包,單核雙執行緒在2.4Mpps,每秒兩百四十萬包,效能差40倍。
效能高在哪?關鍵一點,DPDK並沒有做socket層的協議處理,當然快。其他的,主要是使用輪詢替代中斷,還有避免核心態到使用者態拷貝,並繫結核,避免執行緒切換開銷,還有避免進入系統呼叫的開銷,使用巨頁等。
還有很關鍵的一點,當執行緒數大於12的時候,使用linux協議棧會遇到互斥的瓶頸,用效能工具看的話,你會發現大部分的時間消耗在spin_lock上。解決方法之一是如github上面的fastsocket,改寫核心協議棧,使包始終在一個核上處理,避免競爭等。缺點是需要經常自己改協議棧,且應用程式相容性不夠。
另外一個方法是使用虛擬機器,每個特徵流只在一個核處理,並用虛擬機器隔絕競爭,底層用dpdk做轉發,上層用虛擬機器做包處理,這樣保證了原生的linux協議棧被呼叫,做到完全相容應用程式。不過這種方法好像還沒有人做成開源的,最近似的是dpdk+虛擬交換機ovs的一個專案。
如果你只想要dpdk的高效能加tcp/ip/udp的處理,不考慮相容性,那麼還可以去買商業程式碼,我看了下供應商的網站介紹,純轉發效能大概在500-1000週期左右一個包。
DPDK提升了IO效能,繞過了核心協議棧,同時也帶來了了應用程式開發工作量,配套DPDK的開源專案也逐步興起。