在虚拟机间NFV应用上使用采用DPDK的Open vSwitch

时间:2022-05-06
本文章向大家介绍在虚拟机间NFV应用上使用采用DPDK的Open vSwitch,主要内容包括概述、OVS和DPDK要求、面向OVS构建DPDK目标、Building OVS with DPDK、创建OVS DB并启动ovsdb-server、配置用于OVS DPDK的主机和网卡、开始ovs-vswitchd、使用带虚拟机的DPDK vhost-user端口、使用iperf3进行简单测试获得的DPDK vhost-user虚拟机间性能、复制标准OVS的性能测试(不带 DPDK)、总结、基本概念、基础应用、原理机制和需要注意的事项等,并结合实例形式分析了其使用技巧,希望通过本文能帮助到大家理解应用这部分内容。

概述

数据平面开发套件(DPDK)可提供高性能的数据包处理库和用户空间驱动程序。自Open vSwitch(OVS)2.4版 (http://openvswitch.org/releases/NEWS-2.4.0)起,我们将可在OVS中使用DPDK优化的vHost路径。OVS自2.2版起开始提供DPDK支持。

将DPDK与OVS结合使用可为我们带来诸多性能优势。与其他基于DPDK的应用相同,我们可以在OVS中看到网络包吞吐量显著提升,延迟显著降低。

此外,DPDK包处理库还对OVS内的多个性能热点区域进行了优化。例如,转发平面进行了优化,能够作为单独的vSwitch后台程序线程在用户空间内运行(虚拟交换)。实施DPDK优化的vHost客户机界面,虚拟机-虚拟机或物理机-虚拟机-物理机类型使用案例可获得出色的性能。

在本文中,我们将逐步展示如何面向虚拟机间应用使用案例配置采用DPDK的OVS。具体来说,我们将创建一个带有两个DPDK vhost-user端口的OVS vSwitch桥。每个端口与一个虚拟机相连。然后,我们将运行一个简单的iperf3吞吐量测试来确定性能。 我们将该性能与非 DPDK OVS 配置的性能进行比较,以便观察采用DPDK的OVS能为我们带来多少性能提升。

Open vSwitch可通过常见Linux*发行版本上的标准包安装程序进行安装。但是系统在默认情况下未启用DPDK支持,我们需要使用DPDK构建Open vSwitch才可以继续。

安装和使用采用DPDK的OVS的具体步骤:https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md。在本文中,我们将介绍基本步骤,尤其是DPDK vhost-user使用案例。

OVS和DPDK要求

在编译DPDK或OVS前,确保您满足全部要求:http://dpdk.org/doc/guides/linux_gsg/sys_reqs.html#compilation-of-the-dpdk

标准Linux分发版中的开发工具包通常能够满足大部分要求。

比如,在基于 yum (或基于 dnf)的分发版上,您可以使用以下安装命令:

yum install "@Development Tools" automake tunctl kernel-tools "@Virtualization Platform" "@Virtualization" pciutils hwloc numactl

此外,还需确保系统上的 qemu 版本是 v2.2.0 或更高版本,如https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md 中的“DPDK vhost-user 前提条件”

面向OVS构建DPDK目标

如要构建采用 DPDK 的 OVS,我们需要下载 DPDK 源代码并准备其目标环境。 关于 DPDK 使用的更多详细信息,请参阅:http://www.dpdk.org/doc/guides/linux_gsg/index.html。 以下代码片段展示了基本步骤:

curl -O http://dpdk.org/browse/dpdk/snapshot/dpdk-2.1.0.tar.gz
tar -xvzf dpdk-2.1.0.tar.gz
cd dpdk-2.1.0
export DPDK_DIR=`pwd`
sed 's/CONFIG_RTE_BUILD_COMBINE_LIBS=n/CONFIG_RTE_BUILD_COMBINE_LIBS=y/' -i config/common_linuxapp
make install T=x86_64-ivshmem-linuxapp-gcc
cd x86_64-ivshmem-linuxapp-gcc
EXTRA_CFLAGS="-g -Ofast" make -j10

Building OVS with DPDK

借助 DPDK 目标环境 built,我们现在可以下载最新的 OVS 源,并将其与支持的 DPDK 构建起来。 采用 DPDK build 的 OVS 的标准文档:https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md。 在下文中,我们将介绍基本步骤。

git clone https://github.com/openvswitch/ovs.git
cd ovs
export OVS_DIR=`pwd`
./boot.sh
./configure --with-dpdk="$DPDK_DIR/x86_64-ivshmem-linuxapp-gcc/" CFLAGS="-g -Ofast"
make 'CFLAGS=-g -Ofast -march=native' -j10

现在,我们已经获得带DPDK支持的完整OVS built。所有的标准OVS实用程序均位于$OVS_DIR/utilities/下和 $OVS_DIR/ovsdb/下的OVS DB。 我们将使用上述位置下的实用程序来完成接下来的步骤。

创建OVS DB并启动ovsdb-server

在开始主要的OVS后台程序“ovs-vswitchd”前,我们需要初始化OVS DB并启动ovsdb-server。以下命令展示了如何清除或创建一个新的OVS DB和ovsdb_server实例。

pkill -9 ovs
rm -rf /usr/local/var/run/openvswitch
rm -rf /usr/local/etc/openvswitch/
rm -f /usr/local/etc/openvswitch/conf.db
mkdir -p /usr/local/etc/openvswitch
mkdir -p /usr/local/var/run/openvswitch
cd $OVS_DIR
./ovsdb/ovsdb-tool create /usr/local/etc/openvswitch/conf.db ./vswitchd/vswitch.ovsschema
./ovsdb/ovsdb-server --remote=punix:/usr/local/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
./utilities/ovs-vsctl --no-wait init

配置用于OVS DPDK的主机和网卡

DPDK需要使用主机系统来支持hugepage,并且需要启用网卡以便配合用户空间DPDK轮询模式驱动程序(PMD)使用。

为支持hugepage并使用VFIO用户空间驱动程序,将参数附加至下列/etc/default/grub中的GRUB_CMDLINE_LINUX,然后运行 grub更新并重启系统:

default_hugepagesz=1G hugepagesz=1G hugepages=16 hugepagesz=2M hugepages=2048 iommu=pt intel_iommu=on isolcpus=1-13,15-27
grub2-mkconfig -o /boot/grub2/grub.cfg
reboot

hugepage 的数量和类型可根据系统中的可用内存进行调整。 isolcpus 参数支持我们将某些 CPU 与 Linux 调度程序隔离,以便基于 DPDK 的应用能够锁定到这些 CPU 上。

重启系统后,查看内核 cmdline 并按照如下方式分配 hugepage。

接下来是安装 hugepage 文件系统,加载 vfio-pci 用户空间驱动程序。

mkdir -p /mnt/huge
mkdir -p /mnt/huge_2mb
mount -t hugetlbfs hugetlbfs /mnt/huge
mount -t hugetlbfs none /mnt/huge_2mb -o pagesize=2MB
 
modprobe vfio-pci
cp $DPDK_DIR/tools/dpdk_nic_bind.py /usr/bin/.
dpdk_nic_bind.py --status
dpdk_nic_bind.py --bind=vfio-pci 05:00.1

以下截图展示了使用上述命令编写的样本输出。

如果目标使用案例仅为虚拟机-虚拟机,不使用任何物理 NIC,那么我们可以跳过上述的 NIC vfio-pci 步骤。

开始ovs-vswitchd

我们配置了 OVS DB,并面向 OVS DPDK 用途设置了主机。 接下来是启动主要 ovs-vswitchd 流程。

modprobe openvswitch
$OVS_DIR/vswitchd/ovs-vswitchd --dpdk -c 0x2 -n 4 --socket-mem 2048 -- unix:/usr/local/var/run/openvswitch/db.sock --pidfile --detach

面向虚拟机间使用案例创建一个桥和 DPDK vhost-user 端口。

对于我们的示例测试案例,我们将创建一个桥并添加两个 DPDK vhost-user 端口。 或者,我们可以添加之前配置的 vfio-pci 物理网卡。

$OVS_DIR/utilities/ovs-vsctl show
$OVS_DIR/utilities/ovs-vsctl add-br br0 -- set bridge br0 datapath_type=netdev
$OVS_DIR/utilities/ovs-vsctl add-port br0 dpdk0 -- set Interface dpdk0 type=dpdk
$OVS_DIR/utilities/ovs-vsctl add-port br0 vhost-user1 -- set Interface vhost-user1 type=dpdkvhostuser
$OVS_DIR/utilities/ovs-vsctl add-port br0 vhost-user2 -- set Interface vhost-user2 type=dpdkvhostuser

下面的截图展示了最终的OVS配置。

使用带虚拟机的DPDK vhost-user端口

创建虚拟机不在本文的讨论范围。 我们创建两个虚拟机(如 f21vm1.qcow2 和 f21vm2.qcow2)后,以下的命令将会显示如何使用我们之前创建的 DPDK vhost-user 端口。

qemu-system-x86_64 -m 1024 -smp 4 -cpu host -hda ~/f21vm1.qcow2 -boot c -enable-kvm -no-reboot -nographic -net none 
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/vhost-user1 
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce 
-device virtio-net-pci,mac=00:00:00:00:00:01,netdev=mynet1 
-object memory-backend-file,id=mem,size=1024M,mem-path=/dev/hugepages,share=on 
-numa node,memdev=mem -mem-prealloc
 
qemu-system-x86_64 -m 1024 -smp 4 -cpu host -hda ~/f21vm2.qcow2 -boot c -enable-kvm -no-reboot -nographic -net none 
-chardev socket,id=char1,path=/usr/local/var/run/openvswitch/vhost-user2 
-netdev type=vhost-user,id=mynet1,chardev=char1,vhostforce 
-device virtio-net-pci,mac=00:00:00:00:00:02,netdev=mynet1 
-object memory-backend-file,id=mem,size=1024M,mem-path=/dev/hugepages,share=on 
-numa node,memdev=mem -mem-prealloc

使用iperf3进行简单测试获得的DPDK vhost-user虚拟机间性能

登录虚拟机,并在同一个子网上使用静态IP配置NIC。安装iperf3,然后运行简单的网络测试。

在一个虚拟机上,在服务器模式iperf3 -s下启动iperf3,然后运行客户机iperf3。下面的截图展示了示例结果。

复制标准OVS的性能测试(不带 DPDK)

在上面的部分中,我们在$OVS_DIR文件夹内创建并使用了OVS-DPDK build;我们没有将其安装在系统上。 对于复制使用标准OVS(非 DPDK)的测试案例,我们只需要从标准发行安装程序进行安装即可。 例如,在基于yum(或基于 dnf)的系统上,我们可以按照如下方式安装:

pkill -9 ovs
 
yum install openvswitch
 
rm -f /etc/openvswitch/conf.db
mkdir -p /var/run/openvswitch
ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
ovsdb-server --remote=punix:/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
ovs-vsctl --no-wait init
 
ovs-vswitchd unix:/var/run/openvswitch/db.sock --pidfile --detach
 
ovs-vsctl add-br br0
ovs-vsctl show

此时,我们已经配置了更新OVS DB,并启动了非 DPDK ovs-vswitchd 流程。

如要在使用非 DPDK OVS 桥 (br0) 连接的设备上配置两个虚拟机,请参考http://openvswitch.org/support/dist-docs-2.4/INSTALL.KVM.md.txt 中的说明。 然后使用我们之前使用的映像启动虚拟机,例如:

qemu-system-x86_64 -m 512 -smp 4 -cpu host -hda ~/f21vm1c1.qcow2 -boot c -enable-kvm -no-reboot -nographic -net nic,macaddr=00:11:22:EE:EE:EE -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown
 
qemu-system-x86_64 -m 512 -smp 4 -cpu host -hda ~/f21vm1c2.qcow2 -boot c -enable-kvm -no-reboot -nographic -net nic,macaddr=00:11:23:EE:EE:EE -net tap,script=/etc/ovs-ifup,downscript=/etc/ovs-ifdown

重复我们之前操作的简单iperf3性能测试。以下是示例输出;您的具体结果取决于您的系统配置。

如上文所示,我们注意到,OVS DPDK的性能得到显著提升。两个性能测试均在相同的系统上执行,唯一的区别是一个使用标准 OVS,另一个使用采用DPDK的OVS。

总结

Open vSwitch 2.4版支持DPDK,能够带来诸多性能优势。在本文中,我们展示了如何构建并使用采用DPDK的OVS。我们介绍了如何配置一个简单的 OVS桥,其中包括面向虚拟机间应用使用案例配置的DPDK vhost-user端口。 我们以 iperf3为测试基准,对采用和未采用DPDK的OVS进行了比较,并展示了前者的性能提升。