本文列舉四個比較經典的 Linux 收包引擎,如果還有其他你覺得ok的可以留言。這四個分別是:
libpcap
libpcap的包捕獲機制是在數據鏈路層增加一個旁路處理,不干擾系統自身的網路協議棧的處理,對發送和接收的數據包通過Linux內核做過濾和緩沖處理,最后直接傳遞給上層應用程序。
libpcap-mmap
libpcap-mmap是對舊的libpcap實現的改進,新版本的libpcap基本都采用packet_mmap機制。PACKET_MMAP通過mmap,減少一次內存拷貝(?「第4次拷貝沒有了」?),減少了頻繁的系統調用,大大提高了報文捕獲的效率。
PF_RING
我們看到之前libpcap有4次內存拷貝。libpcap_mmap有3次內存拷貝。PF_RING提出的核心解決方案便是減少報文在傳輸過程中的拷貝次數。
我們可以看到,相對與libpcap_mmap來說,pfring允許用戶空間內存直接和rx_buffer做mmap。這又減少了一次拷貝 (?「libpcap_mmap的第2次拷貝」:rx_buffer->skb)
PF-RING ZC實現了DNA(Direct NIC Access 直接網卡訪問)技術,將用戶內存空間映射到驅動的內存空間,使用戶的應用可以直接訪問網卡的寄存器和數據。
通過這樣的方式,避免了在內核對數據包緩存,減少了一次拷貝(?「libpcap的第1次拷貝」?,DMA到內核緩沖區的拷貝)。這就是完全的零拷貝。
其缺點是,只有一個 應用可以在某個時間打開DMA ring(請注意,現在的網卡可以具有多個RX / TX隊列,從而就可以在每個隊列上同時一個應用程序),換而言之,用戶態的多個應用需要彼此溝通才能分發數據包。
DPDK
pf-ring zc和dpdk均可以實現數據包的零拷貝,兩者均旁路了內核,但是實現原理略有不同。pf-ring zc通過zc驅動(也在應用層)接管數據包,dpdk基于UIO實現。
1 UIO+mmap 實現零拷貝(zero copy)
UIO(Userspace I/O)是運行在用戶空間的I/O技術。Linux系統中一般的驅動設備都是運行在內核空間,而在用戶空間用應用程序調用即可,而UIO則是將驅動的很少一部分運行在內核空間,而在用戶空間實現驅動的絕大多數功能。采用Linux提供UIO機制,可以旁路Kernel,將所有報文處理的工作在用戶空間完成。
2 UIO+PMD 減少中斷和CPU上下文切換
DPDK的UIO驅動屏蔽了硬件發出中斷,然后在用戶態采用主動輪詢的方式,這種模式被稱為PMD(Poll Mode Driver)。
與DPDK相比,pf-ring(no zc)使用的是NAPI polling和應用層polling,而pf-ring zc與DPDK類似,僅使用應用層polling。
3 HugePages 減少TLB miss
在操作系統引入MMU(Memory Management Unit)后,CPU讀取內存的數據需要兩次訪問內存。第一次要查詢頁表將邏輯地址轉換為物理地址,然后訪問該物理地址讀取數據或指令。
為了減少頁數過多,頁表過大而導致的查詢時間過長的問題,便引入了TLB(Translation Lookaside Buffer),可翻譯為地址轉換緩沖器。TLB是一個內存管理單元,一般存儲在寄存器中,里面存儲了當前最可能被訪問到的一小部分頁表項。
引入TLB后,CPU會首先去TLB中尋址,由于TLB存放在寄存器中,且其只包含一小部分頁表項,因此查詢速度非常快。若TLB中尋址成功(TLB hit),則無需再去RAM中查詢頁表;若TLB中尋址失敗(TLB miss),則需要去RAM中查詢頁表,查詢到后,會將該頁更新至TLB中。
而DPDK采用HugePages ,在x86-64下支持2MB、1GB的頁大小,大大降低了總頁個數和頁表的大小,從而大大降低TLB miss的幾率,提升CPU尋址性能。
4 其它優化
XDP
xdp代表eXpress數據路徑,使用ebpf 做包過濾,相對于dpdk將數據包直接送到用戶態,用用戶態當做快速數據處理平面,xdp是在驅動層創建了一個數據快速平面。在數據被網卡硬件dma到內存,分配skb之前,對數據包進行處理。
請注意,XDP并沒有對數據包做Kernel bypass,它只是提前做了一點預檢而已。
相對于DPDK,XDP具有以下優點:
XDP的使用場景包括:
OK,以上就是今天的分享,如果你覺得還有其他的收包引擎,可以留言分享。
以上就是Linux經典的幾款收包引擎的詳細內容,更多請關注www.92cms.cn其它相關文章!