0
  • 聊天消息
  • 系統(tǒng)消息
  • 評論與回復
登錄后你可以
  • 下載海量資料
  • 學習在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會員中心
創(chuàng)作中心

完善資料讓更多小伙伴認識你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

減少包頭處理開銷最直接的方法:減少數(shù)據(jù)包數(shù)量

Linux閱碼場 ? 來源:Linuxer ? 2020-08-03 16:20 ? 次閱讀

背景

目前,有大量的網(wǎng)絡應用在處理數(shù)據(jù)包的時候只需要處理數(shù)據(jù)包頭,而不會操作數(shù)據(jù)負載部分,例如防火墻、TCP/IP協(xié)議棧和軟件交換機。對這類網(wǎng)絡應用而言, 包頭處理產(chǎn)生的開銷(稱為“per-packet overhead”)占了整體開銷的大部分。因此,如何減少包頭處理開銷是優(yōu)化這類應用性能的關(guān)鍵。

減少包頭處理開銷最直接的方法:減少數(shù)據(jù)包數(shù)量

如何減少包數(shù)量?

增大Maximum Transmission Unit (MTU)。在數(shù)據(jù)量一定的情況下,使用大MTU的數(shù)據(jù)包可攜帶更多數(shù)據(jù),從而減少了包的總量。但MTU值依賴于物理鏈路,我們無法保證數(shù)據(jù)包經(jīng)過的所有鏈路均使用大MTU。

利用網(wǎng)卡特性:Large Receive Offload (LRO),UDP Fragmentation Offload (UFO)和TCP Segmentation Offload (TSO)。如圖1所示,LRO將從物理鏈路收到的TCP包(如1500B)合并為長度更長的TCP包(如64KB);UFO和TSO將上層應用發(fā)送的長數(shù)據(jù)負載的UDP和TCP包(如64KB)拆分成長度更短的數(shù)據(jù)包(如1500B),以滿足物理鏈路的MTU限制。通過在網(wǎng)卡上進行包合并和拆分,在不需要任何CPU開銷的情況下,上層應用就可以處理數(shù)量大大減少的大包。然而,LRO、TSO和UFO通常只能處理TCP和UDP包,而且并非所有的網(wǎng)卡都支持這些特性。

軟件包合并 (Generic Receive Offload,GRO)和包拆分 (Generic Segmentation Offload,GSO)。與前兩種方法相比,GRO和GSO有兩個優(yōu)點:第一,不依賴于物理鏈路和網(wǎng)卡;第二,能夠支持更多的協(xié)議類型,如VxLAN和GRE。

圖1. LRO、UFO和TSO工作原理

為了幫助基于DPDK的應用程序(如Open vSwitch)減少包頭處理開銷,DPDK分別于17.08和17.11支持了GRO和GSO。如圖2所示, GRO和GSO是DPDK中的兩個用戶庫,應用程序直接調(diào)用它們進行包合并和分片。

圖2. DPDK GRO和DPDK GSO

1

GRO庫和GSO庫結(jié)構(gòu)

圖3描繪了GRO庫和GSO庫的結(jié)構(gòu)。根據(jù)數(shù)據(jù)包類型,GRO庫定義了不同的GRO類型。每一種GRO類型負責合并一種類型的數(shù)據(jù)包,如TCP/IPv4 GRO處理TCP/IPv4數(shù)據(jù)包。同樣的,GSO庫也定義了不同的GSO類型。GRO庫和GSO庫分別根據(jù)MBUF的packet_type域和ol_flags域?qū)⑤斎氲臄?shù)據(jù)包交給對應的GRO和GSO類型處理。

圖3. GRO庫和GSO庫的框架

2

如何使用GRO庫和GSO庫?

使用GRO和GSO庫十分簡單。如圖4所示,只需要調(diào)用一個函數(shù)便可以對包進行合并和分片。

圖4. 代碼示例

為了支持不同的用戶場景,GRO庫提供了兩組API:輕量模式API和重量模式API,如圖5所示。輕量模式API應用于需要快速合并少量數(shù)據(jù)包的場景,而重量模式API則用于需要細粒度地控制合包并需要合并大量數(shù)據(jù)包的場景。

圖5. 輕量模式API和重量模式API

3

DPDK GRO的合包算法

算法挑戰(zhàn)

在高速的網(wǎng)絡環(huán)境下,高開銷的合包算法很可能會導致網(wǎng)卡丟包。

包亂序(“Packet Reordering”)增加了合包難度。例如Linux GRO無法合并亂序的數(shù)據(jù)包。

這就要求DPDK GRO的合包算法:

足夠輕量以適應高速的網(wǎng)絡環(huán)境

能夠合并亂序包

基于Key的合包算法

為解決上述兩點挑戰(zhàn),DPDK GRO采用基于Key的合包算法,其流程如圖6所示。對新到的數(shù)據(jù)包,首先按照流(“flow”)對其進行分類,再在其所在的流中尋找相鄰的數(shù)據(jù)包(“neighbor”)進行合并。若無法找到匹配的流,就插入一條新流并將數(shù)據(jù)包存儲到新流中。若無法找到鄰居,則將數(shù)據(jù)包存儲到對應的流中。

基于Key的合包算法有兩個特點。首先,通過流分類來加速數(shù)據(jù)包的合并是十分輕量的一種做法;其次,保存無法合并的數(shù)據(jù)包(如亂序包)使得之后對其進行合并成為可能,故減輕了包亂序?qū)习鼛淼挠绊憽?/p>

圖6. 基于Key的合包算法流程

例如,TCP/IPv4 GRO使用源和目的Ethernet地址、IP地址、TCP端口號以及TCP Acknowledge Number定義流,使用TCP Sequence Number和IP ID決定TCP/IPv4包是否為鄰居。若兩個TCP/IPv4的數(shù)據(jù)包能夠合并,則它們必須屬于同一個流,并且TCP序號和IP ID必須連續(xù)。

4

DPDK GSO的分片策略

分片流程

如圖7所示,將一個數(shù)據(jù)包分片有3個步驟。首先,將包的數(shù)據(jù)負載分成許多長度更小的部分;其次,為每一個數(shù)據(jù)負載部分添加包頭(新形成的數(shù)據(jù)包稱為GSO Segment);最后,為每個GSO segment更新包頭(如TCP Sequence Number)。

圖7. GSO分片流程

GSO Segment的結(jié)構(gòu)

生成一個GSO Segment的最簡單方法就是拷貝包頭和數(shù)據(jù)負載部分。但頻繁的數(shù)據(jù)拷貝會降低GSO性能,因此,DPDK GSO采用了一種基于零拷貝的數(shù)據(jù)結(jié)構(gòu)——Two-part MBUF——來組織GSO Segment。如圖8所示,一個Two-part MBUF由一個Direct MBUF和多個Indirect MBUF組成。Direct MBUF用來存儲包頭,Indirect MBUF則類似于指針,指向數(shù)據(jù)負載部分。利用Two-part MBUF,生成一個GSO Segment僅需拷貝長度較短的包頭,而不需要拷貝較長的數(shù)據(jù)負載部分。

圖8. Two-part MBUF的結(jié)構(gòu)

GRO庫和GSO庫的狀態(tài)

目前,GRO庫還處于一個初期階段,僅對使用最廣泛的TCP/IPv4數(shù)據(jù)包提供了合包支持。GSO庫則支持更豐富的包類型,包括TCP/IPv4、VxLAN和GRE。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場。文章及其配圖僅供工程師學習之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問題,請聯(lián)系本站處理。 舉報投訴
  • cpu
    cpu
    +關(guān)注

    關(guān)注

    68

    文章

    10769

    瀏覽量

    210420
  • 網(wǎng)卡
    +關(guān)注

    關(guān)注

    3

    文章

    298

    瀏覽量

    27294
  • 交換機
    +關(guān)注

    關(guān)注

    20

    文章

    2598

    瀏覽量

    98869

原文標題:怎么提高網(wǎng)絡應用性能?讓DPDK GRO和GSO來幫你!

文章出處:【微信號:LinuxDev,微信公眾號:Linux閱碼場】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。

收藏 人收藏

    評論

    相關(guān)推薦

    華納云:服務器平均響應時間和數(shù)據(jù)包大小之間的影響

    的時間在網(wǎng)絡上傳輸,因此會增加整體的響應時間。 解決方法: 對數(shù)據(jù)進行壓縮(如使用 Gzip 或 Brotli),減少傳輸?shù)?b class='flag-5'>數(shù)據(jù)量。 2.網(wǎng)絡帶寬 影響: 帶寬決定了單位時間內(nèi)可以傳輸
    的頭像 發(fā)表于 10-10 14:01 ?96次閱讀

    請問DCTCP與DCUDP 的登錄數(shù)據(jù)包和心跳數(shù)據(jù)包與服務器端是如何交互的?

    DCTCP與DCUDP的登錄數(shù)據(jù)包和心跳數(shù)據(jù)包與服務器端是如何交互的?
    發(fā)表于 07-25 06:37

    能否在ESP結(jié)束之前通過串行端口停止傳入的UDP數(shù)據(jù)包的傳輸以解析下一個UDP數(shù)據(jù)包?

    丟棄在ESP完成之前不需要的數(shù)據(jù)包,以便通過串行端口發(fā)送它以接收下一個數(shù)據(jù)包, 如果沒有,我必須按順序讀取所有傳入的數(shù)據(jù)包,需要的和不需要的, 而且波特率不足,主機處理
    發(fā)表于 07-16 06:18

    如何直接從phy mac層發(fā)送和接收802.11數(shù)據(jù)包?

    我閱讀了完整的文檔(espressif_iot_esp8266ex_development_kit_v0.9.4.zip),但我沒有找到答案: 是否可以訪問 802.11 數(shù)據(jù)包,并通過應用程序處理它們? 我希望能夠直接從 p
    發(fā)表于 07-15 08:03

    請問如何使用AT CIPSEND或AT CIPSENDBUF發(fā)送多個數(shù)據(jù)包?

    我可以使用 AT CIPSEND 發(fā)送單個數(shù)據(jù)包。但是我必須發(fā)送一系列二進制數(shù)據(jù)包。如何使用AT CISEND或AT CIPSENDBUF發(fā)送多個數(shù)據(jù)包,什么是正確的算法? 到目前為止,我嘗試
    發(fā)表于 07-15 07:37

    如何減少構(gòu)建中的組件數(shù)量?

    large to enter in my module. 由于我的應用程序不需要某些組件,因此我想知道如何減少我的項目中鏈接的組件數(shù)量。
    發(fā)表于 07-09 07:46

    用ESP32-CAM和ESP-WROVER-KIT做局域網(wǎng)視頻傳輸時,如何修改UDP數(shù)據(jù)包最大長度?

    UDP數(shù)據(jù)包包頭可以看出,UDP的最大包長度是2^16-1的個字節(jié)。由于UDP包頭占8個字節(jié),而在IP層進行封裝后的IP包頭占去20字節(jié),所以這個是UDP
    發(fā)表于 06-21 06:09

    在AN65974中短數(shù)據(jù)包和零長數(shù)據(jù)包是什么意思?

    在 AN65974 中,短數(shù)據(jù)包和零長數(shù)據(jù)包是什么意思? 非常感謝!
    發(fā)表于 05-30 07:41

    如何在AIROC GUI上獲取良好數(shù)據(jù)包和總數(shù)據(jù)包

    使用 IQxel-MW LifePoint 作為發(fā)生器并發(fā)送波形BT_1DH5_00001111_Fs80M.iqvsg,但無法在 AIROC 工具中接收數(shù)據(jù)包。 以下是從 IQxel 發(fā)送
    發(fā)表于 05-22 06:39

    請問高端網(wǎng)絡芯片如何處理數(shù)據(jù)包呢?

    隨著網(wǎng)絡芯片帶寬的持續(xù)提升,其內(nèi)部數(shù)據(jù)包處理單元的工作負載也隨之增加。然而,如果處理單元無法與網(wǎng)絡接口的傳入速率相匹配,將無法及時處理數(shù)據(jù)包
    的頭像 發(fā)表于 04-02 16:36 ?511次閱讀
    請問高端網(wǎng)絡芯片如何<b class='flag-5'>處理</b><b class='flag-5'>數(shù)據(jù)包</b>呢?

    STM32H7接收數(shù)據(jù)包異常,一接收的數(shù)據(jù)出現(xiàn)兩發(fā)送的內(nèi)容怎么解決?

    節(jié):be1c0101屬于發(fā)送數(shù)據(jù)包1的; 剩余其他字節(jié):屬于發(fā)送數(shù)據(jù)包2的; 問題困擾很久了,請大家?guī)兔?b class='flag-5'>處理下,急急急!
    發(fā)表于 03-08 08:05

    DPDK在AI驅(qū)動的高效數(shù)據(jù)包處理應用

    傳統(tǒng)的數(shù)據(jù)包處理方式是數(shù)據(jù)包先到內(nèi)核最后再到用戶層進行處理。這種方式會增加額外的延遲和CPU開銷,嚴重影響
    的頭像 發(fā)表于 02-25 11:28 ?793次閱讀
    DPDK在AI驅(qū)動的高效<b class='flag-5'>數(shù)據(jù)包</b><b class='flag-5'>處理</b>應用

    使用P4和Vivado工具簡化數(shù)據(jù)包處理設(shè)計

    電子發(fā)燒友網(wǎng)站提供《使用P4和Vivado工具簡化數(shù)據(jù)包處理設(shè)計.pdf》資料免費下載
    發(fā)表于 01-26 17:49 ?0次下載
    使用P4和Vivado工具簡化<b class='flag-5'>數(shù)據(jù)包</b><b class='flag-5'>處理</b>設(shè)計

    blue-ethernet高性能FPGA網(wǎng)絡數(shù)據(jù)包處理項目簡介

    blue-ethernet項目使用Bluespec SystemVerilog(BSV)硬件描述語言實現(xiàn)了一系列在FPGA上加速網(wǎng)絡數(shù)據(jù)包處理的硬件模塊。
    的頭像 發(fā)表于 11-13 10:44 ?1117次閱讀
    blue-ethernet高性能FPGA網(wǎng)絡<b class='flag-5'>數(shù)據(jù)包</b><b class='flag-5'>處理</b>項目簡介

    Linux場景下數(shù)據(jù)包是如何在協(xié)議層傳輸?shù)?/a>

    數(shù)據(jù) 應用層發(fā)送數(shù)據(jù)的過程大致如下: 我們把上述處理過程的區(qū)域大致分為: User區(qū)域 Kernel 區(qū)域 Device區(qū)域 在user和kernel區(qū)域的任務都是由本機cpu執(zhí)行,這兩個區(qū)域合并稱為host區(qū)域,以區(qū)分devi
    的頭像 發(fā)表于 11-11 11:33 ?1021次閱讀
    Linux場景下<b class='flag-5'>數(shù)據(jù)包</b>是如何在協(xié)議層傳輸?shù)? />    </a>
</div>                </div>            </div><!-- .main-wrap -->
        </article>

        <aside class=

    推薦專欄

    更多