dpdk基本概述

from: http://blog.csdn.net/zhaoxinfan/article/details/78408945

1、DPDK特點

DPDK全稱爲Date planedevelopment kit,是一個用來進行包數據處理加速的軟件庫。與傳統的數據包處理相比,DPDK具有以下特點:

1)        輪詢:在包處理時避免中斷上下文切換的開銷,

2)        用戶態驅動:規避不必要的內存拷貝和系統調用,便於快速迭代優化

3)        親和性與獨佔:特定任務可以被指定只在某個核上工作,避免線程在不同核間頻繁切換,保證更多的cache命中

4)        降低訪存開銷:利用內存大頁HUGEPAGE降低TLB miss,利用內存多通道交錯訪問提高內存訪問有效帶寬

5)        軟件調優:cache行對齊,預取數據,多元數據批量操作

2、DPDK框架

圖1 DPDK框圖

在上圖中,核心庫Core Libs提供系統抽象、大頁內存、緩存池、定時器及無鎖環等基礎組件。

PMD庫,提供全用戶態驅動,以便通過輪詢和線程綁定得到極高網絡吞吐,支持各種本地和虛擬網卡。

Classify庫,支持精確匹配,最長匹配和通配符匹配,提供常用包處理的查表操作。

Qos庫,提供網絡服務質量相關組件,限速和調度。

Mellanox DPDK中保留了Linux內核態驅動,框圖如下:


圖2 MellanoxDPDK框圖

Mellanox DPDK在用戶空間使用PMD驅動,與網卡之間有兩條路徑,控制路徑使用user verbs,經過內核,用於對象的創建、初始化、修改、查詢和釋放。數據路徑之間訪問網卡,進行數據的收發。

Mellanox DPDK與傳統的Linux內核態驅動可以共存,當前未被DPDK使用的端口可以通過Linux網絡協議棧進行報文收發。


圖3 MellanoxDPDK與傳統內核態驅動

3、Hugepage配置

DPDK中,如果有多個核可能需要同時訪問一個網卡,那DPDK中會爲每個覈准備一個單獨的接收隊列/發送隊列,這樣避免了競爭,也避免了cache一致性問題。

一般的常規頁大小爲4K字節,使用大頁時頁大小設置爲2M或1G字節。修改方式如下:

Bashrc文件內添加:

非NUMA系統

Echo 1024> /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages

預留了1024個2M大頁,即2GB內存。

 

NUMA系統

Echo 1024>/sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages

Echo 1024>/sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages

上述命令爲每個節點各預留了1024個2M大頁,即4GB內存。

/etc/fstab內添加

掛載2M大頁:Nodev /mnt/huge hugetlbfs defaults 0 0

掛載1G大頁:Nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0

 

4、多線程配置

DPDK線程基於pthread接口創建,屬於搶佔式線程模型,受內核調度支配。通過在多核設備上創建多個線程,每個線程綁定到單獨的核上,減少線程調度的開銷,以提高性能。控制線程一般綁定到MASTER核上,接受用戶配置,並傳遞配置參數給數據線程等;數據線程分佈在不同核上處理數據包。

DPDK中初始化及執行任務分發示例如下圖所示:


圖4 lcore初始化及執行任務分發

上圖中一共使用了三個cpu核,master core負責進行任務初始化和分發,兩個lcore執行任務。

5、轉發模型

DPDK轉發框架分爲run tocompletion模型和pipeline模型,對比圖如下:


圖5 DPDK轉發模型對比

DPDK run to completion模型中每個報文的生命週期只能在一個線程中出現,每個物理核都負責處理整個報文的生命週期從RX到TX。

DPDK pipeline模型中不同的工作交給不同的模塊,每一個模塊只單獨處理特定的事務,各模塊之間有輸入輸出,通過這些輸入輸出連接起來,完成複雜的網絡功能。

6、內存管理

DPDK將內存封裝在Mbuf結構體內,Mbuf主要用來封裝網絡幀緩存,所有的應用使用Mbuf結構來傳輸網絡幀。對網絡幀封裝和處理時,將網絡幀元數據和幀本身存放在固定大小的同一段緩存中,網絡幀元數據的一部分內容由DPDK的網卡驅動寫入,結構如下圖:


圖6 單幀Mbuf結構

上圖中,head room用來存儲和系統中其他實體交互的信息,如控制信息、幀內容、事件等。Head room長度由RTE_PKTMBUF_HEADROOM定義,默認爲128.

Rte_mbuf結構對象存放在內存池中,內存池使用環形緩存區來保存空閒對象,邏輯結構如下圖所示:


圖7 內存池雙環形緩存區結構

當一個網絡幀被網卡接收時,DPDK網卡驅動將其存儲在一個高效的環形緩衝區中,同時Mbuf的環形緩存區中創建了一個Mbuf對象。Mbuf對象被創建好後,網卡驅動根據分析出的幀信息將其初始化,並將其和實際幀對象邏輯相連,對網絡幀的分析處理都集中在Mbuf,僅在必要的時候訪問實際網絡幀。

7、性能優化

1、收發包流程概述

DPDK中普遍採用純輪詢模式進行數據包收發,所有的收發包有關的中斷在物理端口初始化的時候都會關閉。物理端口上的每一個收包隊列,都會有一個對應的由收包描述符組成的軟件隊列來進行硬件和軟件的交互。

DPDK驅動程序負責初始化好每一個收包描述符,其中包含把包緩衝內存塊的物理地址填充到收包描述符對應的位置,並把對應的收包成功標誌復位,通知網卡硬件把收到的包進行填充。網卡硬件將收到的包一一填充到對應的收包描述符表示的緩衝內存塊中,將必要信息填充到收包描述符內,標記好收包成功標誌。若一個緩衝區內存塊大小不夠存放一個完整數據包時,可能需要多個收包描述符來處理一個包。

針對每一個收包隊列,DPDK都會有一個對應的軟件線程負責輪詢其中的收包描述符收包成功的標誌位。當發現一個收包描述符的收包成功標誌被硬件置位了,意味着有包進入網卡並且已經存儲到描述符對應的緩衝區內存塊中。驅動程序將解析相應的收包描述符,填充對應緩衝內存塊頭部,將收包緩衝內存塊存放到收包函數提供的數組中,同時分配好一個新的緩衝內存塊給這個描述符,以便下一次收包。

針對每一個發包隊列,DPDK都有一個對應的軟件線程負責設置需要發送出去的包,DPDK驅動程序負責提取發包緩衝內存塊的有效信息,根據內存緩存塊中包的內容來負責初始化好每一個發包描述符,驅動程序將每個包翻譯爲一個或者多個發包描述符內能夠理解的內容,寫入發包描述符。當驅動程序設置好相應的發包描述符,硬件就開始依據發包描述符內容來發包,驅動程序通過獲取發包描述符內的RS發送狀態位來決定發包是否結束以及對發包描述符和內存緩衝塊進行回收。發包輪詢就是輪詢發包結束的硬件標誌位,DPDK驅動程序會在發包線程內不斷查詢發包是否結束,網卡根據RS以寫回方式通知發包結束。

2、Burst收發包

Burst爲一次完成多個數據包的收發,通過把收發包複雜的處理過程進行分解,打散成不同的相對較小的處理階段,把相鄰數據訪問、相似的數據運算集中處理,儘可能減少對內存或者低一級的處理器緩存的訪問次數。網卡收發包描述符一般爲16字節或32字節,處理器緩存基本單位爲64字節,可以存放2個或4個描述符,處理器預期機制會每次存取相鄰多個緩存,若一次處理4個緩存單元,則可以更新16個描述符,Burst就可以設置爲16.目前常用的Burst爲32.

3、平臺優化配置

硬件:

PCIe Gen3 x 8,x16.

網卡多隊列收發包,支持收包RSS時分發進多個隊列。

軟件:

關閉CPU以及設備的省電模式;

讓內存運行在所支持的最高頻率上;

內核初始化時設置好大頁;

增加內核啓動參數,預先指定DPDK使用的邏輯核,不被操作系統調度;

DPDK參數配置:

         收包隊列長度,即每個收包隊列分配的收包描述符個數,反映了在軟件驅動程序讀取所收到包之前最大的緩存包的能力。太長佔用資源,太短容易丟包,默認長度爲128.

         發包隊列長度,即每個發包隊列分配的發包描述符個數,默認長度爲512.

         收包隊列可釋放描述符數量閾值,DPDK驅動程序並沒有每次收包都更新收包隊列尾部索引寄存器,而是在可釋放的收包描述符數量達到一個閾值時更新,設置合理,可以減少沒有必要的過多收包隊列尾部索引寄存器的訪問。默認值爲32.

         發包隊列可釋放描述符數量閾值,通過將回寫標記設置在一定間隔的發包描述符上,減少不必要的回寫次數,改善性能,默認爲32.

         發包描述符釋放閾值,當用來重新配置的發包描述符數量少於閾值時,纔會啓動描述符和Mbuf釋放動作,設置太大釋放頻繁,影響性能,設置太小可用描述符少,容易丟包,默認值爲32.

4、多隊列配置

DPDK中,通過將網卡的某個接收隊列分配給某個核,從該隊列中收到的所有報文都應當在該指定的核上處理結束,不同的核操作不同的隊列。

目前可以通過RSS(接收方擴展)把數據包分配到不同的隊列中,該機制根據關鍵字通過哈希函數計算出哈希值,再有哈希值確定隊列。不同的數據包類型具有不同的關鍵字,例如IPv4 UDP四元組(源IP地址、目的IP地址、源端口號、目的端口號)。

另一種是Flow Director技術,根據包的字段精確匹配,查找Flow Director表項,將其分配到某個特定隊列。

DPDK中可以採用RSS來負載均衡,將報文發到多個核上,同時使用Flow Director將控制報文分配到指定的隊列上,使用單獨的核來處理,如下圖所示;


圖8 DPDK中RSS和FDIR的應用

5、硬件加速功能

VLAN Tag的插入和剝離由網卡硬件完成。

1)收包時VLAN tag過濾,網卡硬件端口設計了VLAN過濾表,無法在過濾表中匹配的VLAN包會被丟棄。

2)收包時VLAN tag剝離,網卡硬件會在硬件描述符中設置兩個域,將需要的信息通知驅動軟件,包含此包是否曾被剝離了VLAN tag以及被剝離的tag。

3)發包時VLAN tag插入,TPID值固定,可通過寄存器進行設置,TCL進行逐包設置。

TCP分片功能由硬件提供,將現有較大的TCP分片拆分爲較小的TCP分片,僅需要複製TCP的包頭,更新頭裏面的長度相關信息,重新計算校驗和。

RSC組包功能針對TCP數據包,由硬件將拆分的TCP分片聚合成一個大的分片,從而減輕軟件的處理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章