Ovs+Dpdk简单实践

一、Dpdk简介

Dpdk是X86平台报文快速处理的库和驱动的集合,不是网络协议栈,不提供二层,三层转发功能,不具备防火墙ACL功能,但通过DPDK可以轻松的开发出上述功能。优势在于通过Dpdk,可以将用户态的数据,不经过内核直接转发到网卡,实现加速目的。主要架构如图1.1所示。在intel的大力发展下,Dpdk已经基本建立了自己的生态系统,比较完善的文档以及各种开发范例都可以在http://www.dpdk.org/下载到,目前最新的发行版本是V16.01。

图1.1

二、Ovs+Dpdk编译与安装

目前Ovs的最新发行版版本为v2.5.0,根据Ovs的官方文档,由于Qemu早期版本不支持vhost-usertype,所以qemu版本必须在v2.1以上。虽然qemu版本更新很快,但是我们测试机器采用的是Centos7.1系统,Centos官方升级包中支持的qemu版本较低,所以我们使用了符合要求的较低版本Qemuv2.2以防止出现新的问题。Qemu编译安装时间比较长,需要提前去qemu官网下载对应版本,并安装。
Step1:下载Ovs和Dpdk相关版本
wgethttp://openvswitch.org/releases/openvswitch-2.5.0.tar.gz
wgethttp://www.dpdk.org/browse/dpdk/snapshot/dpdk-16.04.tar.gz

Step2:清理环境,因为Ovs+Dpdk,需要Ovs在编译时link到Dpdk的lib库,所以如果环境原来已经安装有Ovs,也需要先卸载掉,重新编译安装。

Step3:编译Dpdk
修改配置文件config/common_linuxapp,这里我们测试vhost模式,所以需要把下面两个配置项,配置为yes。

Step 4:安装Dpdk
新建一个安装目录 mkdir -p /usr/src/dpdk

Step 5:编译相关模块

Step 6:安装ovs

Step7:安装相关内核模块

三、环境准备

Step1:启动namespace ovs

Step2:配置hugepage
1)查看当前hugepage配置

2)修改hugepage页数为1024

3)挂载

Step3:启动dpdk和ovs

这里socket-mem400,400的含义是,在socket0和socket1上分别分配400MB的内存给dpdk使用。
Step4:将网口绑定为Dpdk设备
在/Dpdk/tools目录下,有一个网口绑定工具,使用这个工具可以将eth设备绑定为Dpdk设备(绑定的目的是修改网口的驱动)
dpdk_nic_bind.py --bind=igb_uio eth1
使用这个工具也可以查看当前网卡驱动的绑定情况,图2.1中显示,两个82599ES网口一个使用内核驱动,一个使用DPDK驱动。

图2.1

四、简单测试

测试环境选择在两台物理机上分别通过Dpdk网口,创建两台虚拟机,使用netperf工具来测试两台虚拟机之间的网络性能。Ovs+Dpdk和Ovs本身之间的区别可以由图3.1简单来表示。

图3.1

虚拟机以及Dpdk的bridge和port之间的结构如图3.2所示:

图3.2

先通过ovs命令,创建相关bridge和port:

在bridge和port创建好以后,ip addr命令的相关网口部分如下:
36: br0: mtu 1500 qdisc pfifo_fast state UNKNOWNqlen 500
link/ether 16:8e:6a:b6:4f:44 brdff:ff:ff:ff:ff:ff
inet 6.0.0.101/24 brd 6.0.0.255 scopeglobal br0
valid_lft forever preferred_lft forever
inet6 fe80::148e:6aff:feb6:4f44/64 scopelink
valid_lft forever preferred_lft forever

37: br1: mtu 1500 qdisc pfifo_fast state UNKNOWNqlen 500
link/ether ec:f4:bb:e9:2b:4a brdff:ff:ff:ff:ff:ff
inet7.0.0.1/24 brd 7.0.0.255 scope global br1
valid_lft forever preferred_lft forever
inet6 fe80::eef4:bbff:fee9:2b4a/64 scopelink
valid_lft forever preferred_lft forever
通过ovs创建的bridge和port如图3.2下:

图3.2

Dpdk相关port创建好以后,一个简单的方法可以判断一下Dpdk端口是否创建成功,如果成功,通过top命令可以看到/usr/local/sbin/ovs-vswitchd进程的cpu使用率会一直保持在100%。

两台物理机上采用相同的方式来配置bridge和port。然后启动虚拟机。在Ovs的官方文档中,虚拟机的启动都是采用命令的方式,在命令中进行相关参数的配置。类似下面这样的:

很多人喜欢使用xml文件的方式来启动虚拟机。这种命令转换为xml文件也很简单,可以使用qemu commands的方式:

因为使用了Dpdk,数据包从虚拟机出来以后,直接送到了物理网卡,不经过内核,所以常规的Tcpdump抓包工具无法奏效。这里我们可以使用Ovs的dummy模块进行镜像抓包。根据抓包结果来确定是否真正的走了vxlan协议。

图3.3是使用Dpdk和不使用Dpdk网络性能对比情况,明显可以看出,使用Dpdk以后,网络性能有了显著提高,特别是TCP_CRR这种应用,性能提高了10倍以上。

图3.3

四、问题

Ovs+Dpdk实际使用中的问题,主要来源于两个方面。一方面由于Dpdk+Ovs涉及到kernel、Qemu、Ovs、Libvirt等不同项目,各个模块都存在bug,比如Ovs的watchdog crash问题、Qemu中关于vhost socket断开以后,需要重启虚拟机才能恢复正常的问题、Dpdk使用了huagepage,当系统内存使用紧张时,会出现虚拟机网络延时变大的问题,以及GCC编译器版本不同带来的Ovs程序crash问题等等。虽然Ovs项目中正式纳入Dpdk时间已经比较长,但是真正在生产环境部署,还有很多问题需要解决。另一方面由于Ovs天生的性能方面的缺陷,当集群规模非常大的时候,Ovs性能迅速下降。今年由思科,爱立信以及intel主导的开源项目Vpp+Dpdk(https://fd.io/)横空出世,基本解决了Ovs的性能瓶颈问题。Vpp是思科一项成熟技术(目前Ovs拥有的功能,Vpp基本都有),通过和Dpdk的结合,在性能方面带来了质的提升。图4.1是思科提供给的一些测试数据,随着routes增加Vpp+Dpdk能做到性能不下降,而Ovs+Dpdk性能会出现急剧下降。

图4.1

五、展望

实验室中的测试相对简单,从测试到生产环境,还有很多的路需要走。特别是Dpdk作为一个新生事物,Ovs+Dpdk如何跟Openstack,以及nova、neutron的结合、网络复杂以后,各port的mtu值如何来设定、libvirtd中qemu commands格式的xml文件如何转换为适合openstack使用的xml文件格式、Dpdk资源池的大小该设为多少等等我们都做了一些探索性工作,这些工作我们会在后期和大家逐步分享。
 
来源:JD南京研发


  • 本站原创文章仅代表作者观点,不代表SDNLAB立场。所有原创内容版权均属SDNLAB,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用,转载须注明来自 SDNLAB并附上本文链接。 本站中所有编译类文章仅用于学习和交流目的,编译工作遵照 CC 协议,如果有侵犯到您权益的地方,请及时联系我们。
  • 本文链接https://www.sdnlab.com/16593.html
分享到:
相关文章
条评论

登录后才可以评论

SDNLAB君 发表于16-04-20
18