在虚拟机间 NFV 应用上使用采用 DPDK 的 Open vSwitch*
来源:互联网 发布:顶速网络机顶盒 编辑:程序博客网 时间:2024/05/29 14:58
概述
数据平面开发套件 (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。 以下代码片段展示了基本步骤:
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
Building OVS with DPDK
借助 DPDK 目标环境 built,我们现在可以下载最新的 OVS 源,并将其与支持的 DPDK 构建起来。 采用 DPDK build 的 OVS 的标准文档:https://github.com/openvswitch/ovs/blob/master/INSTALL.DPDK.md。 在下文中,我们将介绍基本步骤。
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
现在,我们已经获得带 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 实例。
01
pkill
-
9
ovs
02
rm
-
rf
/
usr
/
local
/
var
/
run
/
openvswitch
03
rm
-
rf
/
usr
/
local
/
etc
/
openvswitch
/
04
rm
-
f
/
usr
/
local
/
etc
/
openvswitch
/
conf.db
05
mkdir
-
p
/
usr
/
local
/
etc
/
openvswitch
06
mkdir
-
p
/
usr
/
local
/
var
/
run
/
openvswitch
07
cd $OVS_DIR
08
.
/
ovsdb
/
ovsdb
-
tool create
/
usr
/
local
/
etc
/
openvswitch
/
conf.db .
/
vswitchd
/
vswitch.ovsschema
09
.
/
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 需要使用主机系统来支持 hugepage,并且需要启用网卡以便配合用户空间 DPDK 轮询模式驱动程序 (PMD) 使用。
为支持 hugepage 并使用 VFIO 用户空间驱动程序,将参数附加至下列 /etc/default/grub 中的 GRUB_CMDLINE_LINUX,然后运行 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
hugepage 的数量和类型可根据系统中的可用内存进行调整。 isolcpus
参数支持我们将某些 CPU 与 Linux 调度程序隔离,以便基于 DPDK 的应用能够锁定到这些 CPU 上。
重启系统后,查看内核 cmdline 并按照如下方式分配 hugepage。
接下来是安装 hugepage 文件系统,加载 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
以下截图展示了使用上述命令编写的样本输出。
如果目标使用案例仅为虚拟机-虚拟机,不使用任何物理 NIC,那么我们可以跳过上述的 NIC vfio-pci 步骤。
开始 ovs-vswitchd
我们配置了 OVS DB,并面向 OVS DPDK 用途设置了主机。 接下来是启动主要 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-user 端口。
对于我们的示例测试案例,我们将创建一个桥并添加两个 DPDK vhost-user 端口。 或者,我们可以添加之前配置的 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-user 端口
创建虚拟机不在本文的讨论范围。 我们创建两个虚拟机(如 f21vm1.qcow2 和 f21vm2.qcow2)后,以下的命令将会显示如何使用我们之前创建的 DPDK vhost-user 端口。
01
qemu
-
system
-
x86_64
-
m
1024
-
smp
4
-
cpu host
-
hda ~
/
f21vm1.qcow2
-
boot c
-
enable
-
kvm
-
no
-
reboot
-
nographic
-
net none \
02
-
chardev socket,
id
=
char1,path
=
/
usr
/
local
/
var
/
run
/
openvswitch
/
vhost
-
user1 \
03
-
netdev
type
=
vhost
-
user,
id
=
mynet1,chardev
=
char1,vhostforce \
04
-
device virtio
-
net
-
pci,mac
=
00
:
00
:
00
:
00
:
00
:
01
,netdev
=
mynet1 \
05
-
object
memory
-
backend
-
file
,
id
=
mem,size
=
1024M
,mem
-
path
=
/
dev
/
hugepages,share
=
on \
06
-
numa node,memdev
=
mem
-
mem
-
prealloc
07
08
qemu
-
system
-
x86_64
-
m
1024
-
smp
4
-
cpu host
-
hda ~
/
f21vm2.qcow2
-
boot c
-
enable
-
kvm
-
no
-
reboot
-
nographic
-
net none \
09
-
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-user 虚拟机间性能
登录虚拟机,并在同一个子网上使用静态 IP 配置 NIC。 安装 iperf3
,然后运行简单的网络测试。
在一个虚拟机上,在服务器模式 iperf3 -s
下启动 iperf3
,然后运行客户机 iperf3
。 下面的截图展示了示例结果。
复制标准 OVS 的性能测试(不带 DPDK)
在上面的部分中,我们在 $OVS_DIR 文件夹内创建并使用了 OVS-DPDK build;我们没有将其安装在系统上。 对于复制使用标准 OVS (非 DPDK)的测试案例,我们只需要从标准发行安装程序进行安装即可。 例如,在基于 yum (或基于 dnf)的系统上,我们可以按照如下方式安装:
01
pkill -
9
ovs
02
03
yum install openvswitch
04
05
rm -f /etc/openvswitch/conf.db
06
mkdir -p /var/run/openvswitch
07
ovsdb-tool create /etc/openvswitch/conf.db /usr/share/openvswitch/vswitch.ovsschema
08
ovsdb-server --remote=punix:/var/run/openvswitch/db.sock --remote=db:Open_vSwitch,Open_vSwitch,manager_options --pidfile --detach
09
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 DB,并启动了非 DPDK ovs-vswitchd 流程。
如要在使用非 DPDK OVS 桥 (br0) 连接的设备上配置两个虚拟机,请参考http://openvswitch.org/support/dist-docs-2.4/INSTALL.KVM.md.txt 中的说明。 然后使用我们之前使用的映像启动虚拟机,例如:
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
3
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 进行了比较,并展示了前者的性能提升。
关于作者
Ashok Emani 是英特尔公司的高级软件工程师,在生成嵌入式/系统编程、存储/I/O 技术、计算机架构、虚拟化和性能分析/基准测试方面有超过 14 年的工作经验。 他目前正在从事 SDN/NFV 支持项目。
- 在虚拟机间 NFV 应用上使用采用 DPDK 的 Open vSwitch*
- 在虚拟机间 NFV 应用上使用采用 DPDK 的 Open vSwitch
- DPDK在虚拟机上的安装和使用
- Open vSwitch的使用
- 在 Ubuntu 12.04 上安装 Open vSwitch
- 在 Ubuntu 12.04 上安装 Open vSwitch
- Open vSwitch实践 -- 通过VXLUN技术让不同物理机上的虚拟机互通
- DPDK-pktgen在虚拟机上安装
- Open vSwitch 使用
- Open vSwitch使用笔记
- Open vSwitch 使用
- Open vSwitch使用笔记
- Open vSwitch 使用
- Open vSwitch使用笔记
- Open vSwitch使用笔记
- Open vSwitch 使用
- Open vSwitch 使用
- Open vSwitch使用笔记
- 让Delphi的DataSnap发挥最大效率
- 在硅谷初创公司怎么找投资人
- UIPikerView的属性
- PAT 1009 Product of Polynomials (25)
- andorid_activity简单的入门
- 在虚拟机间 NFV 应用上使用采用 DPDK 的 Open vSwitch*
- 我的java并发编程学习笔记
- 硬件之SPI时序
- 单点最短路径算法 bellman-ford模板和队列优化后的spfa算法模板
- UIScrollView
- BZOJ1188 [HNOI2007]分裂游戏(SG函数)
- U3D实验系列之深度测试一(in unity5.2.2)
- 支持多客户端的spring+memcached
- 第13课 spark内核架构解密学习笔记