DPDK: 编译及“Hello World”

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=e1000

Network 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

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章