首頁  >  文章  >  運維  >  Linux經典的幾款收包引擎

Linux經典的幾款收包引擎

Linux中文社区
Linux中文社区轉載
2023-08-04 16:07:061905瀏覽

這篇文章列舉四個比較經典的 Linux 收包引擎,如果還有其他你覺得ok的可以留言。這四個分別是:

  • libpcap/libpcap-mmap
  • PF_RING
  • DPDK
  • xdp

libpcap

libpcap的套件擷取機制是在資料鏈結層增加一個旁路處理,不干擾系統本身的網路協定棧的處理,對發送和接收的資料包透過Linux核心做過濾和緩衝處理,最後直接傳遞給上層應用程式。

  1. 封包到達網卡設備。
  2. 網路卡設備依據配置進行DMA操作。 ( 「第1次拷貝」 :網路卡暫存器->核心為網路卡所指派的緩衝區ring buffer)
  3. #網卡發送中斷,喚醒處理器。
  4. 驅動軟體從ring buffer讀取,填滿核心skbuff結構( 「第2次拷貝」 # :核心網卡緩衝區ring buffer->核心專用資料結構skbuff)
  5. #接著呼叫netif_receive_skb函數:
  • #5.1 若有抓包程序,由網路分接口進入BPF過濾器,規則匹配的封包拷貝到系統核心快取( 「第3次拷貝」
  • ########################################## ###)。 BPF為每一個要求服務的抓包程式關聯一個filter和兩個buffer。 BPF分配buffer 且通常情況下它的額度是4KB the store buffer 被用來接收來自適配器的資料;the hold buffer被用來拷貝包到應用程式。 ############5.2 處理資料鏈結層的橋接功能;############5.3 根據skb->protocol欄位決定上層協定並提交給網路層處理,進入網路協定棧,進行高層處理。 ############libpcap繞過了Linux核心收包流程中協定堆疊部分的處理,使得用戶空間API可以直接呼叫套接字PF_PACKET從鏈路層驅動程式中獲得資料封包的拷貝,將其從核心緩衝區拷貝至使用者空間緩衝區(### ######「第4次拷貝」###### ###)########## ###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 其它優化

    • SNA(Shared-nothing Architecture),軟體架構去中心化,盡量避免全局共享,帶來全局競爭,失去橫向擴展的能力。 NUMA系統下不跨Node遠端使用記憶體。
    • SIMD(Single Instruction Multiple Data),從最早的mmx/sse到最新的avx2,SIMD的能力一直在增強。 DPDK採用批量同時處理多個包,再用向量編程,一個週期內對所有包進行處理。例如,memcpy就使用SIMD來提高速度。
    • cpu affinity:即CPU 親和性

    XDP

    ##xdp代表eXpress資料路徑,使用ebpf 做包過濾,相對於dpdk將資料包直接送到使用者態,用使用者態當做快速資料處理平面,xdp是在驅動層創建了一個資料快速平面。在資料被網卡硬體dma到內存,分配skb之前,對資料包進行處理。

    請注意,XDP並沒有對資料包做Kernel bypass,它只是提前做了一點預檢而已。

    相對於DPDK,XDP具有以下優點:

    • 無需第三方程式碼庫和許可
    • 同時支援輪詢式和中斷式網路
    • 無需分配大頁
    • 無專用的CPU
    • #無須定義新的安全網路模型

    XDP的使用情境包括:

    • DDoS防禦
    • #防火牆
    • 基於XDP_TX的負載平衡
    • 網路統計數據
    • 複雜網路取樣
    • #高速交易平台

    #OK,以上就是今天的分享,如果你覺得還有其他的收包引擎,可以留言分享。


以上是Linux經典的幾款收包引擎的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:Linux中文社区。如有侵權,請聯絡admin@php.cn刪除