dpdk-1.环境搭建

99 阅读2分钟

Basic

  • VMware Workstation Pro 17
  • 虚拟机 Ubuntu2204
  • DPDK stable-24.11.3

如果有问题,欢迎评论区交流 ~ 如需要,后期上传 ova 文件。

虚拟机设置

  • 网卡要多虚拟几个
  • 当使用 vfio 驱动,需要 IOMMU支持 开启 AMD-V/RVI (开了这个,wsl可能就用不了。所以,这次没用vfio驱动。) image.png

宿主机设置

同上,设置 AMD-V/RVI 启动报错(使用vfio驱动可忽略)
VMware 不支持CPU虚拟化的解决方法

打开 * .vmx 文件,将 ethernet0.virtualDev 由 e1000 修改为 vmxnet3. ⭐
因为 vmware 的 vmxnet3 支持多队列网卡。

编译安装dpdk

sudo apt update
sudo apt install -y build-essential libnuma-dev pkg-config linux-modules-extra-$(uname -r)

sudo apt install python3-pip

pip3 install meson ninja
pip3 install pyelftools

echo 'export PATH="$HOME/.local/bin:$PATH"' >> ~/.bashrc
source ~/.bashrc  # 生效配置

wget https://fast.dpdk.org/rel/dpdk-24.11.3.tar.xz
tar -xf dpdk-24.11.3.tar.xz
cd dpdk-stable-24.11.3

mkdir dpdklib
mkdir dpdkbuild

meson -Denable_kmods=true -Dprefix=/home/yang/soft/dpdk-stable-24.11.3/dpdklib/ dpdkbuild/

ninja -C dpdkbuild
cd dpdkbuild
ninja install
# 在 ~/.bashrc 添加
vim ~/.bashrc

export PKG_CONFIG_PATH=/home/yang/soft/dpdk-stable-24.11.3/dpdklib/lib/x86_64-linux-gnu/pkgconfig/:$PKG_CONFIG_PATH
export LD_LIBRARY_PATH=/home/yang/soft/dpdk-stable-24.11.3/dpdklib/lib/x86_64-linux-gnu/:$LD_LIBRARY_PATH

source ~/.bashrc

网卡加载dpdk驱动

grep CONFIG_VFIO_PCI /boot/config-$(uname -r)
# 显示 CONFIG_VFIO_PCI=y 表示该模块直接编译进内核里。无需modprobe加载。

#加载 vfio 驱动 (物理机 这个需要IOMMU)
sudo modprobe vfio-pci

# 虚拟机用 uio_pci_generic 驱动
sudo modprobe uio_pci_generic

lsmod | grep vfio_pci
# 查找PCI设备
for dev in /sys/class/net/*; do
    if [ -e "$dev/device/uevent" ]; then
        echo -n "网口名称: $(basename $dev)  "
        grep "PCI_SLOT_NAME" "$dev/device/uevent" | cut -d= -f2
    fi
done
网口名称: ens160  0000:03:00.0
网口名称: ens192  0000:0b:00.0
网口名称: ens224  0000:13:00.0
网口名称: ens36  0000:02:04.0
# 虚拟机
./dpdk-devbind.py --bind=uio_pci_generic 0000:03:00.0

# 检查状态
./dpdk-devbind.py --status 

显示状态

Network devices using DPDK-compatible driver (绑定到dpdk网卡的)
============================================
0000:03:00.0 'VMXNET3 Ethernet Controller 07b0' drv=uio_pci_generic unused=vmxnet3,vfio-pci

Network devices using kernel driver (绑定内核驱动的网卡)
===================================
0000:02:04.0 '82545EM Gigabit Ethernet Controller (Copper) 100f' if=ens36 drv=e1000 unused=vfio-pci,uio_pci_generic *Active*
0000:0b:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens192 drv=vmxnet3 unused=vfio-pci,uio_pci_generic 
0000:13:00.0 'VMXNET3 Ethernet Controller 07b0' if=ens224 drv=vmxnet3 unused=vfio-pci,uio_pci_generic 

如果需要卸载网口

./dpdk-devbind.py -u 0000:03:00.0

大页内存

# 查看大页内存设置
cat /proc/meminfo | grep Huge 

vim /etc/default/grub

# 修改 GRUB_CMDLINE_LINUX_DEFAULT 
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash intel_iommu=on default_hugepagesz=1G hugepagesz=1G hugepages=10"

update-grub
# 重启后生效
reboot

编译 Helloworld 示例

cd ./examples/helloworld
make

# -c 0x3 十六进制 11(从右往左数,第0,1位为1)程序会绑定到 CPU 核心0和核心1。
# -n 4  内存通道数。(常见值2,4等,取决于CPU和主板配置)
./build/helloworld -c 0x3 -n 4