Basic
- VMware Workstation Pro 17
- 虚拟机 Ubuntu2204
- DPDK stable-24.11.3
如果有问题,欢迎评论区交流 ~ 如需要,后期上传 ova 文件。
虚拟机设置
- 网卡要多虚拟几个
- 当使用 vfio 驱动,需要 IOMMU支持 开启 AMD-V/RVI (开了这个,wsl可能就用不了。所以,这次没用vfio驱动。)
宿主机设置
同上,设置 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