當年在某公司實習的時候,當時老大給了我一份DPDK的文檔,說是將來很有用,熟悉DPDK對能力提高也有幫助,就試着翻譯了
《Intel DPDK Getting Started Guide》和半個《Intel DPDK Programmers Guide》,后來忙着論文就沒再搞了。現在,發現
pf_ring的統計虛高了,只好重新擁抱DPDK了。
DPDK的代碼量還是很龐大的,分析代碼之前理清庫里面的各個部分的關系很有必要,下面的一張圖很好的表現了各部分關系。
先介紹DPDK中的幾個縮寫吧:
RTE:Run-Time Environment
EAL:Environment Abstraction Layer
PMD: Poll-Mode Driver
Memory Manager (librte_malloc,內存管理器)
Librte_malloc 庫提供一組API,用於從hugepages創建的memzones中分配內存而不是在堆中分配。這有助於改善Linux用戶空間環境下典型的從堆中大量分配4KB頁面而容易引起TLB不命中。
Memory Pool Manager (librte_mempool,內存池管理器)
內存池管理器負責分配的內存中的pool對象。一個pool由名稱標識,並使用一個ring來存儲空閑對象。它提供了其他一些可選的服務,例如每個core的對象緩存和對齊方式幫助器,以確保將填充的對象在所有內存通道上均勻分布。
Ring Manager (librte_ring,環形隊列管理器)
在一個有限大小的表中,ring結構提供了一個無鎖的多生產者多消費者的FIFO API。相較於無鎖隊列,它有一些的優勢 ;更容易實現,適應於大容量操作和速度更快。一個ring用在內存池管理器(librte_mempool),也可用作cores和(或)在一個邏輯core之上的連接在一起的執行塊的通用溝通機制。
Network Packet Buffer Management (librte_mbuf,網絡報文緩沖管理)
mbuf 庫提供了創建和銷毀緩沖區,英特爾 ® DPDK 應用程序可能用來存儲消息緩沖。創建消息緩沖區在啟動時間和存儲在 mempool,並使用英特爾 ® DPDK mempool 庫。
此庫提供一組 API,用於分配或釋放 mbufs,操縱控制消息緩沖區(ctrlmbuf) ——普通的消息緩沖區,還操作數據包緩沖區 (pktmbuf) ——用來進行網絡數據包。
Timer Manager (librte_timer,定時器管理)
timer庫向英特爾 ® DPDK 執行單位提供定時器服務,保證以異步方式執行函數的能力。它可以是定期調用,或只是一次性調用。它使用環境抽象層 (EAL) 提供的到的 HPET 接口來獲取精確時間的引用,並根據需求在每個核心啟動。
上面的介紹有點抽象,還是直接看代碼的目錄更具體些。
接下來講講DPDK的特點。