1.DPDK 簡介
DPDK(Data Plane Development Kit)是數(shù)據(jù)平面開發(fā)工具包,由用于加速在各種CPU架構(gòu)上運行的數(shù)據(jù)包處理的庫組成。
DPDK需要一定的網(wǎng)卡硬件支持,以Intel為例,支持以下網(wǎng)卡:
e1000 (82540, 82545, 82546)
e1000e (82571, 82572, 82573, 82574, 82583, ICH8, ICH9, ICH10, PCH, PCH2, I217, I218, I219)
igb (82575, 82576, 82580, I210, I211, I350, I354, DH89xx)
ixgbe (82598, 82599, X520, X540, X550)
i40e (X710, XL710, X722, XXV710)
ice (E810)
fm10k (FM10420)
ipn3ke (PAC N3000)
ifc (IFC)
完整的網(wǎng)卡支持列表可在官網(wǎng)查詢:
http://core.dpdk.org/supported/
在Linux上部署DPDK有兩種方式,一種是通過命令行依次進行配置,編譯,驅(qū)動加載等;另一種是通過DPDK的腳本進行快捷配置和編譯。
通過命令行的方式部署,可配置項更多,可以獲得更佳的性能,對DPDK的工作環(huán)境也能有更好的熟悉;通過腳本方式部署步驟較少,較簡單。
通過命令行部署的教程請移步:
在Linux(CentOS)上部署DPDK------命令行方式
2.DPDK 環(huán)境
該章節(jié)的內(nèi)容參照自官網(wǎng)的DPDK System Requirements。
2.1 編譯所需的工具和庫
- GNU:
make。 - coreutils:
cmp,sed,grep,arch, etc. - gcc: versions 4.9 或更新版本。
- libc headers, 即
glibc-devel.x86_64(以64位數(shù)Intel平臺為例)。 - Linux kernel headers or sources required to build kernel modules. (
kernel - devel.x86_64;kernel - devel.ppc64) - 若需要在64位操作系統(tǒng)上編譯32位軟件,還需要以下工具:
-
glibc.i686,libgcc.i686,libstdc++.i686andglibc-devel.i686for Intel i686/x86_64; -
glibc.ppc64,libgcc.ppc64,libstdc++.ppc64andglibc-devel.ppc64for IBM ppc_64;
-
這里需要注意的是kernel-devel的版本要匹配內(nèi)核的版本,可以通過uname -r查看內(nèi)核版本號,并通過yum info kernel-devel查看已安裝或支持的kernel-devel版本號。這里查看到我的centos已經(jīng)預裝了kernel-devel,版本與kernel版本一致:
uname -r
3.10.0-862.el7.x86_64
yum info kernel-devel
已安裝的軟件包
名稱 :kernel-devel
架構(gòu) :x86_64
版本 :3.10.0
發(fā)布 :862.el7
大小 :37 M
源 :installed
kernel頭文件的路徑位于/usr/lib/modules/$kernel-version/kernel
2.2 運行環(huán)境
- Kernel version >= 3.16
- glibc >= 2.7 (for features related to cpuset)
- Kernel configuration,centos提供的配置可運行大多數(shù)DPDK應用。
3.DPDK 腳本部署
該章節(jié)的內(nèi)容參照自官網(wǎng)的腳本快速部署
3.1 下載DPDK代碼
可從官網(wǎng)下載最新的穩(wěn)定版或開發(fā)版的DPDK代碼DPDK代碼下載。
然后解壓縮:
tar xJf dpdk-<version>.tar.xz
cd dpdk-<version>
其中DPDK的代碼包含如下部分:
- lib: Source code of DPDK libraries
- drivers: Source code of DPDK poll-mode drivers
- app: Source code of DPDK applications (automatic tests)
- examples: Source code of DPDK application examples
- config, buildtools, mk: Framework-related makefiles, scripts and configuration
其中在usertools路徑下可以找到dpdk-setup.sh腳本,這個腳本可以運行下面這些功能:
- 編譯DPDK庫
- 加載或移除DPDK IGB_UIO kernel module
- 加載或移除VFIO kernel module
- 加載或移除DPDK KNI kernel module
- 對NUMA會非NUMA系統(tǒng)均支持創(chuàng)建或刪除hugepages
- 查看當前網(wǎng)口狀態(tài),以及預留端口給DPDK使用
- 對于非root用戶,設置VFIO驅(qū)動的權(quán)限
- 運行test和testpmd應用
- 在meminfo中查看hugepages信息
- 在/mnt/huge中列出hugepages信息
- 移除編譯的DPDK庫
3.2 配置腳本的組成
dpdk-setup.sh腳本在邏輯上組成一系列步驟。每個步驟都提供了許多選項,可指導用戶完成所需任務。以下是每個步驟的簡要概述。
第1步:構(gòu)建DPDK庫
最初,用戶必須選擇DPDK target,以便正確配置target類型和編譯選項,隨后DPDK會根據(jù)選擇的target和編譯環(huán)境進行編譯。
第一步可選的target和編譯選項類型如下:
----------------------------------------------------------
Step 1: Select the DPDK environment to build
----------------------------------------------------------
[1] arm64-armv8a-linuxapp-clang
[2] arm64-armv8a-linuxapp-gcc
[3] arm64-dpaa2-linuxapp-gcc
[4] arm64-dpaa-linuxapp-gcc
[5] arm64-stingray-linuxapp-gcc
[6] arm64-thunderx-linuxapp-gcc
[7] arm64-xgene1-linuxapp-gcc
[8] arm-armv7a-linuxapp-gcc
[9] i686-native-linuxapp-gcc
[10] i686-native-linuxapp-icc
[11] ppc_64-power8-linuxapp-gcc
[12] x86_64-native-bsdapp-clang
[13] x86_64-native-bsdapp-gcc
[14] x86_64-native-linuxapp-clang
[15] x86_64-native-linuxapp-gcc
[16] x86_64-native-linuxapp-icc
[17] x86_x32-native-linuxapp-gcc
第2步:設置環(huán)境
這個步驟需要配置Linux的環(huán)境以支持DPDK應用程序的運行。需要配置的環(huán)境有兩項,分別是:
- Hugepages配置
- DPDK kernel module配置(網(wǎng)卡驅(qū)動配置)
可以為NUMA或非NUMA系統(tǒng)設置Hugepages,但是僅支持默認的2MB大小的hugepage size。若想設置更大的單頁,需要自己配置,可以參考:用命令行方式部署DPDK。
還可以在此步驟中插入所需的DPDK內(nèi)核模塊,并且可以將網(wǎng)絡端口綁定到此模塊以供DPDK應用程序使用。
----------------------------------------------------------
Step 2: Setup linuxapp environment
----------------------------------------------------------
[18] Insert IGB UIO module
[19] Insert VFIO module
[20] Insert KNI module
[21] Setup hugepage mappings for non-NUMA systems
[22] Setup hugepage mappings for NUMA systems
[23] Display current Ethernet/Crypto device settings
[24] Bind Ethernet/Crypto device to IGB UIO module
[25] Bind Ethernet/Crypto device to VFIO module
[26] Setup VFIO permissions
第3步:運行應用程序
上述步驟完成后,用戶就可以運行測試應用程序。測試應用程序允許用戶為DPDK運行一系列功能測試。支持接收和發(fā)送數(shù)據(jù)包的testpmd應用也可以運行。
----------------------------------------------------------
Step 3: Run test application for linuxapp environment
----------------------------------------------------------
[27] Run test application ($RTE_TARGET/app/test)
[28] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
第4步:檢查系統(tǒng)
此步驟提供了一些用于檢查hugepage映射狀態(tài)的工具。
----------------------------------------------------------
Step 4: Other tools
----------------------------------------------------------
[29] List hugepage info from /proc/meminfo
第5步:系統(tǒng)清理
最后一步有將系統(tǒng)恢復到原始狀態(tài)的一些選項。
----------------------------------------------------------
Step 5: Uninstall and system cleanup
----------------------------------------------------------
[30] Unbind devices from IGB UIO or VFIO driver
[31] Remove IGB UIO module
[32] Remove VFIO module
[33] Remove KNI module
[34] Remove hugepage mappings
3.3 配置腳本運行示例
dpdk-setup.sh需要用root權(quán)限來運行。
source usertools/dpdk-setup.sh
第一步選擇編譯的target和編譯選項,在x86架構(gòu)的cpu上運行64位的centos,并使用gcc編譯,可以選擇[15] x86_64-native-linuxapp-gcc。
Option: 15
Configuration done using x86_64-native-linuxapp-gcc
== Build lib
== Build lib/librte_compat
== Build lib/librte_kvargs
......
== Build app/test-eventdev
Build complete [x86_64-native-linuxapp-gcc]
Installation cannot run with T defined and DESTDIR undefined
------------------------------------------------------------------------------
RTE_TARGET exported as x86_64-native-linuxapp-gcc
------------------------------------------------------------------------------
Press enter to continue ...
第二步配置hugepages,在NUMA系統(tǒng)中,選擇[22] Setup hugepage mappings for NUMA systems。然后輸入hugepages的頁數(shù),例如每個NUMA node需要128MB的hugepages,且系統(tǒng)默認的每頁huge page的大小是2M,則輸入頁數(shù)為64。
隨后需要加載DPDK的kernel module(網(wǎng)卡驅(qū)動),可以選擇IGB UIO 或者VFIO,分別對應[18] Insert IGB UIO module和[19] Insert VFIO module,也可以都加載,在綁定時選擇特定的kernel module。
Option: 18
Unloading any existing DPDK UIO module
Loading DPDK UIO module
可以通過[24] Bind Ethernet/Crypto device to IGB UIO module將網(wǎng)卡綁定IGB UIO的驅(qū)動:
Option: 24
Network devices using kernel driver
===================================
0000:03:00.0 'I210 Gigabit Network Connection 1533' if=enp3s0 drv=igb unused=igb_uio *Active*
0000:04:00.0 'I210 Gigabit Network Connection 1533' if=enp4s0 drv=igb unused=igb_uio *Active*
0000:05:00.0 'I210 Gigabit Network Connection 1533' if=enp5s0 drv=igb unused=igb_uio
0000:06:00.0 'I210 Gigabit Network Connection 1533' if=enp6s0 drv=igb unused=igb_uio
No 'Crypto' devices detected
============================
No 'Eventdev' devices detected
==============================
No 'Mempool' devices detected
=============================
No 'Compress' devices detected
==============================
Enter PCI address of device to bind to IGB UIO driver: 05:00.0
OK
隨后可以用配置腳本中的[28] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)運行測試程序。在此之前需要先聲明RTE_TARGET路徑,退出腳本后運行:
export RTE_TARGET=/home/dpdk-stable-18.11.2/x86_64-native-linuxapp-gcc/
隨后重新打開腳本,可以運行測試程序:
Option: 28
Enter hex bitmask of cores to execute testpmd app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0x03
Launching app
......
至此,DPDK的部署就算完成了,接下來可以嘗試編譯和運行
基于DPDK的簡單應用了。
基于DPDK的簡單應用編譯與運行方法可以查看:
編譯和運行DPDK示例程序