1 设置巨页的方法(如果使用辅助工具安装,可以在辅助工具内设置巨页)
- 如果使用辅助工具安装,可以在辅助工具内设置巨页
- 如果使用辅助工具安装,请跳到2.4
1.1 设置1G巨页(在虚拟机成功,在计算平台未成功)
-
查看是否支持hpet,如果不支持则无输出内容,需要在BIOS中开启:
grep hpet /proc/timer_list
-
修改grub文件
vim /etc/default/grub
, 在GRUB_CMDLINE_LINUX
中加入如下配置:default_hugepagesz=1G hugepagesz=1G hugepages=4
- 下面是找的其他的,弄成这个,我的虚拟机就挂了
default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=2048 iommu=pt intel_iommu=on isolcpus=1-15,16-31
-
修改后的grub文件示例如下
GRUB_TIMEOUT=5 GRUB_DISTRIBUTOR="$(sed 's, release .*$,,g' /etc/system-release)" GRUB_DEFAULT=saved GRUB_DISABLE_SUBMENU=true GRUB_TERMINAL_OUTPUT="console" GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap default_hugepagesz=1G hugepagesz=1G hugepages=4 rhgb quiet" GRUB_DISABLE_RECOVERY="true"
-
编译grub配置文件
grub2-mkconfig -o /boot/grub2/grub.cfg
- 重启
reboot
- 查看是否设置成功
cat /proc/meminfo | grep Huge
1.2 设置2mb页
- 查看系统当前巨页设置
cat /proc/meminfo | grep Huge
- 输入
lscpu
查看系统架构,可以知道是numa架构,并且有4个node节点
- 对于NUMA结构,要显示的对每一个node节点设置巨页数量
echo 1024 > /sys/devices/system/node/node0/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node1/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages
echo 1024 > /sys/devices/system/node/node3/hugepages/hugepages-2048kB/nr_hugepages
- 在 DPDK 中使用 Hugepages
mkdir /mnt/huge
mount -t hugetlbfs nodev /mnt/huge
2 安装过程
2.1 选择合适版本下载
- http://core.dpdk.org/doc/archives/ 这个网址可以通过查看文档,看到不同DPDK版本对linux内核和python的要求,linux默认安装的python是2.x版本,dpdk的新版本要求python版本为3.x,所以如果仅仅学习目的,可以安装dpdk旧版本
- 输入
uname -r
查看linux内核版本
2.2 虚拟机准备(如果你不是虚拟机,请跳过)
2.2.1 网卡设置
-
vm默认只有一个虚拟网卡,为了成功运行testpmd实例,需要额外添加两个网卡
-
打开vm,
虚拟机
->设置
-
最后如下所示,即已经给vm虚拟机设置了三个网卡
2.2.2 其他配置
- 内存 > 1g,越大越好,因为要设置巨页
- 核心至少为2,因为有一个会专门用于dpdk
2.3 方法1 : 源代码编译 DPDK (推荐使用内置辅助工具,请跳过2.3,直接从2.4开始)
2.4 方法2 : 使用内置工具辅助
-
解压 :
tar xJf dpdk-<version>.tar.xz
,之后进入目录cd dpdk-<version>
-
cd dpdk-<version>/tools
-
如果你是在虚拟机上安装dpdk,请额外做如下操作,由于虚拟机的网卡不支持某些中断,所以需要修改源代码,跳过pci检查
cd /root/dpdk-stable-16.11.11/lib/librte_eal/linuxapp/igb_uio/
vim igb_uio.c
- 定位到435行,找到如下代码
case RTE_INTR_MODE_LEGACY: if (pci_intx_mask_supported(dev)) { dev_dbg(&dev->dev, "using INTX"); udev->info.irq_flags = IRQF_SHARED; udev->info.irq = dev->irq; udev->mode = RTE_INTR_MODE_LEGACY; break; } dev_notice(&dev->dev, "PCI INTX mask not supported\n"); /* fall back to no IRQ */
- 注释三行代码成为如下
case RTE_INTR_MODE_LEGACY: //if (pci_intx_mask_supported(dev)) { dev_dbg(&dev->dev, "using INTX"); udev->info.irq_flags = IRQF_SHARED; udev->info.irq = dev->irq; udev->mode = RTE_INTR_MODE_LEGACY; break; //} //dev_notice(&dev->dev, "PCI INTX mask not supported\n"); /* fall back to no IRQ */
- 完成
-
source dpdk-setup.sh
-
选择13 :
[13] x86_64-native-linuxapp-gcc
,输入数字13
,然后摁回车,等待编译完成
- 接着选择16
[16] Insert IGB UIO module
-
接着选择17
[17] Insert VFIO module
-
选择20,给NUMA结构计算机设置巨页
[20] Setup hugepage mappings for NUMA systems
,自己输入数字,这里我输入的是1024,输入的数字最好超过128
-
输入21可以查看当前网络设备情况
[21] Display current Ethernet/Crypto device settings
,可以看出,有三个网卡绑定在内核上,接下来要做的就是选取两个网卡,将其绑定到dpdk,由于ens33是active状态,所以这里选择ens37和ens38- 绑定两个网卡是由于在运行testpmd的时候,必须有偶数个端口,也就是至少两个网卡才可以
-
之后输入33退出,接下来要进行的步骤是将网卡绑定到dpdk上,但是为了,将来解绑网卡后,将网卡方便的绑回内核,要提前记录下网卡的信息
-
输入
ifconfig
查看网卡名称,可以看到有三个因特尔网卡,ens33,ens37,ens38
-
我们计划将ens37和ens38绑定到dpdk上,所以要提前记录这两个网卡的信息,输入
ethtool -i ens37
driver: e1000 version: 7.3.21-k8-NAPI firmware-version: expansion-rom-version: bus-info: 0000:02:05.0 supports-statistics: yes supports-test: yes supports-eeprom-access: yes supports-register-dump: yes supports-priv-flags: no
-
其中
driver: e1000
即为ens37
网卡驱动类型。相关的,还有ixgbe、igbe、i40e
等驱动类型。这里要记录驱动类型driver: e1000
和对应的pci地址bus-info:0000:02:05.0
这两条信息。 -
之后就可以继续绑定网卡,等待之后解绑网卡后,将网卡绑定回内核的时候,需要参考这里记录的信息
-
-
再次进入
source dpdk-setup.sh
中,选择[22] Bind Ethernet/Crypto device to IGB UIO module
-
绑定两个网卡,之后输入21可以查看如下情况,表明已经将两个网卡绑定到dpdk
3 运行实例
-
运行实例之前先配置环境变量
-
进入实例目录
/root/dpdk-stable-16.11.11/examples/helloworld
-
配置环境变量
export RTE_SDK=/root/dpdk-stable-16.11.11
export RTE_TARGET=x86_64-native-linuxapp-gcc
-
3.1 运行helloworld
-
输入
cd examples/helloworld/
-
输入
make
-
cd /root/dpdk-stable-16.11.11/examples/helloworld/build/app
-
./helloworld -c f -n 4
3.2 运行testpmd
-
cd /root/dpdk-stable-16.11.11/tools/
-
source dpdk-setup.sh
-
选择
[26] Run testpmd application in interactive mode ($RTE_TARGET/app/testpmd)
-
输入stop结束,并且可以看到收发包情况
-
输入
quit
,推出命令行模式