Unbuntu18.04 配置DPDK

文章目录

    • 1. VMware 添加网卡
    • 2. 修改 ubuntu 系统的启动参数(设置巨页)
    • 3. 编译 DPDK

1. VMware 添加网卡

网络适配器配置成桥接模式,为DPDK准备的,网络适配器3配置成NAT模式为ssh准备的。

后台服务器:https://course.0voice.com/v1/course/intro?courseId=5&agentId=0

Unbuntu18.04 配置DPDK_第1张图片

修改网卡的配置信息:

在虚拟机关机状态下,修改虚拟机的.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

Unbuntu18.04 配置DPDK_第2张图片

因为我这里配置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

Unbuntu18.04 配置DPDK_第3张图片

如果是虚拟机:

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/

Unbuntu18.04 配置DPDK_第4张图片

安装依赖包:

apt-get install numactl

apt-get install libnuma-dev

apt-get install net-tools

可以通过 usertools/dpdk-setup.sh , 64 位系统选择 39 编译。

Unbuntu18.04 配置DPDK_第5张图片

编译完会多出 x86_64-native-linux-gcc 的文件夹 。

但是编译的过程种会有一些错误:

  1. /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进入插入模式,将报错部分注释掉
    Unbuntu18.04 配置DPDK_第6张图片

  2. /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)
    img

    解决方法:
    cd /root/dpdk/dpdk-stable-19.08.2/x86_64-native-linuxapp-gcc/build/kernel/linux/kni
    Vi Makefile
    找到Makefile,去掉其中-Werror (按esc进入编辑模式, 按“/”再输入关键词Werror找到这行),重新编译。
    在这里插入图片描述

​ 编译完成,结果如下(第一次比较慢,大概10分钟):

Unbuntu18.04 配置DPDK_第7张图片

编译完会多出 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

Unbuntu18.04 配置DPDK_第8张图片

  1. 选择 43 插入 IGB_UIO 模块, 选择网卡为 vmxnet3 会加载此模块
  2. 选择 44 插入 VFIO 模块,选择网卡为 e1000 会加载此模块
  3. 选择 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

  1. 选择 53 运行 testpmd

Unbuntu18.04 配置DPDK_第9张图片

​ 有的会产生错误:

Unbuntu18.04 配置DPDK_第10张图片

​ 第三步没有执行成功。

  1. testpmd> show port info 0

    Unbuntu18.04 配置DPDK_第11张图片

​ 表示成功了。

编译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

Unbuntu18.04 配置DPDK_第12张图片

可以看到在4个核上跑了。

你可能感兴趣的:(DPDK,网络,linux,服务器)