目錄
DPDK-概述
DPDK是什麼
Intel® DPDK全稱Intel Data Plane Development Kit,是intel提供的數據平面開發工具集,爲Intel architecture(IA)處理器架構下用戶空間高效的數據包處理提供庫函數和驅動的支持,它不同於Linux系統以通用性設計爲目的,而是專注於網絡應用中數據包的高性能處理。(主要就是做包轉發)
具體體現在DPDK應用程序是運行在用戶空間上利用自身提供的數據平面庫來收發數據包,繞過了Linux內核協議棧對數據包處理過程。
DPDK: 在IA上做高效包處理
發揮core性能唯一原則: 讓數據更接近於core 接近core的--->就是cache
核心目標:把數據移到cache裏面 (cache容量有限)
現在的cache在20M以上: 大的好處 可以拿出一部分位做包 [英特爾數據直接IO技術(Intel DDIO)]
(包可以不經過內存,所有的操作都在cache中完成)
prefetch系列指令作用: 影響指令快慢一個比較重要的因素--->數據能不能提前ready
最好的情況: 在處理下一條指令時候 下一條指令的數據已經走到cache中
memory: 有多個channel
如何完整利用內存channel的帶寬?
CPU:切換開銷大 壓榨性能: 不切換
UIO: 在用戶態可以做配置
在IA平臺上 所有的設備都是PCIe設備 所以IA上基本只有route port
對於PCIe設備: 配置 怎麼驅動
一個PCIe設備有一串數字(序列)標記這個設備
UIO: 就是把bar的address 通過mmap映射的用戶空間,讓用戶空間可以訪問寄存器
DPDK特點
- 1) 輪詢:在包處理時避免中斷上下文切換的開銷,
- 2) 用戶態驅動:規避不必要的內存拷貝和系統調用,便於快速迭代優化
- 3) 親和性與獨佔:特定任務可以被指定只在某個核上工作,避免線程在不同核間頻繁切換,保證更多的cache命中
- 4) 降低訪存開銷:利用內存大頁HUGEPAGE降低TLB miss,利用內存多通道交錯訪問提高內存訪問有效帶寬
- 5) 軟件調優:cache行對齊,預取數據,多元數據批量操作
DPDK的優劣
優點: 缺點:
- 性能高 無網絡協議棧
- 用戶態開發 開發困難,週期長
- 死後易重啓
DPDK核心技術如下:
- 通過UIO技術將報文拷貝到應用空間處理
- 通過大頁內存,降低cache miss ,提高命中率,進而cpu訪問速度
- 通過CPU親和性,綁定網卡和線程到固定的core,減少cpu任務切換
- 通過無鎖隊列,減少資源競爭
DPDK架構
- EAL(Environment Abstraction Layer)即環境抽象層,爲應用提供了一個通用接口,隱藏了與底層庫與設備打交道的相關細節。EAL實現了DPDK運行的初始化工作,基於大頁表的內存分配,多核親緣性設置,原子和鎖操作,並將PCI設備地址映射到用戶空間,方便應用程序訪問。
- Buffer Manager API通過預先從EAL上分配固定大小的多個內存對象,避免了在運行過程中動態進行內存分配和回收來提高效率,常常用作數據包buffer來使用。
- Queue Manager API以高效的方式實現了無鎖的FIFO環形隊列,適合與一個生產者多個消費者、一個消費者多個生產者模型來避免等待,並且支持批量無鎖的操作。
- Flow Classification API通過Intel SSE基於多元組實現了高效的hash算法,以便快速的將數據包進行分類處理。該API一般用於路由查找過程中的最長前綴匹配中,安全產品中根據Flow五元組來標記不同用戶的場景也可以使用。
- PMD則實現了Intel 1GbE、10GbE和40GbE網卡下基於輪詢收發包的工作模式,大大加速網卡收發包性能。
DPDK框架
- Core Libs: 提供系統抽象、大頁內存、緩存池、定時器及無鎖環等基礎組件
- PMD庫: 提供全用戶態驅動,以便通過輪詢和線程綁定得到極高網絡吞吐,支持各種本地和虛擬網卡。
- Classify庫:支持精確匹配,最長匹配和通配符匹配,提供常用包處理的查表操作。
- Qos庫: 提供網絡服務質量相關組件,限速和調度。
各組件之間依賴關係:
環境適配層EAL
EAL提供的典型服務有:
- DPDK的加載和啓動:DPDK和指定的程序鏈接成一個獨立的進程,並以某種方式加載
- CPU親和性和分配處理:DPDK提供機制將執行單元綁定到特定的核上,就像創建一個執行程序一樣。
- 系統內存分配:EAL實現了不同區域內存的分配,例如爲設備接口提供了物理內存。
- PCI地址抽象:EAL提供了對PCI地址空間的訪問接口
- 跟蹤調試功能:日誌信息,堆棧打印、異常掛起等等。
- 公用功能:提供了標準libc不提供的自旋鎖、原子計數器等。
- CPU特徵辨識:用於決定CPU運行時的一些特殊功能,決定當前CPU支持的特性,以便編譯對應的二進制文件。
- 中斷處理:提供接口用於向中斷註冊/解註冊回掉函數。
- 告警功能:提供接口用於設置/取消指定時間環境下運行的毀掉函數。
初始化和運行
核心組件
- 環形緩衝區管理(librte_ring):Ring數據結構提供了一個無鎖的多生產者,多消費者的FIFO表處理接口。
- 內存池管理(librte_mempool):內存池管理的主要職責就是在內存中分配指定數目對象的POOL。
- 網絡報文緩衝區管理(librte_mbuf):提供了創建、釋放報文緩存能力,DPDK程序中可能使用這些報文緩存來存儲消息
- 定時器管理(librte_timer) :這個庫位DPDK執行單元提供了定時服務,爲函數異步執行提供支持
以太網輪詢驅動架構PMD
DPDK的PMD驅動支持1G、10G、40G。 同時DPDK提供了虛擬的以太網控制器,被設計成非異步,基於中斷的模式
報文轉發算法支持
DPDK提供了哈希(librte_hash)、最長前綴匹配的(librte_lpm)算法庫用於支持包轉發。 詳細內容查看 Hash Library 和 LPM Library 。
網絡協議庫(librte_net)
這個庫提供了IP協議的一些定義,以及一些常用的宏。 這些定義都基於FreeBSD IP協議棧的代碼,並且包含相關的協議號,IP相關宏定義,IPV4和IPV6頭部結構等等。