1. 環境準備
配置環境如下:
VMware 12.5.9。
Ubuntu 18.04,64位 (32位系統類似,根據實際情況調整相關編譯參數),虛擬3 個網卡,2*2核cpu,2G內存。
DPDK 19.11.1(LTS),這裏可以下載到你比較中意的其他版本http://static.dpdk.org/rel/。
GCC 7.5。
2. 修改網卡型號
在VMware虛擬環境跑DPDK需要將虛擬網卡修改爲DPDK支持的型號,19.11支持的網卡及其驅動如下,具體請參考官網 doc.dpdk.org/guides-19.11/nics/overview.html。
Feature | a f p a c k e t | a r k | a t l a n t i c | a v f | a v f . . . . . v e c | a v p | a x g b e | b n x 2 x | b n x 2 x v f | b n x t | b o n d i n g | c x g b e | c x g b e v f | d p a a | d p a a 2 | e 1 0 0 0 | e n a | e n e t c | e n i c | f a i l s a f e | f m 1 0 k | f m 1 0 k v f | i 4 0 e | i 4 0 e . . . . v e c | i 4 0 e v f | i 4 0 e v f . . v e c | i f c v f | i g b | i g b v f | i x g b e | i x g b e . . . v e c | i x g b e v f | i x g b e v f . v e c | k n i | l i q u i d i o | m l x 4 | m l x 5 | m v n e t a | m v p p 2 | n e t v s c | n f p | n f p v f | n u l l | o c t e o n t x | p c a p | q e d e | q e d e v f | r i n g | s f c _ e f x | s o f t n i c | s z e d a t a 2 | t a p | t h u n d e r x | v d e v _ n e t v s c | v h o s t | v i r t i o | v i r t i o . . v e c | v m x n e t 3 |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
Speed capabilities | Y | Y | Y | Y | Y | P | P | Y | Y | Y | P | P | P | P | P | P | Y | Y | P | Y | Y | Y | P | Y | Y | Y | P | Y | Y | Y | Y | Y | Y | P | P | Y | P | P | P | |||||||||||||||||||
Link status | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||
Link status event | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||
Removal event | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Queue status event | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Rx interrupt | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||
Lock-free Tx queue | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Fast mbuf free | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Free Tx mbuf on demand | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Queue start/stop | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | P | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||
Runtime Rx queue setup | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Runtime Tx queue setup | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
MTU update | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||
Jumbo frame | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||
Scattered Rx | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||
LRO | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||
TSO | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||
Promiscuous mode | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||
Allmulticast mode | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||
Unicast MAC filter | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | P | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||
Multicast MAC filter | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||
RSS hash | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||
RSS key update | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||
RSS reta update | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||
Inner RSS | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
VMDq | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||
SR-IOV | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||
DCB | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||
VLAN filter | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||
Ethertype filter | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||
N-tuple filter | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||
SYN filter | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||
Tunnel filter | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Flexible filter | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Hash filter | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Flow director | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||
Flow control | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||
Flow API | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||
Rate limitation | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Traffic mirroring | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
Inline crypto | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||||
CRC offload | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||
VLAN offload | Y | Y | P | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | P | Y | Y | Y | Y | Y | P | P | Y | ||||||||||||||||||||||||||||||
QinQ offload | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||
L3 checksum offload | Y | Y | P | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||
L4 checksum offload | Y | Y | P | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||
Timestamp offload | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
MACsec offload | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Inner L3 checksum | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||
Inner L4 checksum | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||
Packet type parsing | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||
Timesync | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Rx descriptor status | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||
Tx descriptor status | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||
Basic stats | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||
Extended stats | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||
Stats per queue | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||
FW version | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||
EEPROM dump | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||||
Module EEPROM dump | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||
Registers dump | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||
LED | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Multiprocess aware | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||
BSD nic_uio | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||
Linux UIO | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||
Linux VFIO | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||
Other kdrv | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||||
ARMv7 | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||||||||||||||||||||||||||||||||
ARMv8 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||
Power8 | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||||||||||||||||||||||||
x86-32 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | |||||||||||||||||||||
x86-64 | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||
Usage doc | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | Y | ||||||||||||||||||||||||||||
Design doc | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
Perf doc |
編輯虛擬機配置文件xx.vmx文件,修改網卡的virtualDev值,如e1000則表示虛擬intel千兆以太網卡。
ethernet1.virtualDev = "e1000"
ethernet2.virtualDev = "e1000"
另外微軟的hyper-v虛擬化環境也可以跑DPDK,但hyper-v無法虛擬出DPDK支持的網卡。在hyper-v環境跑DPDK需要使用netvsc網卡驅動,nstvsc是DPDK提供的hyper-v專用網卡驅動。網卡與netvsc驅動的綁定不能使用dpdk-devbind.py工具,而是另一個工具driverctl,或者手動綁定也可以,官方的幫助文檔給出了詳細的步驟說明。
3. 編譯DPDK源碼
1)首先得安裝依賴
sudo apt install libnuma-dev
2)設置環境變量
export RTE_SDK=/home/walnut/Project/dpdk-stable-19.11.1
3)配置
make defconfig(使用默認配置,配置文件及編譯輸出 至build目錄)
可以手動指定編譯目標模板和目標目錄,如“make config T=x86_64-native-linux-gcc
O=build-x64”,O=build-x64指定編譯輸出目標目錄,不指定O參數則默認輸出至build目錄。
使用make showconfigs可查看支持的目標模板。
4)愉快地編譯吧
make EXTRA_CFLAGS="-O0 -g"
4. 加載內核驅動
modprobe uio
insmod $RTE_SDK/build/kmod/igb_uio.ko
5. 綁定網卡驅動
1)首先使用python腳本dpdk-devbind.py查看網卡狀態
./usertools/dpdk-devbind.py --status
可以查看到物理地址,當前驅動等信息,如下所示。
如果被綁定的網卡爲Active狀態,需要先禁用,ifconfig xxxx down,然後再綁定。
Network devices using DPDK-compatible driver
============================================
<none>Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=igb_uio *Active*Other Network devices
=====================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' unused=e1000,igb_uio
0000:02:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' unused=e1000,igb_uio
2)綁定網卡2和3的驅動爲igb_uio
./usertools/dpdk-devbind.py -b igb_uio 02:06.0 02:07.0
3) 綁定完事後,不要着急,先看看綁定狀態,確保已經成功
./usertools/dpdk-devbind.py --status
如果drv=igb_uio,即表示網卡當前驅動爲igb_uio,恭喜你,的確綁定成功,可以往下走了。
Network devices using DPDK-compatible driver
============================================
0000:02:06.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000
0000:02:07.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' drv=igb_uio unused=e1000Network devices using kernel driver
===================================
0000:02:01.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens33 drv=e1000 unused=igb_uio *Active*
6. 設置大頁內存
echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
7. 編譯示例程序
編譯helloworld
cd examples/helloworld
make
運行helloworld
./build/helloworld
結果如下
EAL: Detected 4 lcore(s)
EAL: Probing VFIO support...
EAL: NUMA support not available consider that all memory is in socket_id 0
EAL: PCI device 0000:02:01.0 on NUMA socket 0
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:06.0 on NUMA socket 0
EAL: probe driver: 8086:100f net_e1000_em
EAL: PCI device 0000:02:07.0 on NUMA socket 0
EAL: probe driver: 8086:100f net_e1000_em
hello from core 1
hello from core 2
hello from core 3
hello from core 0