ovs dpdk编译安装

参考文档

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
上一篇
下一篇