【DPDK】使用 Open vSwitch * 采用 DPDK 帧间 VM NFV 应用程序

一、概述

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

使用 OVS 与 DPDK 为我们提供了巨大的性能优势。类似于其它基于 DPDK 的应用,我们可以看到激增网络数据包吞吐量和更低的延迟。

Inside OVS 的多个性能热点区域是还优化使用 DPDK 的数据包处理库。例如,经优化转发平面可作为单独的 vswitch 后台程序 (vswitchd) 的线程运行在用户空间。DPDK 优化 vHost 来宾接口的实现支持高性能 VM 到 VM 或 PHY 的虚拟机的 PHY 类型使用案例。

本文档中,我们将展示分步指导如何使用 DPDK 的 OVS 配置虚拟机间的应用程序使用情况。具体而言,我们将使用 DPDK vhost 用户的 2 个端口创建 OVS vSwitch 桥接。每个端口将挂接到单独的虚拟机。然后,我们将运行简单 iperf3 吞吐量测试以确定的业绩。我们将使我们可以看到提高多少 dpdk 的 OVS 为我们提供的性能与中的非 DPDK 的 OVS 配置中,将进行比较。

 

可以通过在通用 Linux * 发行版本的标准包安装程序安装 open vSwitch。但由于默认情况下不启用 DPDK 支持,我们需要构建 dpdk 的 Open vSwitch,我们可以继续操作之前。

有关安装和使用 DPDK 的 OVS 的详细的步骤可在OvS 与 DPDK 安装手册 》在本文中,我们将介绍的基本步骤,并专门 DPDK vhost 用户使用案例。

 

二、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 或以上所述"DPDK vhost 用户前提条件"下OvS 与 DPDK 安装指南.

 

三、构建面向 OVS 的 DPDK 目标

要编译 dpdk 的 OVS,我们需要下载 DPDK 源代码并准备好其目标环境。DPDK 使用更多详细信息,请参阅http://www.dpdk.org/doc/guides/linux_gsg/index.html下面的代码段显示的基本步骤:

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

 

四、构建与 DPDK 的 OVS

采用内置 DPDK 目标环境中,我们现在可以下载最新的 OVS 来源和构建它具有启用 DPDK 支持。OVS 与 DPDK 生成的标准文档是OvS 与 DPDK 安装手册 》此处我们将介绍的基本步骤。

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

我们现在拥有了完整的 OVS 采用 DPDK 支持启用。$OVS_DIR/实用程序可以找到所有标准 OVS 实用程序,并在 $OVS_DIR/ovsdb OVS DB /。我们将为我们的下一步骤,在这些位置下使用这些实用程序。

 

五、创建 OVS DB 和启动 ovsdb server

我们可以开始主守护程序"ovs 的 ovs-vswitchd"之前,我们需要初始化 OVS DB 启动 ovsdb 服务器。以下命令告诉您如何清除/创建一个新的 OVS DB 和 ovsdb_server 实例。

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

 

六、对于 OVS DPDK 使用配置主机和网络接口卡

DPDK 要求的主机系统以支持 hugepages,并需要与用户空间 DPDK 轮询模式驱动程序 (PMD) 启用的 nic 进行通信。

要启用 hugepages 并使用 VFIO 用户空间驱动程序,附加的参数所示为中的 GRUB_CMDLINE_LINUX /etc/default/grub,然后运行 grub 更新并重新启动系统:

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

这取决于您的系统中的可用内存,可调整的数量和类型的 hugepages。isolcpus参数使我们能够隔离某些 Linux 计划程序上,从 Cpu,从而基于 DPDK 的应用程序对他们可以"锁定"。

一旦系统重新启动、 检查内核 cmdline 和分配作为 hugepages 如下所示。

下一步是安装 hugepages 文件系统和加载vfio-pci用户空间驱动程序。

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

下面的屏幕快照显示了使用上述命令的输出的示例。请注意,由于 DPDK v16.07 dpdk_nic_bind.py 更改为$DPDK_DIR/tools/dpdk devbind.py。

如果目标的使用案例仅为 VM 到 VM,并且使用无物理网卡,我们可以跳过上述 NIC vfio-pci 驱动,步骤。

 

七、启动 ovs 的 ovs-vswitchd

我们拥有 OVS 数据库配置和设置 OVS DPDK 使用主机。下一步是开始主ovs 的 ovs-vswitchd过程。

1 modprobe openvswitch
2 $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 用户端口虚拟机间的使用案例。

我们示例测试用例,我们将创建一座桥梁,并添加两个 DPDK vhost 用户端口。或者,我们可以添加 vfio-pci 驱动,物理网络接口卡我们先前配置。

 

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

下面的屏幕快照显示了最后的 OVS 配置。

 

 

九、与虚拟机使用 DPDK vhost 用户端口

创建虚拟机不在本文档的范围。一旦我们有两个虚拟机创建 (例如,f21vm1.qcow2 和 f21vm2.qcow2),以下命令将显示如何使用 DPDK vhost 用户端口我们之前创建。

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

 

十、与 iperf3 简单的 DPDK vhost 用户虚拟机间性能

登录到虚拟机,并具有静态 IP 同一个子网上配置 Nic。安装iperf3 ,然后再运行简单的网络测试。

一台虚拟机,在服务器模式iperf3 -s启动iperf3并运行客户端iperf3下面的屏幕快照显示样本结果。

 

十二、复制与标准的 OVS (无 DPDK) 的性能测试

我们在前面几节中创建,并用于 OVS-DPDK 生成的 $OVS_DIR 文件夹,然后重试。我们未安装它在系统上。复制与标准的 OVS (非 DPDK) 测试用例,我们可以只需从安装标准分发版安装程序。例如,在基于 yum (或基于 dnf) 系统中,我们可能会安装为:

 1 pkill -9 ovs
 2 
 3 yum install openvswitch
 4 
 5 rm -f /etc/openvswitch/conf.db
 6 mkdir -p /var/run/openvswitch
 7 ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
 8 ovsdb-server --remote=punix:/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
 9 ovs-vsctl --no-wait init
10 
11 ovs-vswitchd unix:/var/run/openvswitch/db.sock --pidfile --detach
12 
13 ovs-vsctl add-br br0
14 ovs-vsctl show

至此,我们已安装最新的 OVS 数据库配置和非 DPDK 的 ovs 的 ovs-vswitchd 进程已启动。

要为分路器设备非 DPDK 的 OVS 网桥 (br0) 上配置两个虚拟机,请参阅文档Open vSwitch kvm中的说明。然后启动虚拟机使用相同的图像我们以前使用,例如:

1 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
2 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。我们将介绍如何使用 DPDK vhost 用户虚拟机的英特尔® 应用程序使用案例的端口配置简单的 OVS 桥。我们展示了采用iperf3性能指标评测,性能提升将采用 DPDK 和不 DPDK 的 OVS 进行比较。

 

十四、作者简介

Ashok Emani 拥有超过 14 年的嵌入式/系统编程,存储/IO 技术、 计算机架构、 虚拟化和性能分析/性能指标评测的工作经验,是英特尔公司高级软件工程师。他目前致力于研究 SDN/NFV 支持的项目。

有关编译器优化的更完整信息,请参阅我们的优化通知.

 

posted @ 2017-07-24 10:08  howardgoogle  阅读(893)  评论(0)    收藏  举报