1. VMware 添加网卡
网络适配器配置成桥接模式,为DPDK准备的,网络适配器3配置成NAT模式为ssh准备的。
后台服务器:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0
修改网卡的配置信息:
在虚拟机关机状态下,修改虚拟机的.vmx文件, 修改ethernet0.virtualDev 从e1000到vmxnet3, 因为 vmware 的 vmxnet3 支持多队
列网卡
ethernet0.virtualDev = “vmxnet3”
重启虚拟机, 查看网卡, 成功被被配置为vmxnet3,
zhw@zhw:~/zhw/dpdk-stable-19.08.2$ ethtool -i eth0
driver: vmxnet3
version: 1.5.0.0-k-NAPI
firmware-version:
expansion-rom-version:
bus-info: 0000:03:00.0
supports-statistics: yes
supports-test: no
supports-eeprom-access: no
supports-register-dump: yes
supports-priv-flags: no
再看下eth1的网卡
zhw@zhw:~/zhw/dpdk-stable-19.08.2$ ethtool -i eth1
driver: e1000
version: 5.13.0-48-generic
firmware-version:
expansion-rom-version:
bus-info: 0000:02:06.0
supports-statistics: yes
supports-test: yes
supports-eeprom-access: yes
supports-register-dump: yes
supports-priv-flags: no
查看系统是否支持多队列网卡 :
执行: cat /proc/interrupts
因为我这里配置4个CPU, 所以会有4个队列。对应的中断号分别是56、57、58、59。这里虚拟机有多少个CPU就会有多少个队列,如果你有8个CPU则设置亲缘性时要设置8个。
设置中断号的亲缘性:(选择性操作,不操作也可以)
root下:
echo 1 > /proc/irq/56/smp_affinity
echo 2 > /proc/irq/57/smp_affinity
echo 4 > /proc/irq/58/smp_affinity
echo 8 > /proc/irq/59/smp_affinity
上面操作的目的是将4个网卡队列各自绑定到一个CPU。
2. 修改 ubuntu 系统的启动参数(设置巨页)
sudo vim /etc/default/grub
如果是虚拟机:
GRUB_CMDLINE_LINUX改成
GRUB_CMDLINE_LINUX=“find_preseed=/preseed.cfg noprompt net.ifnames=0 biosdevname=0 default_hugepagesz=2M hugepagesz=2M hugepages=1024 isolcpus=0-2”
如果是物理机:
default_hugepages=1G hugepagesz=1G hugepages=20 isolcpus=0-7
sudo update-grub
重启虚拟机
3. 编译 DPDK
下载 dpdk : https://core.dpdk.org/download/
安装依赖包:
apt-get install numactl
apt-get install libnuma-dev
apt-get install net-tools
可以通过 usertools/dpdk-setup.sh , 64 位系统选择 39 编译。
编译完会多出 x86_64-native-linux-gcc 的文件夹 。
但是编译的过程种会有一些错误:
-
/root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni/kni_net.c:737:20: error: initialization of ‘void (*)(struct net_device , unsigned int)’ from incompatible pointer type ‘void ()(struct net_device *)’ [-Werror=incompatible-pointer-types]
.ndo_tx_timeout = kni_net_tx_timeout,解决方法:
cd /root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni
vi kni_net.c
按esc,;set number 737行 然后按i进入插入模式,将报错部分注释掉
-
/root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni/kni_net.c:594:1: error: ‘kni_net_tx_timeout’ defined but not used [-Werror=unused-function]
kni_net_tx_timeout(struct net_device *dev)
解决方法:
cd /root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni
Vi Makefile
找到Makefile,去掉其中-Werror (按esc进入编辑模式, 按“/”再输入关键词Werror找到这行),重新编译。
编译完成,结果如下(第一次比较慢,大概10分钟):
编译完会多出 x86_64-native-linux-gcc 的文件夹
设置 DPDK 的环境变量
export RTE_SDK=/home/dpdk (自己的dpdk目录)
export RTE_TARGET=x86_64-native-linux-gcc
执行 testpmd
执行
usertools/dpdk-setup.sh
- 选择 43 插入 IGB_UIO 模块, 选择网卡为 vmxnet3 会加载此模块
- 选择 44 插入 VFIO 模块,选择网卡为 e1000 会加载此模块
- 选择 49 绑定 igb_uio 模块(我设置失败了), 也可以退出,通过命令来执行(强烈推荐)。
# ifconfig eth0 down
# usertools/dpdk-devbind.py --bind=igb_uio eth0
可能会报错: /usr/bin/env: ‘python’: No such file or directory
sudo ln -s /usr/bin/python3 /usr/bin/python
- 选择 53 运行 testpmd
有的会产生错误:
第三步没有执行成功。
-
testpmd> show port info 0
表示成功了。
编译helloword
进入 example/helloworld ,
可以直接 make,
也可以通过 gcc 命令编译
gcc -o helloword main.c -I /usr/local/include/dpdk/ -ldpdk -lpthread -lnuma -ldl
执行helloworld, 注意一定要用sudo 执行,否则会错误。
sudo ./helloworld -l 0-3 -n 4
可以看到在4个核上跑了。