一、版本的選擇
首先要說明的是,對於生產來說DPDK版本不是越高越好,如何選擇合適的版本?
1、要選擇長期支持的版本LTS(Long Term Support)
2、根據當前開發的系統環境選擇
可以在以下文檔里從高至低查看不同版本的System Requirements章節,它對kernel、glibc等限制有詳細說明。
http://core.dpdk.org/doc/archives/
我開發是在CentOS7.3 64位,最后選用dpdk-18.11版本。如果你的軟件需要同時在不同系統運行,選對版本后續能省不少事。
二、虛擬機配置要求
我使用vmware虛擬機,調研了幾款虛擬機發現在windows下只能vmware能模擬出多隊列的網卡,如果有發現其他虛擬機能模擬請給我留言。
1、核心:我配置4個。至少有2個以上核心,方便后續程序做線程孤立和綁定。
2、內存:我一般配置3G,為了配置hugepage,多分點比較好。可根據實際情況配置。
3、網卡:需要支持dpdk,我選擇vmnet3,它支持多隊列。端口至少2個以上,且要求驅動為dpdk支持的,
三、dpdk的安裝
1、下載源碼
http://fast.dpdk.org/rel/dpdk-18.11.7.tar.xz
2、設置環境變量(18.11版本不需要)
舊版本安裝時需要在dpdk根目錄執行t以下命令,如果重新登錄需要再執行一次,18.11版本不需要,安裝腳本里寫好了,這里只是記錄以下。
64位系統:
export RTE_SDK=`pwd`
export RTE_TARGET=x86_64-native-linuxapp-gcc
32位系統:
export RTE_SDK=`pwd`
export RTE_TARGET=i686-default-linuxapp-gcc
3、利用setup.sh進行配置
cd dpdk-stable-18.11.7/usertools
source ./dpdk-setup.sh
1)編譯dpdk
編譯完提示以下信息:查資料顯示沒有指定安裝路徑,我們只是編譯而不是install就不用理會。
2)插入IGB UIO模塊
3)設置大頁內存
默認設置的是2M的大頁內存,這里輸入1024,表示申請2G的大頁內存。由於虛擬機里只有一個node,這里只需要設置node0
查看配置的大頁內存
4)查看網卡/加解密設備信息,這里我們只有網卡信息
若報以下錯誤,是因為沒有安裝lspci導致,安裝解決:yum install pciutils -y
Traceback (mostrecent call last): File"/root/dpdk-16.07/tools/dpdk-devbind.py", line 576, in <module> main() File"/root/dpdk-16.07/tools/dpdk-devbind.py", line 572, in main get_nic_details() File"/root/dpdk-16.07/tools/dpdk-devbind.py", line 248, inget_nic_details dev_lines =check_output(["lspci", "-Dvmmn"]).splitlines() File"/root/dpdk-16.07/tools/dpdk-devbind.py", line 125, in check_output stderr=stderr).communicate()[0] File "/usr/lib64/python2.7/ subprocess.py", line 711, in__init__ errread, errwrite) File"/usr/lib64/python2.7/subprocess.py", line 1327, in _execute_child raise child_exception OSError: [Errno 2]No such file or directory
5)綁定設備
輸入pci的地址, 輸入0000冒號后面的幾位輸入就行了,這里將03:00.0和0b:00.0綁定。但我遇到過需要完整輸入才能綁定的情況,如果綁定失敗就都試試。
注:綁定的時候可以能有個錯誤的提示如下;
因為是你當前的對應的網卡端口處於up狀態,所以你要執行ifconfig xxx down命令將其關閉,關閉后再重新執行一下上面的綁定操作。注意為了跑測試用例至少要綁定兩個端口
再次查看,發現已經綁定到dpdk驅動了。
6)運行testpmd測試程序
輸入0xf代表程序運行在0~3核心
如果提示以下錯誤,是因為大頁內存分配不夠,嘗試分配多一些再試,若還不行重啟虛擬機再試試。
testpmd: create a new mbuf pool <mbuf_pool_socket_0>: n=171456, size=2176, socket=0 testpmd: preferred mempool ops selected: ring_mp_mc EAL: Error - exiting with code: 1 Cause: Creation of mbuf pool for socket 0 failed: Cannot allocate memory
start開始抓包, 用發包工具對網卡發包(我在windows下使用xcap對虛網卡發包)
stop停止抓包,並查看收發情況
這說明dpdk收到了1000個包,同時轉發出去了1000個包,已正常運行。