DPDK基本技術一

2021-08-13 19:26:28 字數 2900 閱讀 1873

uio指的是執行在使用者空間的i/o技術,是實現使用者空間下驅動程式的支撐機制。

linux系統中一般的驅動裝置都是執行在核心空間,而在使用者空間用應用程式呼叫即可,而uio則是將驅動的很少一部分執行在核心空間,而在使用者空間實現驅動的絕大多數功能。使用uio可以避免裝置的驅動程式需要隨著核心的更新而更新的問題。

由於dpdk是應用層平台,所以與此緊密相連的網絡卡驅動程式(主要是intel自身的千兆igb與萬兆ixgbe驅動程式)都通過uio機制執行在使用者態下。 intel® dpdk 的igb_uio核心模組依賴於核心的uio,需要以模組方式編譯,可以通過如下命令進行編譯:

sudo /sbin/modprobe uio
大頁記憶體是為包處理的緩衝區緩衝區分配更大的大記憶體池,利用大記憶體頁的主要好處當然是通過利用大記憶體頁提高記憶體使用效率。可以得到明顯的效能提高,因為需要更少的頁,更少的tlb( translation lookaside buffers),減少了虛擬頁位址到物理頁位址的轉換時間。如果不使用大記憶體頁機制的話,tlb的命中率會降低,反而會降低效能。

大記憶體頁最好在啟動的時候進行分配,這樣可以避免物理空間中有太多的碎片,提高發包的效率。普通的頁大小為4kb, 預設的大記憶體頁的大小為2mb,也可以設定其他的大記憶體頁大小,可以從cpu的標識中看出支援哪種大記憶體頁。如果有 「pse」的標識,說明支援2m的大記憶體頁。 如果有「pdpe1gb」的標識,說明支援1g的大記憶體頁。 如果64位機建議使用1gb的大頁。

比如如果想設定乙個4g的大記憶體頁,而且這個大記憶體頁由4個1g大小的頁構成,可以把如下配置傳遞給核心:

default_hugepagesz=1g hugepagesz=1g hugepages=4
但是如果使用大量的大記憶體頁的話,最好增加當前登入會話開啟檔案限制,以減少執行dpdk程式時發生的錯誤。可以使用ulimit的命令,比如:

ulimit -sn 2048

在兩插槽(物理處理器封裝個數sockets)的numa系統中, 大記憶體頁會在兩個插槽的cpu中進行平均分配。

對於2mb的大記憶體頁的情況,也可以在系統啟動以後再進行大記憶體頁的分配。在non-numa系統, 使用命令

echo 1024 > /sys/kernel

/mm/hugepages

/hugepage2048kb/nr_hugepages

對於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

對於1g的大記憶體頁,不能在系統啟動以後進行分配。

系統中分配的大記憶體頁:

使用大記憶體頁:

如果已經配置好了大記憶體頁機制,就可以讓dpdk利用大記憶體頁的機制了。可以輸入如下的命令:

mkdir /mnt/huge

mount -t hugetlbfs nodev /mnt/huge

在執行程式 的時候,最好把分配給大頁的所有空間都利用起來。如果dpdk的程式在執行的時候傳遞了-m或者--socket-mem的引數,大記憶體頁的分配在啟動的時候會自動載入。

如果傳遞給程式的記憶體頁數量比程式要求的要少,也就是記憶體頁不夠用,程式將會中止。但是,如果使用者要求的記憶體空間小於預留的記憶體空間時,同樣有可能出現程式崩潰的情況。原因如下:

假設系統為socket1 和socket 0 各預留了1024個大記憶體頁。

如果使用者需要128m的記憶體,也就是64個大記憶體頁,但是這64個大頁可能有以下的限制:

socket-mem這個選項是用來為每個cpu的socket分配特定的記憶體大小的。比如–socket-mem=0,512,其中0是表示給socket 0 分配0mb , 512表示給socket 1分配512mb記憶體大小。同理對擁有4個socket的系統,如果要給socket 0 ,2都分配1gb的記憶體大小,可以使用下面的選項配置:--socket-mem=1024,0,1024

tlb(translation lookaside buffer)指的是旁路轉換緩衝,或稱為頁表緩衝,是乙個存放著頁表快取(虛擬位址到實體地址的轉換表)的記憶體管理單元,用於改進虛擬位址到實體地址轉換速度。

x86體系的系統記憶體裡存放了兩級頁表,第一級頁表稱為頁目錄,第二級稱為頁表。由於「頁表」儲存在主儲存器中,查詢頁表所付出的代價很大,由此產生了tlb。

tlb是記憶體裡存放的頁表的快取,那麼它裡邊存放的資料實際上和記憶體頁表區的資料是一致的,在記憶體的頁表區里,每一條記錄虛擬頁面和物理頁框對應關係的記錄稱之為乙個頁表條目(entry),同樣地,在tlb裡邊也快取了同樣大小的頁表條目(entry)。

1:tlb在x86體系的cpu裡的實際應用最早是從intel的486cpu開始的,在x86體系的cpu裡邊,一般都設有如下4組tlb:

2:tlb命中和tlb失敗

當cpu收到應用程式發來的虛擬位址後:首先到tlb中查詢相應的頁表資料,如果tlb中正好存放著所需的頁表,則稱為tlb命中(tlb hit); 接下來cpu再依次看tlb中頁表所對應的物理記憶體位址中的資料是不是已經在一級、二級快取裡了,若沒有則到記憶體中取相應位址所存放的資料。

DPDK系列(一) 簡介

資料平面開發套件,說白了就是做資料通訊的sdk。以前傳統的資料平面實現主要是以一下幾種形態出現 1 早期linux核心 使用linux核心協議棧實現二三層 使用netfiter來實現報文過濾 2 使用網路處理器 網路加速器,把二三層的表通過微指令的的方式寫入到硬體的記憶體中,用硬體實現 3 使用多個...

dpdk中文 mbuf的基本操作

mbuf是報文中的描素的結構體,是整個 過程中最核心的資料結構之一。主要針對於mbuf的常用api與基本原理做乙個簡單的介紹 首先我們看一下rte mbuf的資料結構的定義 先主要說明幾個跟資料有關的變數 struct rte mbuf 既然叫mbuf,其實就是一種buf管理的結構體 如上圖所示 m...

DPDK 資料報捕獲基本流程(十六)

核心元件架構 啟動抓包程式之前,首先要利用dpdk sdk中dpdk埠檢視和繫結工具pci unbind進行抓包埠繫結。然後,申請huge頁並掛載huge分割槽。應用dpdk進行資料報捕獲時,主要利用rte eal init init port 和init mbuf pools 進行引數 埠及記憶體...