配置环境如下:
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。
在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,或者手动绑定也可以,官方的帮助文档给出了详细的步骤说明。
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"
modprobe uio
insmod $RTE_SDK/build/kmod/igb_uio.ko
1)首先使用python脚本dpdk-devbind.py查看网卡状态
./usertools/dpdk-devbind.py --status
可以查看到物理地址,当前驱动等信息,如下所示。
如果被绑定的网卡为Active状态,需要先禁用,ifconfig xxxx down,然后再绑定。
Network devices using DPDK-compatible driver
============================================
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*
echo 256 > /sys/kernel/mm/hugepages/hugepages-2048kB/nr_hugepages
mkdir -p /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
编译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