1. 簡(jiǎn)介
本文檔包含DPDK軟件安裝和配置的相關(guān)說(shuō)明。旨在幫助用戶快速啟動(dòng)和運(yùn)行軟件雳攘。文檔主要描述了在Linux環(huán)境下編譯和 運(yùn)行DPDK應(yīng)用程序埠巨,但是文檔并不深入DPDK的具體實(shí)現(xiàn)細(xì)節(jié)。
1.1. 文檔地圖
以下是一份建議順序閱讀的DPDK參考文檔列表:
- 發(fā)布說(shuō)明 : 提供特性發(fā)行版本的信息创淡,包括支持的功能另绩,限制儒陨,修復(fù)的問(wèn)題,已知的問(wèn)題等等笋籽。此外蹦漠,還以FAQ方式提供了常見(jiàn)問(wèn)題及解答。
- 入門(mén)指南(本文檔):介紹如何安裝和配置DPDK干签,旨在幫助用戶快速上手津辩。
- 編程指南 :描述如下內(nèi)容:
- 軟件架構(gòu)及如何使用(實(shí)例介紹),特別是在Linux環(huán)境中的用法
- DPDK的主要內(nèi)容容劳,系統(tǒng)構(gòu)建(包括可以在DPDK根目錄Makefile中來(lái)構(gòu)建工具包和應(yīng)用程序的命令)及應(yīng)用移植細(xì)則喘沿。
- 軟件中使用的,以及新開(kāi)發(fā)中需要考慮的一些優(yōu)化竭贩。
還提供了文檔使用的術(shù)語(yǔ)表蚜印。
- API參考 :提供有關(guān)DPDK功能、數(shù)據(jù)結(jié)構(gòu)和其他編程結(jié)構(gòu)的詳細(xì)信息留量。
- 示例程序用戶指南 :描述了一組例程窄赋。 每個(gè)章節(jié)描述了一個(gè)用例哟冬,展示了具體的功能,并提供了有關(guān)如何編譯忆绰、運(yùn)行和使用的說(shuō)明浩峡。
2. 系統(tǒng)要求
本章描述了編譯DPDK所需的軟件包。
注意:假如在Intel公司的89xx通信芯片組平臺(tái)上使用DPDK错敢,請(qǐng)參閱文檔 Intel? Communications Chipset 89xx Series Software for Linux Getting Started Guide翰灾。
2.1. X86上預(yù)先設(shè)置BIOS
對(duì)大多數(shù)平臺(tái),使用基本DPDK功能無(wú)需對(duì)BIOS進(jìn)行特殊設(shè)置稚茅。然而纸淮,對(duì)于HPET定時(shí)器和電源管理功能,以及為了獲得40G網(wǎng)卡上小包處理的高性能亚享,則可能需要更改BIOS設(shè)置咽块。可以參閱章節(jié) Enabling Additional Functionality 以獲取更為詳細(xì)的信息欺税。
2.2. 編譯DPDK
工具集:
注意:
以下說(shuō)明在Fedora 18上通過(guò)了測(cè)試侈沪。其他系統(tǒng)所需要的安裝命令和軟件包可能有所不同。有關(guān)其他Linux發(fā)行版本和測(cè)試版本的詳細(xì)信息魄衅,請(qǐng)參閱DPDK發(fā)布說(shuō)明峭竣。
- GNU make.
- coreutils: cmp, sed, grep, arch 等.
- gcc: 4.9以上的版本適用于所有的平臺(tái)。 在某些發(fā)布版本中晃虫,啟用了一些特定的編譯器標(biāo)志和鏈接標(biāo)志(例如
-fstack-protector
)。請(qǐng)參閱文檔的發(fā)布版本和 gcc -dumpspecs. - libc 頭文件扣墩,通常打包成 gcc-multilib (glibc-devel.i686 / libc6-dev-i386; glibc-devel.x86_64 / libc6-dev 用于Intel 64位架構(gòu)編譯; glibc-devel.ppc64 用于IBM 64位架構(gòu)編譯;)
- 構(gòu)建Linux內(nèi)核模塊所需要的頭文件和源文件哲银。(kernel - devel.x86_64; kernel - devel.ppc64)
- 在64位系統(tǒng)上編譯32位軟件包額外需要的軟件為:
- glibc.i686, libgcc.i686, libstdc++.i686 及 glibc-devel.i686, 適用于Intel的i686/x86_64;
- glibc.ppc64, libgcc.ppc64, libstdc++.ppc64 及 glibc-devel.ppc64 適用于 IBM ppc_64;
注意:x86_x32 ABI目前僅在Ubuntu 13.10及以上版本或者Debian最近的發(fā)行版本上支持呻惕。編譯器必須是gcc 4.9+版本荆责。 Python, 2.7+ or 3.2+版本, 用于運(yùn)行DPDK軟件包中的各種幫助腳本。
可選工具:
- Intel? C++ Compiler (icc). 安裝icc可能需要額外的庫(kù)亚脆,請(qǐng)參閱編譯器安裝目錄下的icc安裝指南做院。
- IBM? Advance ToolChain for Powerlinux. 這是一組開(kāi)源開(kāi)發(fā)工具和運(yùn)行庫(kù)。允許用戶在Linux上使用IBM最新POWER硬件的優(yōu)勢(shì)濒持。具體安裝請(qǐng)參閱IBM的官方安裝文檔键耕。
- libpcap 頭文件和庫(kù) (libpcap-devel) ,用于編譯和使用基于libcap的輪詢模式驅(qū)動(dòng)程序柑营。默認(rèn)情況下屈雄,該驅(qū)動(dòng)程序被禁用,可以通過(guò)在構(gòu)建時(shí)修改配置文件 CONFIG_RTE_LIBRTE_PMD_PCAP=y 來(lái)開(kāi)啟官套。
- 需要使用libarchive 頭文件和庫(kù)來(lái)進(jìn)行某些使用tar獲取資源的單元測(cè)試酒奶。
2.3. 運(yùn)行DPDK應(yīng)用程序
要運(yùn)行DPDK應(yīng)用程序蚁孔,需要在目標(biāo)機(jī)器上進(jìn)行某些定制。
2.3.1. 系統(tǒng)軟件
需求:
-
Kernel version >= 2.6.34, 當(dāng)前內(nèi)核版本可以通過(guò)命令查看:
uname -r
glibc >= 2.7 (方便使用cpuset相關(guān)特性), 版本信息通命令 ldd --version 查看惋嚎。
-
Kernel configuration, 在 Fedora OS 及其他常見(jiàn)的發(fā)行版本中杠氢,如 Ubuntu 或 Red Hat Enterprise Linux,供應(yīng)商提供的配置可以運(yùn)行大多數(shù)的DPDK應(yīng)用程序另伍。
對(duì)于其他內(nèi)核構(gòu)件修然,應(yīng)為DPDK開(kāi)啟的選項(xiàng)包括:- UIO 支持
- HUGETLBFS 支持
- PROC_PAGE_MONITOR 支持
- 如果需要HPET支持,還應(yīng)開(kāi)啟 HPET and HPET_MMAP 配置選項(xiàng)质况。有關(guān)信息參考 High Precision Event Timer (HPET) Functionality 章節(jié)獲取更多信息愕宋。
2.3.2. 在 Linux 環(huán)境中使用 Hugepages
用于數(shù)據(jù)包緩沖區(qū)的大型內(nèi)存池分配需要 Hugepages 支持(如上節(jié)所述,必須在運(yùn)行的內(nèi)核中開(kāi)啟 HUGETLBFS 選項(xiàng))结榄。通過(guò)使用大頁(yè)分配中贝,程序需要更少的頁(yè)面,性能增加臼朗,因?yàn)檩^少的TLB減少了將虛擬頁(yè)面地址翻譯成物理頁(yè)面地址所需的時(shí)間邻寿。如果沒(méi)有大頁(yè),標(biāo)準(zhǔn)大小4k的頁(yè)面會(huì)導(dǎo)致頻繁的TLB miss视哑,性能下降绣否。
2.3.2.1. 預(yù)留Hugepages給DPDK使用
大頁(yè)分配應(yīng)該在系統(tǒng)引導(dǎo)時(shí)或者啟動(dòng)后盡快完成,以避免物理內(nèi)存碎片化挡毅。要在引導(dǎo)時(shí)預(yù)留大頁(yè)蒜撮,需要給Linux內(nèi)核命令行傳遞一個(gè)參數(shù)。
對(duì)于2MB大小的頁(yè)面跪呈,只需要將hugepages選項(xiàng)傳遞給內(nèi)核段磨。如,預(yù)留1024個(gè)2MB大小的page耗绿,使用:
hugepages=1024
對(duì)于其他大小的hugepage苹支,例如1G的頁(yè),大小必須同時(shí)指定误阻。例如债蜜,要預(yù)留4個(gè)1G大小的頁(yè)面給程序,需要傳遞以下選項(xiàng)給內(nèi)核:
default_hugepagesz=1G hugepagesz=1G hugepages=4
注意:CPU支持的hugepage大小可以從Intel架構(gòu)上的CPU標(biāo)志位確定究反。如果存在pse寻定,則支持2M個(gè)hugepages,如果page1gb存在奴紧,則支持1G的hugepages特姐。
在IBM Power架構(gòu)中,支持的hugepage大小為16MB和16GB黍氮。
注意:對(duì)于64位程序唐含,如果平臺(tái)支持浅浮,建議使用1GB的hugepages。
在雙插槽NUMA的系統(tǒng)上捷枯,在啟動(dòng)時(shí)預(yù)留的hugepage數(shù)目通常在兩個(gè)插槽之間評(píng)分(假設(shè)兩個(gè)插槽上都有足夠的內(nèi)存)滚秩。
有關(guān)這些和其他內(nèi)核選項(xiàng)的信息,請(qǐng)參閱Linux源代碼目錄中/kernel-parameter.txt文件淮捆。
特例:
對(duì)于2MB頁(yè)面郁油,還可以在系統(tǒng)啟動(dòng)之后再分配,通過(guò)向 /sys/devices/ 目錄下的nr_hugepages文件寫(xiě)入hugepage數(shù)目來(lái)實(shí)現(xiàn)攀痊。 對(duì)于單節(jié)點(diǎn)系統(tǒng)桐腌,使用的命令如下(假設(shè)需要1024個(gè)頁(yè)):
echo 1024 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
在NUMA設(shè)備中,分配應(yīng)該明確指定在哪個(gè)節(jié)點(diǎn)上:
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
注意:對(duì)于1G頁(yè)面苟径,系統(tǒng)啟動(dòng)之后無(wú)法預(yù)留頁(yè)面內(nèi)存案站。
2.3.2.2. DPDK使用Hugepages
一旦預(yù)留了hugepage內(nèi)存,為了使內(nèi)存可用于DPDK棘街,請(qǐng)執(zhí)行以下步驟:
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
通過(guò)將一下命令添加到 /etc/fstab 文件中蟆盐,安裝點(diǎn)可以在重啟時(shí)永久保存:
nodev /mnt/huge hugetlbfs defaults 0 0
對(duì)于1GB內(nèi)存,頁(yè)面大小必須在安裝選項(xiàng)中指定:
nodev /mnt/huge_1GB hugetlbfs pagesize=1GB 0 0
2.3.3. Linux環(huán)境中Xen Domain0支持
現(xiàn)有的內(nèi)存管理實(shí)現(xiàn)是基于Linux內(nèi)核的hugepage機(jī)制遭殉。在Xen虛擬機(jī)管理程序中石挂,對(duì)于DomainU客戶端的支持意味著DPDK程序與客戶一樣正常工作。
但是险污,Domain0不支持hugepages痹愚。為了解決這個(gè)限制,添加了一個(gè)新的內(nèi)核模塊rte_dom0_mm用于方便內(nèi)存的分配和映射罗心,通過(guò) IOCTL (分配) 和 MMAP (映射).
2.3.3.1. DPDK中使能Xen Dom0模式
默認(rèn)情況下里伯,DPDK構(gòu)建時(shí)禁止使用Xen Dom0模式。要支持Xen Dom0渤闷,CONFIG_RTE_LIBRTE_XEN_DOM0設(shè)置應(yīng)該改為 “y”,編譯時(shí)棄用該模式脖镀。
此外飒箭,為了允許接收錯(cuò)誤套接字ID,CONFIG_RTE_EAL_ALLOW_INV_SOCKET_ID也必須設(shè)置為 “y”蜒灰。
2.3.3.2. 加載DPDK rte_dom0_mm模塊
要在Xen Dom0下運(yùn)行任何DPDK應(yīng)用程序弦蹂,必須使用rsv_memsize選項(xiàng)將rte_dom0_mm 模塊加載到運(yùn)行的內(nèi)核中。該模塊位于DPDK目標(biāo)目錄的kmod子目錄中强窖。應(yīng)該使用insmod命令加載此模塊凸椿,如下所示:
sudo insmod kmod/rte_dom0_mm.ko rsv_memsize=X
X的值不能大于4096(MB).
2.3.3.3. 配置內(nèi)存用于DPDK使用
在加載rte_dom0_mm.ko內(nèi)核模塊之后,用戶必須配置DPDK使用的內(nèi)存大小翅溺。這也是通過(guò)將內(nèi)存大小寫(xiě)入到目錄 /sys/devices/ 下的文件memsize中來(lái)實(shí)現(xiàn)的脑漫。 使用以下命令(假設(shè)需要2048MB):
echo 2048 > /sys/kernel/mm/dom0-mm/memsize-mB/memsize
用戶還可以使用下面命令檢查已經(jīng)使用了多少內(nèi)存:
cat /sys/kernel/mm/dom0-mm/memsize-mB/memsize_rsvd
Xen Domain0不支持NUMA配置髓抑,因此 --socket-mem 命令選項(xiàng)對(duì)Xen Domain0無(wú)效。
注意:
memsize的值不能大于rsv_memsize优幸。
2.3.3.4. 在Xen Domain0上運(yùn)行DPDK程序
要在Xen Domain0上運(yùn)行DPDK程序吨拍,需要一個(gè)額外的命令行選項(xiàng) --xen-dom0。
3. 使用源碼編譯DPDK目標(biāo)文件
注意:這個(gè)過(guò)程的部分工作可以通過(guò)章節(jié)“使用腳本快速構(gòu)建”描述的腳本來(lái)實(shí)現(xiàn)网杆。
3.1. 安裝DPDK及源碼
首先羹饰,解壓文件并進(jìn)入到DPDK源文件根目錄下:
tar xJf dpdk-<version>.tar.xz
cd dpdk-<version>
DPDK源文件由幾個(gè)目錄組成:
- lib: DPDK 庫(kù)文件
- drivers: DPDK 輪詢驅(qū)動(dòng)源文件
- app: DPDK 應(yīng)用程序 (自動(dòng)測(cè)試)源文件
- examples: DPDK 應(yīng)用例程
- config, buildtools, mk: 框架相關(guān)的makefile、腳本及配置文件
3.2. DPDK目標(biāo)環(huán)境安裝
DPDK目標(biāo)文件的格式為:
ARCH-MACHINE-EXECENV-TOOLCHAIN
其中:
- ARCH 可以是: i686, x86_64, ppc_64
- MACHINE 可以是: native, power8
- EXECENV 可以是: linuxapp, bsdapp
- TOOLCHAIN 可以是: gcc, icc
目標(biāo)文件取決于運(yùn)行環(huán)境是32位還是64位設(shè)備碳却《又龋可以在DPDK的 /config 目錄中找到可用的目標(biāo),不能使用defconfig_前綴昼浦。
注意:
配置文件根據(jù) RTE_MACHINE 優(yōu)化級(jí)別不同分別提供馍资。在配置文件內(nèi)部,RTE_MACHINE 配置為 native座柱,
意味著已編譯的軟件被調(diào)整到其構(gòu)建的平臺(tái)上迷帜。有關(guān)此設(shè)置的更多信息,請(qǐng)參閱 DPDK 編程指南色洞。
當(dāng)使用Intel? C++ 編譯器 (icc)時(shí)戏锹,對(duì)64位和32位,需要使用以下命令進(jìn)行調(diào)整。 注意火诸,shell腳本會(huì)更新 $PATH 值锦针,因此不能再同一個(gè)會(huì)話中執(zhí)行。 此外置蜀,還應(yīng)該檢查編譯器的安裝目錄奈搜,因?yàn)榭赡懿煌?/p>
source /opt/intel/bin/iccvars.sh intel64
source /opt/intel/bin/iccvars.sh ia32
在頂級(jí)目錄中使用 make install T=<target> 來(lái)生成目標(biāo)文件。
例如盯荤,為了使用icc編譯生成64位目標(biāo)文件馋吗,運(yùn)行如下命令:
make install T=x86_64-native-linuxapp-icc
為了使用gcc編譯生成32位目標(biāo)文件,命令如下:
make install T=i686-native-linuxapp-gcc
如果僅僅只是生成目標(biāo)文件秋秤,并不運(yùn)行宏粤,比如,配置文件改變需要重新編譯灼卢,使用 make config T=<target> 命令:
make config T=x86_64-native-linuxapp-gcc
注意:
任何需要運(yùn)行的內(nèi)核模塊绍哎,如 igb_uio, kni, 必須在與目標(biāo)文件編譯相同的內(nèi)核下進(jìn)行編譯。如果DPDK未在目標(biāo)設(shè)備上構(gòu)建鞋真,則應(yīng)使用 RTE_KERNELDIR 環(huán)境變量將編譯指向要在目標(biāo)機(jī)上使用的內(nèi)核版本的副本(交叉編譯的內(nèi)核版本)崇堰。
創(chuàng)建目標(biāo)環(huán)境之后,用戶可以移動(dòng)到目標(biāo)環(huán)境目錄,并繼續(xù)更改代碼并編譯海诲。用戶還可以通過(guò)編輯build目錄中的.config文件對(duì)DPDK配置進(jìn)行修改繁莹。 (這是頂級(jí)目錄中defconfig文件的本地副本)。
cd x86_64-native-linuxapp-gcc
vi .config
make
此外饿肺,make clean命令可以用于刪除任何現(xiàn)有的編譯文件蒋困,以便后續(xù)完整、干凈地重新編譯代碼敬辣。
3.3. Browsing the Installed DPDK Environment Target
一旦目標(biāo)文件本創(chuàng)建雪标,它就包含了構(gòu)建客戶應(yīng)用程序所需的DPDK環(huán)境的所有庫(kù),包括輪詢驅(qū)動(dòng)程序和頭文件溉跃。 此外村刨,test和testpmd應(yīng)用程序構(gòu)建在build/app目錄下,可以用于測(cè)試撰茎。 還有一個(gè)kmod目錄嵌牺,存放可能需要加載的內(nèi)核模塊。
3.4. 加載模塊啟動(dòng)DPDK環(huán)境需要的UIO功能
要運(yùn)行任何的DPDK應(yīng)用程序龄糊,需要將合適的uio模塊線加載到當(dāng)前內(nèi)核中逆粹。在多數(shù)情況下,Linux內(nèi)核包含了標(biāo)準(zhǔn)的 uio_pci_generic 模塊就可以提供uio能力炫惩。 該模塊可以使用命令加載
sudo modprobe uio_pci_generic
區(qū)別于 uio_pci_generic 僻弹,DPDK提供了一個(gè)igb_uio模塊(可以在kmod目錄下找到)。可以通過(guò)如下方式加載:
sudo modprobe uio
sudo insmod kmod/igb_uio.ko
注意:
對(duì)于一下不支持傳統(tǒng)中斷的設(shè)備,例如虛擬功能(VF)設(shè)備昧互,必須使用 igb_uio 來(lái)替代 uio_pci_generic 模塊。
由于DPDK 1.7版本提供VFIO支持卸耘,所以,對(duì)于支持VFIO的平臺(tái)粘咖,可選則UIO蚣抗,也可以不用。
3.5. 加載VFIO模塊
DPDK程序選擇使用VFIO時(shí)瓮下,需要加載 vfio-pci 模塊:
sudo modprobe vfio-pci
注意忠聚,要使用VFIO,首先唱捣,你的平臺(tái)內(nèi)核版本必須支持VFIO功能。 Linux內(nèi)核從3.6.0版本之后就一直包含VFIO模塊网梢,通常是默認(rèn)存在的震缭。不夠請(qǐng)查詢發(fā)行文檔以確認(rèn)是否存在。
此外战虏,要使用VFIO拣宰,內(nèi)核和BIOS都必須支持党涕,并配置為使用IO虛擬化 (如 Intel? VT-d)。
為了保證非特權(quán)用戶運(yùn)行DPDK時(shí)能夠正確操作VFIO巡社,還應(yīng)設(shè)置正確的權(quán)限膛堤。這可以通過(guò)DPDK的配置腳本(dpdk-setup.sh文件位于usertools目錄中)。
3.6. 網(wǎng)絡(luò)端口綁定/解綁定到內(nèi)核去頂模塊
從版本1.4開(kāi)始晌该,DPDK應(yīng)用程序不再自動(dòng)解除所有網(wǎng)絡(luò)端口與原先內(nèi)核驅(qū)動(dòng)模塊的綁定關(guān)系肥荔。 相反的,DPDK程序在運(yùn)行前朝群,需要將所要使用的端口綁定到 uio_pci_generic, igb_uio 或 vfio-pci 模塊上燕耿。 任何Linux內(nèi)核本身控制的端口無(wú)法被DPDK PMD驅(qū)動(dòng)所使用。
注意:
默認(rèn)情況下姜胖,DPDK將在啟動(dòng)時(shí)不再自動(dòng)解綁定內(nèi)核模塊與端口的關(guān)系誉帅。DPDK應(yīng)用程序使用的任何端口必須與Linux無(wú)關(guān),并綁定到 uio_pci_generic, igb_uio 或 vfio-pci 模塊上右莱。
將端口從Linux內(nèi)核解綁蚜锨,然后綁定到 uio_pci_generic, igb_uio 或 vfio-pci 模塊上供DPDK使用,可以使用腳本dpdk_nic _bind.py(位于usertools目錄下)慢蜓。 這個(gè)工具可以用于提供當(dāng)前系統(tǒng)上網(wǎng)絡(luò)接口的狀態(tài)圖亚再,綁定或解綁定來(lái)自不同內(nèi)核模塊的接口。 以下是腳本如何使用的一些實(shí)例胀瞪。通過(guò)使用 --help or --usage 選項(xiàng)調(diào)用腳本针余,可以獲得腳本的完整描述與幫助信息。 請(qǐng)注意凄诞,要將接口綁定到uio或vfio的話圆雁,需要先將這兩個(gè)模塊加載到內(nèi)核,再運(yùn)行 dpdk-devbind.py 腳本帆谍。
注意:
由于VFIO的工作方式伪朽,設(shè)備是否可用VFIO是有明確限制的。大部分是由IOMMU組的功能決定的汛蝙。
任何的虛擬設(shè)備可以獨(dú)立使用VFIO烈涮,但是物理設(shè)備則要求將所有端口綁定到VFIO,或者其中一些綁定到VFIO窖剑,而其他端口不能綁定到任何其他驅(qū)動(dòng)程序坚洽。
如果你的設(shè)備位于PCI-to-PCI橋之后,橋接器將成為設(shè)備所在的IOMMU組的一部分西土。因此讶舰,橋接驅(qū)動(dòng)程序也應(yīng)該從端口解綁定。
注意:
雖然任何用戶都可以運(yùn)行dpdk-devbind.py腳本來(lái)查看網(wǎng)絡(luò)接口的狀態(tài),但是綁定和解綁定則需要root權(quán)限跳昼。
查看系統(tǒng)中所有網(wǎng)絡(luò)接口的狀態(tài):
./usertools/dpdk-devbind.py --status
Network devices using DPDK-compatible driver
============================================
0000:82:00.0 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe
0000:82:00.1 '82599EB 10-GbE NIC' drv=uio_pci_generic unused=ixgbe
Network devices using kernel driver
===================================
0000:04:00.0 'I350 1-GbE NIC' if=em0 drv=igb unused=uio_pci_generic *Active*
0000:04:00.1 'I350 1-GbE NIC' if=eth1 drv=igb unused=uio_pci_generic
0000:04:00.2 'I350 1-GbE NIC' if=eth2 drv=igb unused=uio_pci_generic
0000:04:00.3 'I350 1-GbE NIC' if=eth3 drv=igb unused=uio_pci_generic
Other network devices
=====================
<none>
綁定設(shè)備 eth1,04:00.1
, 到 uio_pci_generic 驅(qū)動(dòng):
./usertools/dpdk-devbind.py --bind=uio_pci_generic 04:00.1
或者
./usertools/dpdk-devbind.py --bind=uio_pci_generic eth1
恢復(fù)設(shè)備 82:00.0 到Linux內(nèi)核綁定狀態(tài):
./usertools/dpdk-devbind.py --bind=ixgbe 82:00.0
4. 編譯和運(yùn)行簡(jiǎn)單應(yīng)用程序
本章介紹如何在DPDK環(huán)境下編譯和運(yùn)行應(yīng)用程序般甲。還指出應(yīng)用程序的存儲(chǔ)位置。
注意:此過(guò)程的部分操作也可以使用腳本來(lái)完成鹅颊。參考 使用腳本快速構(gòu)建 章節(jié)描述敷存。
4.1. 編譯一個(gè)簡(jiǎn)單應(yīng)用程序
一個(gè)DPDK目標(biāo)環(huán)境創(chuàng)建完成時(shí)(如 x86_64-native-linuxapp-gcc),它包含編譯一個(gè)應(yīng)用程序所需要的全部庫(kù)和頭文件堪伍。
當(dāng)在Linux* 交叉環(huán)境中編譯應(yīng)用程序時(shí)锚烦,以下變量需要預(yù)先導(dǎo)出:
- RTE_SDK - 指向DPDK安裝目錄。
- RTE_TARGET - 指向DPDK目標(biāo)環(huán)境目錄杠娱。
以下是創(chuàng)建helloworld應(yīng)用程序?qū)嵗炖危搶?shí)例將在DPDK Linux環(huán)境中運(yùn)行。這個(gè)實(shí)例可以在目錄${RTE_SDK}/examples找到摊求。
該目錄包含 main.c 文件禽拔。該文件與DPDK目標(biāo)環(huán)境中的庫(kù)結(jié)合使用時(shí),調(diào)用各種函數(shù)初始化DPDK環(huán)境室叉,然后睹栖,為每個(gè)要使用的core啟動(dòng)一個(gè)入口點(diǎn)(調(diào)度應(yīng)用程序)。 默認(rèn)情況下茧痕,二進(jìn)制文件存儲(chǔ)在build目錄中野来。
cd examples/helloworld/
export RTE_SDK=$HOME/DPDK
export RTE_TARGET=x86_64-native-linuxapp-gcc
make
CC main.o
LD helloworld
INSTALL-APP helloworld
INSTALL-MAP helloworld.map
ls build/app
helloworld helloworld.map
注意:
在上面的例子中, helloworld 是在DPDK的目錄結(jié)構(gòu)下的踪旷。 當(dāng)然曼氛,也可以將其放在DPDK目錄之外,以保證DPDK的結(jié)構(gòu)不變令野。 下面的例子舀患, helloworld 應(yīng)用程序被復(fù)制到一個(gè)新的目錄下。
export RTE_SDK=/home/user/DPDK
cp -r $(RTE_SDK)/examples/helloworld my_rte_app
cd my_rte_app/
export RTE_TARGET=x86_64-native-linuxapp-gcc
make
CC main.o
LD helloworld
INSTALL-APP helloworld
INSTALL-MAP helloworld.map
4.2. 運(yùn)行一個(gè)簡(jiǎn)單的應(yīng)用程序
注意: UIO驅(qū)動(dòng)和hugepage必須在程序運(yùn)行前設(shè)置好气破。
注意:應(yīng)用程序使用的任何端口聊浅,必須綁定到合適的內(nèi)核驅(qū)動(dòng)模塊上,如章節(jié) 網(wǎng)絡(luò)端口綁定/解綁定到內(nèi)核去頂模塊 描述的那樣现使。
應(yīng)用程序與DPDK目標(biāo)環(huán)境的環(huán)境抽象層(EAL)庫(kù)相關(guān)聯(lián)低匙,該庫(kù)提供了所有DPDK程序通用的一些選項(xiàng)。
以下是EAL提供的一些選項(xiàng)列表:
./rte-app -c COREMASK [-n NUM] [-b <domain:bus:devid.func>] \
[--socket-mem=MB,...] [-m MB] [-r NUM] [-v] [--file-prefix] \
[--proc-type <primary|secondary|auto>] [-- xen-dom0]
選項(xiàng)描述如下:
- -c COREMASK: 要運(yùn)行的內(nèi)核的十六進(jìn)制掩碼碳锈。注意顽冶,平臺(tái)之間編號(hào)可能不同,需要事先確定售碳。
- -n NUM: 每個(gè)處理器插槽的內(nèi)存通道數(shù)目渗稍。
- -b <domain:bus:devid.func>: 端口黑名單佩迟,避免EAL使用指定的PCI設(shè)備。
- --use-device: 僅使用指定的以太網(wǎng)設(shè)備竿屹。使用逗號(hào)分隔 [domain:]bus:devid.func 值,不能與 -b 選項(xiàng)一起使用灸姊。
- --socket-mem: 從特定插槽上的hugepage分配內(nèi)存拱燃。
- -m MB: 內(nèi)存從hugepage分配,不管處理器插槽力惯。建議使用 --socket-mem 而非這個(gè)選項(xiàng)碗誉。
- -r NUM: 內(nèi)存數(shù)量。
- -v: 顯示啟動(dòng)時(shí)的版本信息父晶。
- --huge-dir: 掛載hugetlbfs的目錄哮缺。
- --file-prefix: 用于hugepage文件名的前綴文本。
- --proc-type: 程序?qū)嵗念?lèi)型甲喝。
- --xen-dom0: 支持在Xen Domain0上運(yùn)行尝苇,但不具有hugetlbfs的程序。
- --vmware-tsc-map: 使用VMware TSC 映射而不是本地RDTSC埠胖。
- --base-virtaddr: 指定基本虛擬地址糠溜。
- --vfio-intr: 指定要由VFIO使用的中斷類(lèi)型。(如果不支持VFIO直撤,則配置無(wú)效)非竿。
其中 -c 是強(qiáng)制性的,其他為可選配置谋竖。
將DPDK應(yīng)用程序二進(jìn)制文件拷貝到目標(biāo)設(shè)備红柱,按照如下命令運(yùn)行(我們假設(shè)每個(gè)平臺(tái)處理器有4個(gè)內(nèi)存通道,并且存在core0~3用于運(yùn)行程序):
./helloworld -c f -n 4
注意:選項(xiàng) --proc-type 和 --file-prefix 用于運(yùn)行多個(gè)DPDK進(jìn)程蓖乘。請(qǐng)參閱 “多應(yīng)用程序?qū)嵗?章節(jié)及 DPDK 編程指南 獲取更多細(xì)節(jié)锤悄。
4.2.1. 應(yīng)用程序使用的邏輯Core
對(duì)于DPDK應(yīng)用程序,coremask參數(shù)始終是必須的驱敲。掩碼的每個(gè)位對(duì)應(yīng)于Linux提供的邏輯core ID铁蹈。 由于這些邏輯core的編號(hào),以及他們?cè)贜UMA插槽上的映射可能因平臺(tái)而異众眨,因此建議在選擇每種情況下使用的coremaks時(shí)握牧,都要考慮每個(gè)平臺(tái)的core布局。
在DPDK程序初始化EAL層時(shí)娩梨,將顯示要使用的邏輯core及其插槽位置沿腰。可以通過(guò)讀取 /proc/cpuinfo 文件來(lái)獲取系統(tǒng)上所有core的信息狈定。例如執(zhí)行 cat /proc/cpuinfo颂龙。 列出來(lái)的physical id 屬性表示其所屬的CPU插槽习蓬。當(dāng)使用了其他處理器來(lái)了解邏輯core到插槽的映射時(shí),這些信息很有用措嵌。
注意:可以使用另一個(gè)Linux工具 lstopo 來(lái)獲取邏輯core布局的圖形化信息躲叼。在Fedora Linux上, 可以通過(guò)如下命令安裝并運(yùn)行工具:
sudo yum install hwloc
./lstopo
注意:邏輯core在不同的電路板上可能不同,在應(yīng)用程序使用coremaks時(shí)需要先確定企巢。
4.2.2. 應(yīng)用程序使用的Hugepage內(nèi)存
當(dāng)運(yùn)行應(yīng)用程序時(shí)枫慷,建議使用的內(nèi)存與hugepage預(yù)留的內(nèi)存一致。如果運(yùn)行時(shí)沒(méi)有 -m 或 --socket-mem 參數(shù)傳入浪规,這由DPDK應(yīng)用程序在啟動(dòng)時(shí)自動(dòng)完成或听。
如果通過(guò)顯示傳入 -m 或 --socket-mem 值,但是請(qǐng)求的內(nèi)存超過(guò)了該值笋婿,應(yīng)用程序?qū)?zhí)行失敗誉裆。 但是,如果用戶請(qǐng)求的內(nèi)存小于預(yù)留的hugepage-memory缸濒,應(yīng)用程序也會(huì)失敗足丢,特別是當(dāng)使用了 -m 選項(xiàng)的時(shí)候。 因?yàn)樯芴睿僭O(shè)系統(tǒng)在插槽0和插槽1上有1024個(gè)預(yù)留的2MB頁(yè)面霎桅,如果用戶請(qǐng)求128 MB的內(nèi)存,可能存在64個(gè)頁(yè)不符合要求的情況:
內(nèi)核只能在插槽1中將hugepage-memory提供給應(yīng)用程序讨永。在這種情況下滔驶,如果應(yīng)用程序嘗試創(chuàng)建一個(gè)插槽0中的對(duì)象,例如ring或者內(nèi)存池卿闹,那么將執(zhí)行失敗 為了避免這個(gè)問(wèn)題揭糕,建議使用 --socket-mem 選項(xiàng)替代 -m 選項(xiàng)。
這些頁(yè)面可能位于物理內(nèi)存中的任意位置锻霎,盡管DPDK EAL將嘗試在連續(xù)的內(nèi)存塊中分配內(nèi)存著角,但是頁(yè)面可能是不連續(xù)的。在這種情況下旋恼,應(yīng)用程序無(wú)法分配大內(nèi)存吏口。
使用socket-mem選項(xiàng)可以為特定的插槽請(qǐng)求特定大小的內(nèi)存。通過(guò)提供 --socket-mem 標(biāo)志和每個(gè)插槽需要的內(nèi)存數(shù)量來(lái)實(shí)現(xiàn)的冰更,如 --socket-mem=0,512 用于在插槽1上預(yù)留512MB內(nèi)存产徊。 類(lèi)似的,在4插槽系統(tǒng)上蜀细,如果只能在插槽0和2上分配1GB內(nèi)存舟铜,則可以使用參數(shù)–socket-mem=1024,0,1024
來(lái)實(shí)現(xiàn)。 如果DPDK無(wú)法在每個(gè)插槽上分配足夠的內(nèi)存奠衔,則EAL初始化失敗谆刨。
4.3. 其他示例程序
其他的一些示例程序包含在${RTE_SDK}/examples 目錄下塘娶。這些示例程序可以使用本手冊(cè)前面部分所述的方法進(jìn)行構(gòu)建運(yùn)行。另外痊夭,請(qǐng)參閱 DPDK示例程序用戶指南 了解應(yīng)用程序的描述刁岸、編譯和執(zhí)行的具體說(shuō)明以及代碼解釋。
4.4. 附加的測(cè)試程序
此外生兆,還有兩個(gè)在創(chuàng)建庫(kù)時(shí)構(gòu)建的應(yīng)用程序难捌。這些源文件位于 DPDK/app目錄下,稱為test和testpmd程序鸦难。創(chuàng)建庫(kù)之后,可以在build目錄中找到员淫。
- test程序?yàn)镈PDK中的各種功能提供具體的測(cè)試合蔽。
- testpmd程序提供了許多不同的數(shù)據(jù)包吞吐測(cè)試,例如介返,在Intel? 82599 10 Gigabit Ethernet Controller中如何使用Flow Director拴事。
5. 啟用附加功能
5.1. 高精度事件定時(shí)器(HPET)功能
5.1.1. BIOS支持
要使用HPET功能時(shí),必須先在平臺(tái)BIOS上開(kāi)啟高精度定時(shí)器圣蝎。否則刃宵,默認(rèn)情況下使用時(shí)間戳計(jì)數(shù)器(TSC)。通常情況下徘公,起機(jī)時(shí)按F2 可以訪問(wèn)BIOS牲证。然后用戶可以導(dǎo)航到HPET選項(xiàng)。在Crystal Forest平臺(tái)BIOS上关面,路徑為:Advanced -> PCH-IO Configuration -> High Precision Timer -> (如果需要坦袍,將Disabled 改為 Enabled )。
在已經(jīng)起機(jī)的系統(tǒng)上等太,可以使用以下命令來(lái)檢查HPET是否啟用
grep hpet /proc/timer_list
如果沒(méi)有條目捂齐,則必須在BIOS中啟用HPET,鑌鐵重新啟動(dòng)系統(tǒng)缩抡。
5.1.2. Linux內(nèi)核支持
DPDK通過(guò)將定時(shí)器計(jì)數(shù)器映射到進(jìn)程地址空間來(lái)使用平臺(tái)的HPET功能奠宜,因此,要求開(kāi)啟 HPET_MMAP 系統(tǒng)內(nèi)核配置選項(xiàng)瞻想。
注意:在Fedora或者其他常見(jiàn)的Linux發(fā)行版本(如Ubuntu)中压真,默認(rèn)不會(huì)啟用 HPET_MMAP 選項(xiàng)。要重新編譯啟動(dòng)此選項(xiàng)的內(nèi)核内边,請(qǐng)參閱發(fā)行版本的相關(guān)說(shuō)明榴都。
5.1.3. DPDK中使能HPET
默認(rèn)情況下,DPDK配置文件中是禁用HPET功能的漠其。要使用HPET嘴高,需要將CONFIG_RTE_LIBEAL_USE_HPET設(shè)置為y來(lái)開(kāi)啟編譯竿音。
對(duì)于那些使用 rte_get_hpet_cycles()及rte_get_hpet_hz()API接口的應(yīng)用程序,并且選擇了HPET作為rte_timer庫(kù)的默認(rèn)時(shí)鐘源拴驮,需要在初始化時(shí)調(diào)用 rte_eal_hpet_init()API春瞬。這個(gè)API調(diào)用將保證HPET可用,如果HPET不可用(例如套啤,內(nèi)核沒(méi)有開(kāi)啟 HPET_MMAP 使能)宽气,則向程序返回一個(gè)錯(cuò)誤值。 如果HPET在運(yùn)行時(shí)不可用潜沦,應(yīng)用程序可以方便的采取其他措施萄涯。
注意:對(duì)于那些僅需要普通定時(shí)器API,而不是HPET定時(shí)器的應(yīng)用程序唆鸡,建議使用 rte_get_timer_cycles() 和 rte_get_timer_hz() API調(diào)用涝影,而不是HPET API。 這些通用的API兼容TSC和HPET時(shí)鐘源争占,具體時(shí)鐘源則取決于應(yīng)用程序是否調(diào)用 rte_eal_hpet_init()
初始化燃逻,以及運(yùn)行時(shí)系統(tǒng)上可用的時(shí)鐘。
5.2. 沒(méi)有Root權(quán)限情況下運(yùn)行DPDK應(yīng)用程序
雖然DPDK應(yīng)用程序直接使用了網(wǎng)絡(luò)端口及其他硬件資源臂痕,但通過(guò)許多小的權(quán)限調(diào)整伯襟,可以允許除root權(quán)限之外的用戶運(yùn)行這些應(yīng)用程序。 為了保證普通的Linux用戶也可以運(yùn)行這些程序握童,需要調(diào)整如下Linux文件系統(tǒng)權(quán)限:
- 所有用于hugepage掛載點(diǎn)的文件和目錄姆怪,如 /mnt/huge
- /dev 中的UIO設(shè)備文件,如 /dev/uio0, /dev/uio1 等
- UIO系統(tǒng)配置和源文件舆瘪,如 uio0:
- /sys/class/uio/uio0/device/config
- /sys/class/uio/uio0/device/resource*
- 如果要使用HPET片效,那么 /dev/hpet 目錄也要修改
注意:在某些Linux 安裝中, /dev/hugepages 也是默認(rèn)創(chuàng)建hugepage掛載點(diǎn)的文件英古。
5.3. 電源管理和節(jié)能功能
如果要使用DPDK的電源管理功能淀衣,必須在平臺(tái)BIOS中啟用增強(qiáng)的Intel SpeedStep? Technology。否則召调,sys文件夾下 /sys/devices/system/cpu/cpu0/cpufreq 將不存在膨桥,不能使用基于CPU頻率的電源管理。請(qǐng)參閱相關(guān)的BIOS文檔以確定如何訪問(wèn)這些設(shè)置唠叛。
例如只嚣,在某些Intel參考平臺(tái)上,開(kāi)啟Enhanced Intel SpeedStep? Technology 的路徑為:
Advanced
-> Processor Configuration
-> Enhanced Intel SpeedStep? Tech
此外艺沼,C3 和 C6 也應(yīng)該使能以支持電源管理册舞。C3 和 C6 的配置路徑為:
Advanced
-> Processor Configuration
-> Processor C3 Advanced
-> Processor Configuration
-> Processor C6
5.4. 使用Linux Core隔離來(lái)減少上下文切換
雖然DPDK應(yīng)用程序使用的線程固定在系統(tǒng)的邏輯核上,但Linux調(diào)度程序也可以在這些核上運(yùn)行其他任務(wù)障般。為了防止在這些核上運(yùn)行額外的工作負(fù)載调鲸,可以使用 isolcpus Linux 內(nèi)核參數(shù)來(lái)將其與通用的Linux調(diào)度程序隔離開(kāi)來(lái)盛杰。
例如,如果DPDK應(yīng)用程序要在邏輯核2藐石,4即供,6上運(yùn)行,應(yīng)將以下內(nèi)容添加到內(nèi)核參數(shù)表中:
isolcpus=2,4,6
5.5. 加載 DPDK KNI 內(nèi)核模塊
要運(yùn)行DPDK Kernel NIC Interface (KNI) 應(yīng)用程序于微,需要將一個(gè)額外的內(nèi)核模塊(kni模塊)加載到內(nèi)核中逗嫡。 該模塊位于DPDK目錄kmod子目錄中。與 igb_uio 模塊加載類(lèi)似株依,(假設(shè)當(dāng)前目錄就是DPDK目錄):
insmod kmod/rte_kni.ko
注意:相關(guān)的詳細(xì)信息驱证,可以參閱 “Kernel NIC Interface Sample Application” 章節(jié)和 DPDK 示例程序用戶指南 。
5.6. Linux IOMMU Pass-Through使用Intel? VT-d運(yùn)行DPDK
要在Linux內(nèi)核中啟用Intel? VT-d恋腕,必須配置一系列內(nèi)核選項(xiàng)雷滚,包括:
IOMMU_SUPPORT
IOMMU_API
INTEL_IOMMU
另外,要使用Intel? VT-d運(yùn)行DPDK吗坚,使用igb_uio驅(qū)動(dòng)時(shí)必須攜帶iommu=pt參數(shù)。這使得主機(jī)可以直接通過(guò)DMA重映射查找呆万。另外商源,如果內(nèi)核中沒(méi)有設(shè)置 INTEL_IOMMU_DEFAULT_ON 參數(shù),那么也必須使用 intel_iommu=on 參數(shù)谋减。這可以確保 Intel IOMMU 被正確初始化牡彻。
請(qǐng)注意,對(duì)于igb_uio
驅(qū)動(dòng)程序出爹,使用iommu = pt是必須的庄吼,vfio-pci驅(qū)動(dòng)程序?qū)嶋H上可以同時(shí)使用iommu = pt和iommu = on。
5.7. 40G NIC上的小包處理高性能
由于在最新版本中可能提供用于性能提升的固件修復(fù)严就,因此最好進(jìn)行固件更新以獲取更高的性能总寻。 請(qǐng)和 Intel’s Network Division 工程師聯(lián)系以進(jìn)行固件更新。 用戶可以參考DPDK版本發(fā)行說(shuō)明梢为,以使用 i40e 驅(qū)動(dòng)程序識(shí)別NIC的已驗(yàn)證固件版本渐行。
5.7.1. 使用16B大小的RX描述符
由于 i40e PMD 支持16B和32B的RX描述符,而16B大小的描述符可以幫助小型數(shù)據(jù)包提供性能铸董,因此祟印,配置文件中 CONFIG_RTE_LIBRTE_I40E_16BYTE_RX_DESC 更改為使用16B大小的描述符。
5.7.2. 高性能和每數(shù)據(jù)包延遲權(quán)衡
由于硬件設(shè)計(jì)粟害,每個(gè)數(shù)據(jù)包描述符回寫(xiě)都需要NIC內(nèi)部的中斷信號(hào)蕴忆。中斷的最小間隔可以在編譯時(shí)通過(guò)配置文件中的 CONFIG_RTE_LIBRTE_I40E_ITR_INTERVAL 指定。 雖然有默認(rèn)配置悲幅,但是該配置可以由用戶自行調(diào)整套鹅,這取決于用戶所關(guān)心的內(nèi)容站蝠,整體性能或者每數(shù)據(jù)包延遲。
6. 使用腳本快速構(gòu)建
usertools目錄中的dpdk-setup.sh腳本芋哭,向用戶提供了快速執(zhí)行如下任務(wù)功能:
- 構(gòu)建DPDK庫(kù)
- 加載/卸載DPDK IGB_UIO內(nèi)核模塊
- 加載/卸載VFIO內(nèi)核模塊
- 加載/卸載DPDK KNI內(nèi)核模塊
- 創(chuàng)建/刪除NUMA 或 non-NUMA平臺(tái)的hugepages
- 查看網(wǎng)絡(luò)端口狀態(tài)和預(yù)留給DPDK應(yīng)用程序使用的端口
- 設(shè)置非root用戶使用VFIO的權(quán)限
- 運(yùn)行test和testpmd應(yīng)用程序
- 查看meminfo中的hugepages
- 列出在 /mnt/huge 中的hugepages
- 刪除內(nèi)置的DPDK庫(kù)
對(duì)于其中一個(gè)EAL目標(biāo)沉衣,一旦完成了這些步驟,用戶就可以編譯自己的在EAL庫(kù)中鏈接的應(yīng)用程序來(lái)創(chuàng)建DPDK映像减牺。
6.1. 腳本組織
dpdk-setup.sh腳本在邏輯上組織成用戶按順序執(zhí)行的一系列步驟豌习。每個(gè)步驟都提供了許多選項(xiàng)來(lái)指導(dǎo)用戶完成所需的任務(wù)。以下是每個(gè)步驟的簡(jiǎn)單介紹:
Step 1: Build DPDK Libraries
最開(kāi)始拔疚,用戶必須指定tagert的類(lèi)型以便編譯正確的庫(kù)肥隆。
如本入門(mén)指南前面的章節(jié)描述,用戶必須在此之前就安裝好所有的庫(kù)稚失、模塊栋艳、更新和編譯器。
Step 2: Setup Environment
用戶需要配置Linux* 環(huán)境以支持DPDK應(yīng)用程序的運(yùn)行句各。 可以為NUMA 或non-NUMA系統(tǒng)分配Hugepages吸占。任何原來(lái)已經(jīng)存在的hugepages將被刪除。 也可以在此步驟中插入所需的DPDK內(nèi)核模塊凿宾,并且可以將網(wǎng)絡(luò)端口綁定到此模塊供DPDK使用矾屯。
Step 3: Run an Application
一旦執(zhí)行了其他步驟,用戶就可以運(yùn)行test程序初厚。該程序允許用戶為DPDK運(yùn)行一系列功能測(cè)試件蚕。也可以運(yùn)行支持?jǐn)?shù)據(jù)包接收和發(fā)送的testpmd程序。
Step 4: Examining the System
此步驟提供了一些用于檢查Hugepage映射狀態(tài)的工具产禾。
Step 5: System Cleanup
最后一步具有將系統(tǒng)恢復(fù)到原始狀態(tài)的選項(xiàng)排作。
6.2. Use Cases
以下是使用dpdk-setup.sh的示例。腳本應(yīng)該使用source命令運(yùn)行亚情。腳本中的某些選項(xiàng)在繼續(xù)操作之前提示用戶需要進(jìn)一步的數(shù)據(jù)輸入妄痪。
注意:必須與root權(quán)限運(yùn)行dpdk-setup.sh。
source usertools/dpdk-setup.sh
------------------------------------------------------------------------
RTE_SDK exported as /home/user/rte
------------------------------------------------------------------------
Step 1: Select the DPDK environment to build
------------------------------------------------------------------------
[1] i686-native-linuxapp-gcc
[2] i686-native-linuxapp-icc
[3] ppc_64-power8-linuxapp-gcc
[4] x86_64-native-bsdapp-clang
[5] x86_64-native-bsdapp-gcc
[6] x86_64-native-linuxapp-clang
[7] x86_64-native-linuxapp-gcc
[8] x86_64-native-linuxapp-icc
------------------------------------------------------------------------
Step 2: Setup linuxapp environment
------------------------------------------------------------------------
[11] Insert IGB UIO module
[12] Insert VFIO module
[13] Insert KNI module
[14] Setup hugepage mappings for non-NUMA systems
[15] Setup hugepage mappings for NUMA systems
[16] Display current Ethernet device settings
[17] Bind Ethernet device to IGB UIO module
[18] Bind Ethernet device to VFIO module
[19] Setup VFIO permissions
------------------------------------------------------------------------
Step 3: Run test application for linuxapp environment
------------------------------------------------------------------------
[20] Run test application ($RTE_TARGET/app/test)
[21] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
------------------------------------------------------------------------
Step 4: Other tools
------------------------------------------------------------------------
[22] List hugepage info from /proc/meminfo
------------------------------------------------------------------------
Step 5: Uninstall and system cleanup
------------------------------------------------------------------------
[23] Uninstall all targets
[24] Unbind NICs from IGB UIO driver
[25] Remove IGB UIO module
[26] Remove VFIO module
[27] Remove KNI module
[28] Remove hugepage mappings
[29] Exit Script
Option:
以下選項(xiàng)演示了 “x86_64-native-linuxapp-gcc“ DPDK庫(kù)的創(chuàng)建势似。
Option: 9
================== Installing x86_64-native-linuxapp-gcc
Configuration done
== Build lib
...
Build complete
RTE_TARGET exported as x86_64-native-linuxapp-gcc
以下選項(xiàng)用于啟動(dòng)DPDK UIO驅(qū)動(dòng)程序拌夏。
Option: 25
Unloading any existing DPDK UIO module
Loading DPDK UIO module
以下選項(xiàng)演示了在NUMA系統(tǒng)中創(chuàng)建hugepage。為每個(gè)node分配1024個(gè)2MB的頁(yè)履因。 應(yīng)用程序應(yīng)該使用 -m 4096 來(lái)啟動(dòng)障簿,以便訪問(wèn)這兩個(gè)內(nèi)存區(qū)域。(如果沒(méi)有 -m 選項(xiàng)栅迄,則自動(dòng)完成)站故。
注意:如果顯示提示以刪除臨時(shí)文件,請(qǐng)輸入’y’。
Option: 15
Removing currently reserved hugepages
mounting /mnt/huge and removing directory
Input the number of 2MB pages for each node
Example: to have 128MB of hugepages available per node,
enter '64' to reserve 64 * 2MB pages on each node
Number of pages for node0: 1024
Number of pages for node1: 1024
Reserving hugepages
Creating /mnt/huge and mounting as hugetlbfs
以下操作說(shuō)明了啟動(dòng)測(cè)試應(yīng)用程序以在單個(gè)core上運(yùn)行
Option: 20
Enter hex bitmask of cores to execute test app on
Example: to execute app on cores 0 to 7, enter 0xff
bitmask: 0x01
Launching app
EAL: coremask set to 1
EAL: Detected lcore 0 on socket 0
...
EAL: Master core 0 is ready (tid=1b2ad720)
RTE>>
6.3. 應(yīng)用程序
一旦用戶運(yùn)行和dpdk-setup.sh腳本西篓,構(gòu)建了目標(biāo)程序并且設(shè)置了hugepages愈腾,用戶就可以繼續(xù)構(gòu)建和運(yùn)行自己的應(yīng)用程序或者源碼中提供的示例。
/examples 目錄中提供的示例程序?yàn)榱私釪PDK提供了很好的起點(diǎn)岂津。 以下命令顯示了helloworld應(yīng)用程序的構(gòu)建和運(yùn)行方式虱黄。 按照4.2.1節(jié),”應(yīng)用程序使用的邏輯Core”描述吮成,當(dāng)選擇用于應(yīng)用程序的coremask時(shí)橱乱,需要確定平臺(tái)的邏輯core的布局。
cd helloworld/
make
CC main.o
LD helloworld
INSTALL-APP helloworld
INSTALL-MAP helloworld.map
sudo ./build/app/helloworld -c 0xf -n 3
[sudo] password for rte:
EAL: coremask set to f
EAL: Detected lcore 0 as core 0 on socket 0
EAL: Detected lcore 1 as core 0 on socket 1
EAL: Detected lcore 2 as core 1 on socket 0
EAL: Detected lcore 3 as core 1 on socket 1
EAL: Setting up hugepage memory...
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0add800000 (size = 0x200000)
EAL: Ask a virtual area of 0x3d400000 bytes
EAL: Virtual area found at 0x7f0aa0200000 (size = 0x3d400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9fc00000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9f600000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9f000000 (size = 0x400000)
EAL: Ask a virtual area of 0x800000 bytes
EAL: Virtual area found at 0x7f0a9e600000 (size = 0x800000)
EAL: Ask a virtual area of 0x800000 bytes
EAL: Virtual area found at 0x7f0a9dc00000 (size = 0x800000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9d600000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9d000000 (size = 0x400000)
EAL: Ask a virtual area of 0x400000 bytes
EAL: Virtual area found at 0x7f0a9ca00000 (size = 0x400000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a9c600000 (size = 0x200000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a9c200000 (size = 0x200000)
EAL: Ask a virtual area of 0x3fc00000 bytes
EAL: Virtual area found at 0x7f0a5c400000 (size = 0x3fc00000)
EAL: Ask a virtual area of 0x200000 bytes
EAL: Virtual area found at 0x7f0a5c000000 (size = 0x200000)
EAL: Requesting 1024 pages of size 2MB from socket 0
EAL: Requesting 1024 pages of size 2MB from socket 1
EAL: Master core 0 is ready (tid=de25b700)
EAL: Core 1 is ready (tid=5b7fe700)
EAL: Core 3 is ready (tid=5a7fc700)
EAL: Core 2 is ready (tid=5affd700)
hello from core 1
hello from core 2
hello from core 3
hello from core 0
7. 如何獲取Intel平臺(tái)上網(wǎng)卡的最佳性能
本文檔一步一步教你如何在Intel平臺(tái)上運(yùn)行DPDK程序以獲取最佳性能粱甫。
7.1. 硬件及存儲(chǔ)需求
為了獲得最佳性能泳叠,請(qǐng)使用Intel Xeon級(jí)服務(wù)器系統(tǒng),如Ivy Bridge茶宵,Haswell或更高版本危纫。
確保每個(gè)內(nèi)存通道至少插入一個(gè)內(nèi)存DIMM,每個(gè)內(nèi)存通道的內(nèi)存大小至少為4GB乌庶。 Note: 這對(duì)性能有最直接的影響种蝶。
可以通過(guò)使用 dmidecode 來(lái)檢查內(nèi)存配置:
dmidecode -t memory | grep Locator
Locator: DIMM_A1
Bank Locator: NODE 1
Locator: DIMM_A2
Bank Locator: NODE 1
Locator: DIMM_B1
Bank Locator: NODE 1
Locator: DIMM_B2
Bank Locator: NODE 1
...
Locator: DIMM_G1
Bank Locator: NODE 2
Locator: DIMM_G2
Bank Locator: NODE 2
Locator: DIMM_H1
Bank Locator: NODE 2
Locator: DIMM_H2
Bank Locator: NODE 2
上面的示例輸出顯示共有8個(gè)通道,從 A 到 H瞒大,每個(gè)通道都有2個(gè)DIMM蛤吓。
你也可以使用 dmidecode 來(lái)確定內(nèi)存頻率:
dmidecode -t memory | grep Speed
Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
Configured Clock Speed: Unknown
Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
...
Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
Configured Clock Speed: Unknown
Speed: 2133 MHz
Configured Clock Speed: 2134 MHz
Speed: Unknown
Configured Clock Speed: Unknown
輸出顯示2133 MHz(DDR4)和未知(不存在)的速度。這與先前的輸出一致糠赦,表明每個(gè)通道都有一個(gè)存儲(chǔ)。
7.1.1. 網(wǎng)卡需求
使用 DPDK supported http://dpdk.org/doc/nics 描述的高端NIC锅棕,如Intel XL710 40GbE拙泽。
確保每個(gè)網(wǎng)卡已經(jīng)更新最新版本的NVM/固件。
使用PCIe Gen3 插槽裸燎,如 Gen3 x8 或者 Gen3 x16 顾瞻,因?yàn)镻CIe Gen2 插槽不能提供2 x 10GbE或更高的帶寬。 可以使用 lspci 命令來(lái)檢查PCI插槽的速率:
lspci -s 03:00.1 -vv | grep LnkSta
LnkSta: Speed 8GT/s, Width x8, TrErr- Train- SlotClk+ DLActive- ...
LnkSta2: Current De-emphasis Level: -6dB, EqualizationComplete+ ...
當(dāng)將NIC插入PCI插槽時(shí)德绿,需要查看屏幕輸出荷荤,如 CPU0 或 CPU1,以指示連接的插槽移稳。
同時(shí)應(yīng)該注意NUMA蕴纳,如果使用不同網(wǎng)卡的2個(gè)或更多端口,最好確保這些NIC在同一個(gè)CPU插槽上个粱,下面進(jìn)一步展示了如何確定這一點(diǎn)古毛。
7.1.2. BIOS 設(shè)置
以下是關(guān)于BIOS設(shè)置的一些建議。不同的平臺(tái)可能會(huì)有不同的名字,因此如下僅用于參考:
- 開(kāi)始之前稻薇,請(qǐng)考慮將所有BIOS設(shè)置為默認(rèn)值
- 禁用所有省電選項(xiàng)嫂冻,如電源性能調(diào)整、CPU P-State, CPU C3 Report and CPU C6 Report塞椎。
- 選擇 Performance 作為CPU電源及性能策略桨仿。
- 禁用Turbo Boost以確保性能縮放隨著內(nèi)核數(shù)量的增加而增加。
- 將內(nèi)存頻率設(shè)置為最高可用的值案狠,NOT auto服傍。
- 當(dāng)測(cè)試NIC的物理功能時(shí),禁用所有的虛擬化選項(xiàng)莺戒,如果要使用VFIO伴嗡,請(qǐng)打開(kāi) VT-d if you wants to use VFIO.
7.1.3. Linux引導(dǎo)選項(xiàng)
以下是GRUB啟動(dòng)選項(xiàng)的一些建議配置:
- 使用默認(rèn)的grub文件作為起點(diǎn)
- 通過(guò)grub配置保留1G的hugepage。例如从铲,保留8個(gè)1G大小的頁(yè)面:
default_hugepagesz=1G hugepagesz=1G hugepages=8
隔離將用于DPDK的CPU core.如:
isolcpus=2,3,4,5,6,7,8
如果要使用VFIO瘪校,請(qǐng)使用以下附加的grub參數(shù):
iommu=pt intel_iommu=on
7.2. 運(yùn)行DPDK前的配置
構(gòu)建目標(biāo)文件,預(yù)留hugepage名段。參閱前面 在 Linux 環(huán)境中使用 Hugepages 描述阱扬。
以下命令為具體過(guò)程:
# Build DPDK target.
cd dpdk_folder
make install T=x86_64-native-linuxapp-gcc -j
# Get the hugepage size.
awk '/Hugepagesize/ {print $2}' /proc/meminfo
# Get the total huge page numbers.
awk '/HugePages_Total/ {print $2} ' /proc/meminfo
# Unmount the hugepages.
umount `awk '/hugetlbfs/ {print $2}' /proc/mounts`
# Create the hugepage mount folder.
mkdir -p /mnt/huge
# Mount to the specific folder.
mount -t hugetlbfs nodev /mnt/huge
使用命令 cpu_layout 來(lái)檢查CPU布局:
cd dpdk_folder
usertools/cpu_layout.py
或者運(yùn)行 lscpu 檢查每個(gè)插槽上的core。
檢查NIC ID和插槽ID:
列出所有的網(wǎng)卡的PCI地址及設(shè)備ID.
lspci -nn | grep Eth
例如伸辟,假設(shè)你的輸入如下:
82:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
82:00.1 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
85:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
85:00.1 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
檢測(cè)PCI設(shè)備相關(guān)聯(lián)的NUMA節(jié)點(diǎn):
cat /sys/bus/pci/devices/0000\:xx\:00.x/numa_node
通常的麻惶,0x:00.x 表示在插槽0,而 8x:00.x 表示在插槽1信夫。 Note: 為了說(shuō)去最佳性能窃蹋,請(qǐng)保證core和NIC位于同一插槽中。 在上面的例子中 85:00.0 在插槽1静稻,因此必須被插槽1上的core使用才能獲得最佳性能警没。
將測(cè)試端口綁定到DPDK兼容的驅(qū)動(dòng)程序,如igb_uio振湾。例如杀迹,將兩個(gè)端口綁定到兼容DPDK的驅(qū)動(dòng)程序并檢查狀態(tài):
綁定端口 82:00.0 和 85:00.0 到DPDK驅(qū)動(dòng)
./dpdk_folder/usertools/dpdk-devbind.py -b igb_uio 82:00.0 85:00.0
檢查端口驅(qū)動(dòng)狀態(tài)
./dpdk_folder/usertools/dpdk-devbind.py --status
運(yùn)行 dpdk-devbind.py --help 以獲取更多信息。
有關(guān)DPDK設(shè)置和Linux內(nèi)核需求的更多信息押搪,請(qǐng)參閱 使用源碼編譯DPDK目標(biāo)文件 树酪。
7.3. 網(wǎng)卡最佳性能實(shí)踐舉例
以下是運(yùn)行DPDK l3fwd 例程并獲取最佳性能的例子。使用 Intel 服務(wù)平臺(tái)和Intel XL710 NICs大州。具體的40G NIC配置請(qǐng)參閱i40e NIC指南续语。
本例場(chǎng)景是通過(guò)兩個(gè)Intel XL710 40GbE端口獲取最優(yōu)性能。請(qǐng)參閱 Fig. 7.1 用于性能測(cè)試設(shè)置厦画。
將兩個(gè)Intel XL710 NIC添加到平臺(tái)绵载,并使用每個(gè)卡一個(gè)端口來(lái)獲得最佳性能。使用兩個(gè)NIC的原因是克服PCIe Gen3的限制,因?yàn)樗荒芴峁?0G帶寬娃豹。 對(duì)于兩個(gè)40G端口焚虱,但兩個(gè)不同的PCIe Gen3 x8插槽可以。 請(qǐng)參考上面的示例NIC輸出懂版,然后我們可以選擇 82:00.0 及 85:00.0 作為測(cè)試端口:
82:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
85:00.0 Ethernet [0200]: Intel XL710 for 40GbE QSFP+ [8086:1583]
將端口連接到打流機(jī)鹃栽,對(duì)于高速測(cè)試,最好有專用的打流設(shè)備躯畴。
檢測(cè)PCI設(shè)備的numa節(jié)點(diǎn)民鼓,并獲取該插槽id上的core。 在本例中蓬抄, 82:00.0 和 85:00.0 都在插槽1上丰嘉,插槽1上的core id為18-35 和 54-71。
注意: 不要在同一個(gè)core上使用兩個(gè)邏輯核(e.g core18 有兩個(gè)邏輯核core18 and core54)嚷缭,而是使用來(lái)自不同core的兩個(gè)邏輯核饮亏。
將這兩個(gè)端口綁定到igb_uio。
對(duì)于XL710 40G 端口阅爽,我們需要至少兩個(gè)隊(duì)列來(lái)實(shí)現(xiàn)最佳性能路幸,因此每個(gè)端口需要兩個(gè)隊(duì)列,每個(gè)隊(duì)列將需要專用的CPU內(nèi)核來(lái)接收/發(fā)送數(shù)據(jù)包付翁。
使用DPDK示例程序 l3fwd 做性能測(cè)試简肴,兩個(gè)端口進(jìn)行雙向轉(zhuǎn)發(fā),使用默認(rèn)的lpm模式編譯 l3fwd sample百侧。
運(yùn)行l(wèi)3fwd的命令如下所示:
./l3fwd -c 0x3c0000 -n 4 -w 82:00.0 -w 85:00.0 \
-- -p 0x3 --config '(0,0,18),(0,1,19),(1,0,20),(1,1,21)'
命令表示應(yīng)用程序使用(core18砰识,port0,隊(duì)列0)佣渴,(core19仍翰,port0,隊(duì)列1), (core20观话,port1,隊(duì)列0)越平,(core18频蛔,port1,隊(duì)列1)秦叛。
配置打流機(jī)用于發(fā)包
創(chuàng)建流
設(shè)置報(bào)文類(lèi)型為Ethernet II type to 0x0800晦溪。