日日操夜夜添-日日操影院-日日草夜夜操-日日干干-精品一区二区三区波多野结衣-精品一区二区三区高清免费不卡

公告:魔扣目錄網(wǎng)為廣大站長(zhǎng)提供免費(fèi)收錄網(wǎng)站服務(wù),提交前請(qǐng)做好本站友鏈:【 網(wǎng)站目錄:http://www.ylptlb.cn 】, 免友鏈快審服務(wù)(50元/站),

點(diǎn)擊這里在線(xiàn)咨詢(xún)客服
新站提交
  • 網(wǎng)站:51998
  • 待審:31
  • 小程序:12
  • 文章:1030137
  • 會(huì)員:747

本文列舉四個(gè)比較經(jīng)典的 Linux 收包引擎,如果還有其他你覺(jué)得ok的可以留言。這四個(gè)分別是:

    libpcap/libpcap-mmap
    PF_RING
    DPDK
    xdp

    libpcap

    libpcap的包捕獲機(jī)制是在數(shù)據(jù)鏈路層增加一個(gè)旁路處理,不干擾系統(tǒng)自身的網(wǎng)路協(xié)議棧的處理,對(duì)發(fā)送和接收的數(shù)據(jù)包通過(guò)Linux內(nèi)核做過(guò)濾和緩沖處理,最后直接傳遞給上層應(yīng)用程序。

      數(shù)據(jù)包到達(dá)網(wǎng)卡設(shè)備。
      網(wǎng)卡設(shè)備依據(jù)配置進(jìn)行DMA操作。(?「第1次拷貝」?:網(wǎng)卡寄存器->內(nèi)核為網(wǎng)卡分配的緩沖區(qū)ring buffer)
      網(wǎng)卡發(fā)送中斷,喚醒處理器。
      驅(qū)動(dòng)軟件從ring buffer中讀取,填充內(nèi)核skbuff結(jié)構(gòu)(?「第2次拷貝」?:內(nèi)核網(wǎng)卡緩沖區(qū)ring buffer->內(nèi)核專(zhuān)用數(shù)據(jù)結(jié)構(gòu)skbuff)
      接著調(diào)用netif_receive_skb函數(shù):
      5.1 如果有抓包程序,由網(wǎng)絡(luò)分接口進(jìn)入BPF過(guò)濾器,將規(guī)則匹配的報(bào)文拷貝到系統(tǒng)內(nèi)核緩存 (?「第3次拷貝」?)。BPF為每一個(gè)要求服務(wù)的抓包程序關(guān)聯(lián)一個(gè)filter和兩個(gè)buffer。BPF分配buffer 且通常情況下它的額度是4KB the store buffer 被使用來(lái)接收來(lái)自適配器的數(shù)據(jù);the hold buffer被使用來(lái)拷貝包到應(yīng)用程序。
      5.2 處理數(shù)據(jù)鏈路層的橋接功能;
      5.3 根據(jù)skb->protocol字段確定上層協(xié)議并提交給網(wǎng)絡(luò)層處理,進(jìn)入網(wǎng)絡(luò)協(xié)議棧,進(jìn)行高層處理。
      libpcap繞過(guò)了Linux內(nèi)核收包流程中協(xié)議棧部分的處理,使得用戶(hù)空間API可以直接調(diào)用套接字PF_PACKET從鏈路層驅(qū)動(dòng)程序中獲得數(shù)據(jù)報(bào)文的拷貝,將其從內(nèi)核緩沖區(qū)拷貝至用戶(hù)空間緩沖區(qū)(?「第4次拷貝」?

      libpcap-mmap

      libpcap-mmap是對(duì)舊的libpcap實(shí)現(xiàn)的改進(jìn),新版本的libpcap基本都采用packet_mmap機(jī)制。PACKET_MMAP通過(guò)mmap,減少一次內(nèi)存拷貝(?「第4次拷貝沒(méi)有了」?),減少了頻繁的系統(tǒng)調(diào)用,大大提高了報(bào)文捕獲的效率。

      PF_RING

      我們看到之前l(fā)ibpcap有4次內(nèi)存拷貝。libpcap_mmap有3次內(nèi)存拷貝。PF_RING提出的核心解決方案便是減少報(bào)文在傳輸過(guò)程中的拷貝次數(shù)。

      我們可以看到,相對(duì)與libpcap_mmap來(lái)說(shuō),pfring允許用戶(hù)空間內(nèi)存直接和rx_buffer做mmap。這又減少了一次拷貝 (?「libpcap_mmap的第2次拷貝」:rx_buffer->skb)

      PF-RING ZC實(shí)現(xiàn)了DNA(Direct NIC Access 直接網(wǎng)卡訪(fǎng)問(wèn))技術(shù),將用戶(hù)內(nèi)存空間映射到驅(qū)動(dòng)的內(nèi)存空間,使用戶(hù)的應(yīng)用可以直接訪(fǎng)問(wèn)網(wǎng)卡的寄存器和數(shù)據(jù)。

      通過(guò)這樣的方式,避免了在內(nèi)核對(duì)數(shù)據(jù)包緩存,減少了一次拷貝(?「libpcap的第1次拷貝」?,DMA到內(nèi)核緩沖區(qū)的拷貝)。這就是完全的零拷貝。

      其缺點(diǎn)是,只有一個(gè) 應(yīng)用可以在某個(gè)時(shí)間打開(kāi)DMA ring(請(qǐng)注意,現(xiàn)在的網(wǎng)卡可以具有多個(gè)RX / TX隊(duì)列,從而就可以在每個(gè)隊(duì)列上同時(shí)一個(gè)應(yīng)用程序),換而言之,用戶(hù)態(tài)的多個(gè)應(yīng)用需要彼此溝通才能分發(fā)數(shù)據(jù)包。

      DPDK

      pf-ring zc和dpdk均可以實(shí)現(xiàn)數(shù)據(jù)包的零拷貝,兩者均旁路了內(nèi)核,但是實(shí)現(xiàn)原理略有不同。pf-ring zc通過(guò)zc驅(qū)動(dòng)(也在應(yīng)用層)接管數(shù)據(jù)包,dpdk基于UIO實(shí)現(xiàn)。

      1 UIO+mmap 實(shí)現(xiàn)零拷貝(zero copy)

      UIO(Userspace I/O)是運(yùn)行在用戶(hù)空間的I/O技術(shù)。Linux系統(tǒng)中一般的驅(qū)動(dòng)設(shè)備都是運(yùn)行在內(nèi)核空間,而在用戶(hù)空間用應(yīng)用程序調(diào)用即可,而UIO則是將驅(qū)動(dòng)的很少一部分運(yùn)行在內(nèi)核空間,而在用戶(hù)空間實(shí)現(xiàn)驅(qū)動(dòng)的絕大多數(shù)功能。采用Linux提供UIO機(jī)制,可以旁路Kernel,將所有報(bào)文處理的工作在用戶(hù)空間完成。

      2 UIO+PMD 減少中斷和CPU上下文切換

      DPDK的UIO驅(qū)動(dòng)屏蔽了硬件發(fā)出中斷,然后在用戶(hù)態(tài)采用主動(dòng)輪詢(xún)的方式,這種模式被稱(chēng)為PMD(Poll Mode Driver)。

      與DPDK相比,pf-ring(no zc)使用的是NAPI polling和應(yīng)用層polling,而pf-ring zc與DPDK類(lèi)似,僅使用應(yīng)用層polling。

      3 HugePages 減少TLB miss

      在操作系統(tǒng)引入MMU(Memory Management Unit)后,CPU讀取內(nèi)存的數(shù)據(jù)需要兩次訪(fǎng)問(wèn)內(nèi)存。第一次要查詢(xún)頁(yè)表將邏輯地址轉(zhuǎn)換為物理地址,然后訪(fǎng)問(wèn)該物理地址讀取數(shù)據(jù)或指令。

      為了減少頁(yè)數(shù)過(guò)多,頁(yè)表過(guò)大而導(dǎo)致的查詢(xún)時(shí)間過(guò)長(zhǎng)的問(wèn)題,便引入了TLB(Translation Lookaside Buffer),可翻譯為地址轉(zhuǎn)換緩沖器。TLB是一個(gè)內(nèi)存管理單元,一般存儲(chǔ)在寄存器中,里面存儲(chǔ)了當(dāng)前最可能被訪(fǎng)問(wèn)到的一小部分頁(yè)表項(xiàng)。

      引入TLB后,CPU會(huì)首先去TLB中尋址,由于TLB存放在寄存器中,且其只包含一小部分頁(yè)表項(xiàng),因此查詢(xún)速度非常快。若TLB中尋址成功(TLB hit),則無(wú)需再去RAM中查詢(xún)頁(yè)表;若TLB中尋址失?。═LB miss),則需要去RAM中查詢(xún)頁(yè)表,查詢(xún)到后,會(huì)將該頁(yè)更新至TLB中。

      而DPDK采用HugePages ,在x86-64下支持2MB、1GB的頁(yè)大小,大大降低了總頁(yè)個(gè)數(shù)和頁(yè)表的大小,從而大大降低TLB miss的幾率,提升CPU尋址性能。

      4 其它優(yōu)化

        SNA(Shared-nothing Architecture),軟件架構(gòu)去中心化,盡量避免全局共享,帶來(lái)全局競(jìng)爭(zhēng),失去橫向擴(kuò)展的能力。NUMA體系下不跨Node遠(yuǎn)程使用內(nèi)存。
        SIMD(Single Instruction Multiple Data),從最早的mmx/sse到最新的avx2,SIMD的能力一直在增強(qiáng)。DPDK采用批量同時(shí)處理多個(gè)包,再用向量編程,一個(gè)周期內(nèi)對(duì)所有包進(jìn)行處理。比如,memcpy就使用SIMD來(lái)提高速度。
        cpu affinity:即 CPU 親和性

        XDP

        xdp代表eXpress數(shù)據(jù)路徑,使用ebpf 做包過(guò)濾,相對(duì)于dpdk將數(shù)據(jù)包直接送到用戶(hù)態(tài),用用戶(hù)態(tài)當(dāng)做快速數(shù)據(jù)處理平面,xdp是在驅(qū)動(dòng)層創(chuàng)建了一個(gè)數(shù)據(jù)快速平面。在數(shù)據(jù)被網(wǎng)卡硬件dma到內(nèi)存,分配skb之前,對(duì)數(shù)據(jù)包進(jìn)行處理。

        請(qǐng)注意,XDP并沒(méi)有對(duì)數(shù)據(jù)包做Kernel bypass,它只是提前做了一點(diǎn)預(yù)檢而已。

        相對(duì)于DPDK,XDP具有以下優(yōu)點(diǎn):

          無(wú)需第三方代碼庫(kù)和許可
          同時(shí)支持輪詢(xún)式和中斷式網(wǎng)絡(luò)
          無(wú)需分配大頁(yè)
          無(wú)需專(zhuān)用的CPU
          無(wú)需定義新的安全網(wǎng)絡(luò)模型

          XDP的使用場(chǎng)景包括:

            DDoS防御
            防火墻
            基于XDP_TX的負(fù)載均衡
            網(wǎng)絡(luò)統(tǒng)計(jì)
            復(fù)雜網(wǎng)絡(luò)采樣
            高速交易平臺(tái)

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

            以上就是Linux經(jīng)典的幾款收包引擎的詳細(xì)內(nèi)容,更多請(qǐng)關(guān)注www.92cms.cn其它相關(guān)文章!

分享到:
標(biāo)簽:Linux 幾款 引擎 經(jīng)典
用戶(hù)無(wú)頭像

網(wǎng)友整理

注冊(cè)時(shí)間:

網(wǎng)站:5 個(gè)   小程序:0 個(gè)  文章:12 篇

  • 51998

    網(wǎng)站

  • 12

    小程序

  • 1030137

    文章

  • 747

    會(huì)員

趕快注冊(cè)賬號(hào),推廣您的網(wǎng)站吧!
最新入駐小程序

數(shù)獨(dú)大挑戰(zhàn)2018-06-03

數(shù)獨(dú)一種數(shù)學(xué)游戲,玩家需要根據(jù)9

答題星2018-06-03

您可以通過(guò)答題星輕松地創(chuàng)建試卷

全階人生考試2018-06-03

各種考試題,題庫(kù),初中,高中,大學(xué)四六

運(yùn)動(dòng)步數(shù)有氧達(dá)人2018-06-03

記錄運(yùn)動(dòng)步數(shù),積累氧氣值。還可偷

每日養(yǎng)生app2018-06-03

每日養(yǎng)生,天天健康

體育訓(xùn)練成績(jī)?cè)u(píng)定2018-06-03

通用課目體育訓(xùn)練成績(jī)?cè)u(píng)定