参考文档
https://docs.openvswitch.org/en/latest/intro/install/dpdk/
https://docs.openvswitch.org/en/latest/intro/install/general/
https://docs.openvswitch.org/en/latest/howto/dpdk/
DPDk编译安装
1、前期准备
系统要求:Debian 11(bullseye)
# deb包
apt install meson python3-pip build-essential m4 flex bison libssl-dev pkg-config uuid
# python3库
pip3 install pyelftools
编译安装libpcap
wget https://www.tcpdump.org/release/libpcap-1.10.4.tar.gz
tar -xvf libpcap-1.10.4.tar.gz && cd libpcap-1.10.4
./configure
make && make install
2、下载dpdk源码,进入源码目录
cd /usr/src/
wget https://fast.dpdk.org/rel/dpdk-22.11.1.tar.xz
tar xf dpdk-22.11.1.tar.xz
export DPDK_DIR=/usr/src/dpdk-stable-22.11.1
cd $DPDK_DIR
3、使用meson配置与安装dpdk
export DPDK_BUILD=$DPDK_DIR/build
meson build
ninja -C build
ninja -C build install
ldconfig
检查安装结果
pkg-config --modversion libdpdk
# 22.11.1
详情可查询官方文档 DPDK documentation.
OVS编译安装DPDK
OVS 可以使用不同的方法安装。为了让 OVS 使用 DPDK,它必须配置为针对 DPDK 库构建。
1、下载ovs源码
cd /usr/src/
wget https://www.openvswitch.org/releases/openvswitch-3.1.1.tar.gz
tar -xf openvswitch-3.1.1.tar.gz && cd openvswitch-3.1.1
2、使用dpdk时,必须采用 --with-dpdk
标志进行编译,以下为几种使用方式
如果 OVS 必须使用 DPDK 静态库(也等同于 --with-dpdk=yes ):
./configure --with-dpdk=static
如果 OVS 必须使用 DPDK 共享库:
./configure --with-dpdk=shared
注意:与静态 DPDK 库相比,将 OVS 与共享 DPDK 库结合使用时,预计会有轻微的性能损失。
推荐启用AVX512 优化
./configure --with-dpdk=static CFLAGS="-Ofast -msse4.2 -mpopcnt"
3、编译安装
./configure --with-dpdk=static CFLAGS="-Ofast -msse4.2 -mpopcnt"
make -j 20
make install
配置大页
1、配置大页
分配若干个2M的大页,这里配置2048个
# 持久化生效
echo 'vm.nr_hugepages=2048' >> /etc/sysctl.conf
# 临时生效
sysctl -w vm.nr_hugepages=2048
检测配置结果
grep HugePages_ /proc/meminfo
# 输出:
HugePages_Total: 2048
HugePages_Free: 2048
HugePages_Rsvd: 0
HugePages_Surp: 0
挂载大页
mount -t hugetlbfs none /dev/hugepages
注意:所需的大页面内存量会受到数据路径和设备配置的各个方面的影响。更多信息参考DPDK Device Memory Models
配置DPDK设备使用VFIO
使用最新版本的 DPDK 时,VFIO 优于 UIO 驱动程序。 VFIO 支持需要内核和 BIOS 的支持。对于前者,必须使用 > 3.6 的内核版本。对于后者,您必须在 BIOS 中启用 VT-d 并确保这是通过 grub 配置的。要确保通过 BIOS 启用 VT-d,请运行:
dmesg | grep -e DMAR -e IOMMU
如果VT-d没有在bios中开启,请开启。
要确保在内核中启用 VT-d,请运行:
cat /proc/cmdline | grep iommu=pt
cat /proc/cmdline | grep intel_iommu=on
如果VT-d没有在内核中运行,请启用
编辑/etc/default/grub
,添加iommu=pt intel_iommu=on
GRUB_CMDLINE_LINUX="iommu=pt intel_iommu=on"
编译生成新配置后重启主机
grub-mkconfig -o /boot/grub/grub.cfg
正确配置 VT-d 后,加载所需的模块并将 NIC 绑定到 VFIO 驱动程序。
modprobe vfio-pci
/usr/bin/chmod a+x /dev/vfio
/usr/bin/chmod 0666 /dev/vfio/*
export DPDK_DIR=/usr/src/dpdk-stable-22.11.1
# 绑定eth2,也可通过pcie编号绑定
$DPDK_DIR/usertools/dpdk-devbind.py --bind=vfio-pci eth2
$DPDK_DIR/usertools/dpdk-devbind.py --status
启用OVS
仅启动ovs数据库,不启动vswitch
export PATH=$PATH:/usr/local/share/openvswitch/scripts
ovs-ctl --no-ovs-vswitchd --system-id=`uuid` start
启动vswtich
export PATH=$PATH:/usr/local/share/openvswitch/scripts
export DB_SOCK=/usr/local/var/run/openvswitch/db.sock
ovs-vsctl --no-wait set Open_vSwitch . other_config:dpdk-init=true
ovs-ctl --no-ovsdb-server --db-sock="$DB_SOCK" start
使用带有dpdk的ovs
添加一个用户空间网桥,datapath_type=netdev
# 创建用户空间的网桥
ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
添加dpdk设备,dpdk-devargs
是指定设备的pci号码;
ovs-vsctl add-port br0 p0 -- set Interface p0 type=dpdk \
options:dpdk-devargs=0000:01:00.0
ovs-vsctl add-port br0 p1 -- set Interface p1 type=dpdk \
options:dpdk-devargs=0000:01:00.1
注意:在 DPDK 端口添加到交换机后,轮询线程不断轮询 DPDK 设备并消耗 cpu核心100%的利用率
要停止 ovs-vswitchd 并删除网桥,请运行:
ovs-appctl -t ovs-vswitchd exit
ovs-appctl -t ovsdb-server exit
ovs-vsctl del-br br0