SDN实战团分享(一):OpenStack网络服务数据平面加速
来源:互联网 发布:淘宝最近总是查侵权 编辑:程序博客网 时间:2024/06/06 07:01
【编者的话】本文系SDN实战团微信群(团主张宇峰@brocade)组织的首次线上技术分享整理而成,由IBM云网络服务团队资深架构师唐刚将其团队内部对于如何在openstack环境下实现高性能的网络服务而做的研究进行分享。
分享嘉宾
--------------------------------------------------------------------------------------------------
唐刚,IBM云网络服务团队资深架构师。曾参与IBM 5000V虚拟交换机和SDNVE(基于IBM DOVE - distributed overlay virtual Ethernet技术)产品的架构设计和实现。目前主要研究方向为通过使用DPDK架构在OpenStack中实现高性能的网络服务和网关。
-----------------------------------------------------------------------------------------------------
大家晚上好。那我们开始吧。主要还是抛装引玉,互相学习交流。今天和大家分享下面一些内容:
1.关于openstack中VNF网络性能的一些思考和思路
2.相关的开源项目
3.OVS 2.4 DPDK with IVSHMEM/vHost-user(w/DPDK) 和vHost (w/oDPDK)性能测试数据
4.后续可以一起来做的一些工作
第一部分 关于openstack中VNF网络性能的一些思考和思路
先来介绍一下背景,目前openstack社区版本的一些网络服务如routing,fip,snat,fw,vpn,lb,数据平面都是linux network stack来实现的,linux network stack的性能其实不是很好,尤其是对小包的处理。
如果我们看pps的话,通常一个core可以支持0.2M~0.5M packet per second,而如果需要在10g网卡上实现64byte小包的线速转发,需要14.88Mpps的处理能力,所以这里还是有很大的提升空间。
像brocade的vrouter和其它的一些商业方案,据说已经可以支持10Mpps以上的处理能力。从vswitch的角度,OVS2.4已经增加了对DPDK tunnel和DPDK vhost的支持。虽然ovs在它的文档上有说明,这些还只是实验性质的,但我们认为这块的支持最终会走向成熟,我们再测试ovs dpdk的性能时,在两块物理网卡之间已经可以支持10Mpps的转发能力。如果ovs dpdk最终被采纳的话,那么openstack网络中的一些vnf将成为瓶颈。
所以我们研究的方向是如何在openstack环境下实现高性能的网络服务OpenStackOpenStack L3-agent, LBaaS, FWaaS, VPNaaS, etc。为了实现这个目标,有两部分主要的工作需要考虑:
- 其一,需要高性能的userspace network stack,并且可以使用dpdk来做完网络i/o接口;
- 其二,需要在openstack环境下实现相应的driver,包括创建userspace ovs,创建vnf实例,创建vnf到ovs的特殊的通道(vHost-user or IVSHMEM)。
第二部分 相关开源项目openstack和opnfv
openstack那个项目我们有尝试去使用,不过还没有成功。下面我们来看一下实现高性能网络服务需要考虑的一些因素(这几个图片其实是取自intel的一些文档):
这里ovs-switchd是运行在用户态的进程,通过dpdk pmd直接从物理网卡抓取和发送报文,要实现高性能的vnf,需要:
- 高性能的ovs
- 高性能的vnf到ovs的通道
- 高性能的vnf 网络堆栈
关于高性能的网络堆栈,其实有一些选择,intel也给了一些推荐
当然这些项目在实际去用的时候还有许多坑,文档也不够,需要投入人力去尝试,intel这个链接有更详细的介绍:
https://software.intel.com/en-us/blogs/2015/06/12/user-space-networking-fuels-nfv-performance
我们尝试过rumpkernel,花了好些时间终于跑通了,但是性能还是没有达到预期,大概能到1Mpps,比linux好一点点,有可能是没有配置好的原因,后面会进行更多的尝试。关于用户态网络堆栈的介绍就到这。
第三部分 OVS 2.4 DPDK withIVSHMEM/vHost-user(w/DPDK)和vHost (w/oDPDK)性能测试
下面介绍一下ovs2.4的测试,后面我会把这个测试报告和大家分享,这个报告主要测试的是ovs连接虚拟网卡的性能。
连接物理网卡的性能比虚拟网卡来说还是好很多,使用10G物理网卡时,单向流量,128byte以上基本上可以达到线速,刚才的介绍有提到,vnf是通过虚拟网卡连接到ovs的,所以我们更关心虚拟网卡的性能。
1. Toolsused
•Packet Generators
a) Dpdk-Pktgenfor max pps measurements.
b) Netperfto measure bandwidth and latency.
•Test servers
a) CPU:2 sockets Intel(R) Xeon(R) CPU E5-2650 v3 @ 2.30GHz, 10 cores per scoket.
b) RAM:64 Gbytes.
• NIC cards are Intel10-Gigabit X540-AT2.
• Kernel used is Linux3.13.0-53-generic .
第一个实验是测试IVSHMEM的pps,我们使用dpdk-pktgen来产生报文,基本上可以打出线速的报文。虚拟机转发的程序使用ring client,在ovs的安装目录下有。
类似的拓扑用来测vhost user和vhost
测vhost的时候用的是ovs 的kernel datapath
下面是用netperf测试性能的拓扑
用netperf测试vhost-user和vhost的拓扑与上图类似,我就不在贴了,下面看一下最后的数据:
可以看到ovs+dpdk比ovs kernel datapath在小包的处理上优势还是很明显的。ivshmem性能更是强上一大截,如图:
这个是netperf的,大家看到ovs+vhost只有不到2G,可能会认为和平时使用的感觉不一致,这主要是因为我们测试的vnf没有使用gro的原因。
第四部分 后续可以一起来做的一些工作
最后再介绍一下后续可以做的一些工作,有兴趣的同学可以私聊,一起来做一些研究:
1.测试ovs 2.4 dpdk vxlan的性能和ovs 2.4 user space patch interface的性能
2.研究用户态网络堆栈与dpdk的集成,比如Libuinet, mTCP, libusnet
3.在openstack环境下用新的neutron L2 driver来使用ovs+dpdk
其中第3个主要是去试用刚才说的两个开源项目,可参考如下链接:
https://github.com/stackforge/networking-ovs-dpdk
https://wiki.opnfv.org/open_vswitch_for_nfv
好,时间有点超过了,我的介绍就到这。大家有什么问题?
Q&A环节
-----------------------------------------------------------------------------------------------------
郭瑞景
Q1:Ovs 2.4快要release
A:ovs 2.4应该是8月24日就release了
HongLiang
Q2:正常大包的开销低。你这个测试小包性能高,有问题。
A:前面那个单位是pps,是报文的个数,大包到后面就已经到线速了,没法再高了
Q3:1500是0.8,64是6。那个大那个小?你这结果有问题,再好好测测
A1:64byte虽然是6mpps,但是只只是达到线速的6/14.88=43%,1500是0.8,但是已经是线速的0.8/0.82=97%。
A2:测试数据是pps 你换算成bps就直观了
A3:1500的包,在0.8pps的速率时已经接近线速了
wl
Q3:对于DPDK门外汉,问个问题如何可以降低学习成本或者比较好的学习路线
A:dpdk有一些example,可以去跑这些example;dpdk的包中包含example的source code;dpdk的文档也有介绍这些example如何使用,及example的代码介绍
郭瑞景
Q4:你的测试都在Openstack里做的么?其实我真正的问题是openstack 多少特性用了dpdk?
A1:测试没有在openstack的环境,目前社区版本的openstack还没有使用dpdk
猫叔
Q5:目前这些实现, 能挂仪表测性能吗? Smartbits or STC
A1:可以挂物理测试仪从物理网卡打包,但是因为我们测试的是虚拟网卡的性能所以用物理仪器打包并不是关键
风雨兼程-Kevin
Q6:你们的研究是用在nfv项目吗?对于neutron项目也适用吗?
A1:最终是做到集成到neutron中使用
Q7:userspace network stack 后续你们会重点做吗?
A1:yes
张宇峰@Brocade
Q8:听说Intel之前有 Neutreon OVS DPDK 优化的 open stack 版本,后来砍掉了往主线trunk版本里merge,你们会利用吗?
A1:我想你说的那个就是我刚才介绍的openstack当中那个项目。
zhang xin
Q9:你们做的事情能不能独立出来,所有stack都能用?网络归网络,理论上没必要跟openstack紧耦合啊
A1:是的,但目前在OpenStack的应用更迫切一些。
-----------------------------------------------------------------------------------------------------
SDN实战团微信群由Brocade中国区CTO张宇峰领衔组织创立,携手SDN Lab及海内外SDN/NFV/云计算产学研生态系统相关领域实战技术牛,每周都会组织定向的技术及业界动态分享,欢迎感兴趣的同学加微信:eigenswing,进群参与,您有想听的话题可以给我们留言。
本文主要介绍DVR的概念,比较了DVR和非DVR情况下,数据在network节点上的流量变化。同时也介绍了在OpenStack里面如何配置DVR,比较详细地介绍了在DVR激活的情况下,数据包的流表情况。
DVR 简介
DVR 提出的背景
在Neutron的网络环境中,跨子网的虚机通信是需要通过Neutron的路由器。这既包括不同子网的虚拟机之间的通信,又包括虚拟机与外网之间的通信。在DVR被提出之前,由于Neutron的legacy router只会部署在网络节点上,因此会造成网络节点的流量过大,从而产生了两个问题,其一是网络节点将成为整个Neutron网络的瓶颈,其二是网络节点单点失败的问题。在这样的背景下,OpenStack社区在Juno版本里正式引入了DVR(Distributed Virtual Router)。DVR,顾名思义就是Neutron的router将不单单部署在网络节点上,所有启动了Neutron L3 Agent的节点,都会在必要时在节点上创建Neutron router对应的 namepsace,并更新与DVR router相关的Openflow规则,从而完成DVR router在该节点上的部署。在计算节点上部署了DVR router后,E-W方向上的流量不再需要将数据包发送到网络节点后再转发,而是有本地的DVR router直接进行跨子网的转发;N-S方向上,对于绑定了floating IP的虚机,其与外网通信时的数据包也将直接通过本地的DVR router进行转发。从而,Neutron网络上的一些流量被分摊开,有效地减少了网络节点上的流量;通信不再必须通过网络节点,也提升了Neutron网络的抗单点失败的能力。
本文主要讲解的是E-W方向上的虚拟机通信情况。
非DVR和DVR情况下,网络节点流量对比
这是在有相同数量的虚机的情况下的对比。
- 非DVR的情况,网络节点的流量情况
- 在DVR enabled的情况下,网络节点的流量情况
在非DVR和DVR的情况下,数据包流经各节点的对比
DVR支持VLAN、GRE、VXLAN这几种网络类型,但因为方便起见(VLAN需要开启路由器的Trunk口),所以本文中,我们这就用 GRE作为环境的网络类型。我们这里的环境情况如下:
网络节点是test114.sce.ibm.com, 两个计算节点分别是test115.sce.ibm.com和test116.sce.ibm.com,两个私有网络分别是gre(192.168.11.0/24),gre1(192.168.12.0/24),都是GRE类型的,它们通过router相连,在两个计算节点上面分别有一台虚拟机,它们分属不同的网络。这里面VM1在test115.sce.ibm.com上,ip地址是192.168.11.3,VM2在 test116.sce.ibm.com 上,ip地址是192.168.12.4。
- 非DVR的情况:
图1 非DVR
- DVR的情况:
图2 DVR
在非 DVR 的情况,数据是要通过网络节点才能相互传递数据包;在 DVR 的情况,数据包是直接在两个计算节点上传递。
配置DVR
配置文件
在网络节点和计算节点配置DVR:
- 网络节点:因为 DVR 是属于 l3-agent 的功能,并依赖于 l3-agent,所以我们在这里的改动应该默认为环境上的 l3-agent 是可以工作的。具体配置如下:
修改对应文件:
neutron.conf : router_distributed = True
l3_agent.ini : agent_mode = dvr_snat
ovs_neutron_plugin.ini : l2_population = True and enable_distributed_routing = True
ml2_conf.ini : mechanism_drivers = openvswitch,linuxbridge,l2population
重新启动 neutron-openvswitch-agent, netron-l3-agent, neutron-server 服务。
- 计算节点:考虑到 compute node 上可能在 enable DVR 之前是没有启动/配置 DVR 的,那么参照 network node 上的 l3_agent.ini 去配置 compute node,启动 l3-agent。同时把 l3-agent 配置成 DVR 模式。还需要在节点上配置 br-ex 这个 ovs bridge,如果节点上在 enable DVR 之前没有这个 ovs bridge,并且如果 compute node 上的虚机需要与外网通信,那么 compute node 上的 br-ex 就必须桥接到一个可以连接到外网的网卡上。具体配置如下:
把节点配置成 DVR 模式:
l3_agent.ini : agent_mode = dvr
ovs_neutron_plugin.ini : l2_population = True and enable_distributed_routing = True
重新启动neutron-openvswitch-agent, netron-l3-agent 服务。
建立br-ex网桥,使得eth0上的ip地址转移到br-ex上。具体操作如下:
建立br-ex: ovs-vsctl add-br br-ex
把eth0桥接到br-ex里面:ovs-vsctl add-port br-ex "eth0"
建立ifcfg-br-ex,ifcfg-eth0 is in /etc/sysconfig/network-scripts。
重新启动网络服务。使得配置生效。
- 迁移到 DVR 模式。使得新添加的 l3-agent 能够管理 router,(如果是先 enabled DVR,再建立网络和 router,忽略这一步),具体操作如下:
在网络节点上执行如下操作:
neutron router-update --admin_state_up=False ROUTER
neutron router-update --distributed=True ROUTER
neutron router-update --admin_state_up=True ROUTER
查看router是否已经和三个l3-agent对应
计算节点上的虚拟机的数据流的传递
当在虚拟机VM1(test115.sce.ibm.com)里面去ping VM2的IP的时候,数据包先转到宿主机的网桥br-int上,数据先传到那个和VM1的port匹配的port端口上,转到网关所在的那个端口,再转到namespace里,找到网关所在的端口,再转回br-int,然后通过br-int上面的patch-tun端口传递到br-tun这个网桥上,在br-tun网桥上的对应的端口通过trunk传递数据包到VM2所在的宿主机(test116.sce.ibm.com)的br-tun上的对应端口,再通过patch-int传到br-int上的patch-tun,通过br-int上的与VM2对应的port端口,把数据传递给VM2,完成数据包的传递。简单的可以写成vm1->br-int->namespace->br-int>br-tun->tunnel>br-tun->br-int->vm2。
DVR环境下Openflow规则的分析
OVS命令简介
Open VSwitch(OVS)是一个虚拟交换机,可以用来组成虚拟网络。OpenStack Neutron里面也是应用了OVS,Neutrondd的router虽然是工作在网络3层的,看似与2层的OVS无关,但实际上Neutron router在转发不同子网之间的数据流量时,还是需要借助2层Openflow规则,并且Neutron router的namespace中的子网网关的端口设备等都是需要接在OVS的网桥br-int 上才能工作的。DVR作为Neutron router的一种特殊实现,本质上也是依赖于OVS的,这一点与Neutron legacy router并无差异。在前面DVR的配置中我们用到了一些OVS的命令,这里再介绍一下OVS的一些命令:
- 查看open vswitch的网络状态:ovs-vsctl show
- 查看网桥br-tun的接口状况:ovs-ofctl show br-tun
- 查看网桥br-tun的流表:ovs-ofctl dump-flows br-tun
- 添加网桥:#ovs-vsctl add-br br0
- 将物理网卡挂接到网桥:#ovs-vsctl add-port br0 eth0
我们这片文章里面主要用到了以上五个个 ovs 命令。我们在提一下其它的一些命令。
- 列出 open vswitch 中的所有网桥:#ovs-vsctl list-br
- 判断网桥是否存在:#ovs-vsctl br-exists br0
- 列出网桥中的所有端口:#ovs-vsctl list-ports br0
- 列出所有挂接到网卡的网桥:#ovs-vsctl port-to-br eth0
- 删除网桥上已经挂接的网口:#vs-vsctl del-port br0 eth0
- 删除网桥:#ovs-vsctl del-br br0
数据包在br-int和br-tun上的流表
在前面的章节,大致描述了一下数据包的流动情况,在这里再来看一下 br-int 和 br-tun 上的流表,具体来看下数据包的传递。
当从VM1(192.168.11.14)去pingVM2(192.168.12.9), 数据包首先流到compute1(10.11.1.115)的br-int上,让我们先看看compute1上的网络状态。
从VM1的port信息里面我们得知,数据是从qvof76ecb29-5d口进入br-int的。我们再看看br-int上的数据包,从上面的port信息我们查看到了相应的MAC地址,知道数据包是从VM1的MAC发到它gateway的MAC上的。然后在namespace里面通过VM2的gateway端口转发出来。
VM1要ping的是VM2,它们是在不同的网段上。通过namespace,使得192.168.12.1和192.168.11.1这两个gateway能够联通,就把不同的两个网段联通起来。
192.168.11.0/24和192.168.12.0/24这两个网段的通信是分别通过qr-c669122c-11和qr-43fad9d6-53两个端口,因为 namespace的存在,它们本身是能够通信的。
[root@test115 ~]# ip netns exec qrouter-a49eee39-7977-4a7f-81e1-dcbf57dbd904 ip route list table main
在compute1节点的namespace上能够得到192.168.12.9的MAC地址及状态。并且在compute2节点的namespace上能够得到 192.168.11.14的MAC地址及状态。这些都保证了两台VM的顺利通信。
数据包流入br-int之后,打上了tag 2标志,接着patch-tun把br-int接入隧道桥br-tun,我们看到patch-tun和patch-int是对应的端口,我们通过查看br-tun上的端口情况得知数据流是从port 8进入br-tun的。
首先注意一下,数据流在进入br-tun之前,数据包已经转化成了从VM1的MAC ping 192.168.12.1的MAC。我们查看一下数据在br-tun上的流表。数据首先流入table0,流入端口是port 8。接着进入table1,流入地址就是192.168.12.1的MAC地址,它转变成了compute1的MAC地址,这个MAC地址我们可以从db2里面得到。接着进入table2, 因为ping用的协议是ICMP,所以这里定位粗体字的这条数据流。接着进入table20,从上面的port list表中,我们可以看到,数据流最终指向VM2(192.168.12.9), 数据包从隧道set_tunnel:0x2, port 10 流出。
这里是查看host的MAC地址。
compute1是通过gre-0a0b0174与compute2连接起来的
下面数据包已经来到了compute2,我们先查看一下compute2上的网络情况,在compute2上,是通过gre-0a0b0173端口与compute1传递数据流的。
数据进入compute2,先进入隧道桥br-tun。我们再来查看一下br-tun上的端口,它是通过port 14传入br-tun的。
下面查看一下br-tun上面的流表
数据先流入table0,流入端口是port 14,接着数据转入table3,在这里把隧道转成了vlan号,这里的tunnel就是在compute1 上的转换的那个tunnel号,接着数据流入table9, 在这条流上显示流入地址是compute1 host的MAC地址,数据从这里流进 br-int。
数据包流入br-int先进入的是table0, 数据的流入地址是compute1 host的MAC地址。接着数据进入table1, 到达VM2的MAC,流入地址是192.168.12.1的MAC地址,完成了从gateway到VM的数据转发。至此数据包完成了从VM1到VM2的传递,仅仅在compute节点之间没有经过network节点。
在compute1节点的namespace上能够得到192.168.12.9的MAC地址及状态。其实在compute2节点的namespace上能够得到192.168.11.14的MAC地址及状态。这些都保证了两台VM的能够顺利的通信。
参考资料
学习
参考:Neutron/DVR,您可以在这里面找到比较深刻地了解 DVR 的概念,原理等知识。
参考:Neutron/DVR/HowTo,您可以在这里看到一个关于 DVR demo 的视频,还能从中找到如何配置 DVR。
参考:Neutron/DVR L2 Agent,您可以在这里面查看到在 DVR 的 enabled 的时候,数据的流标。
参考:OVS命令详解全部手册内容,您可以在这里面找到你所需要的 OVS 命令
developerWorks 云计算站点 提供了有关云计算的更新资源,包括
- 云计算 简介。
- 更新的 技术文章和教程,以及网络广播,让您的开发变得轻松,专家研讨会和录制会议 帮助您成为高效的云开发人员。
- 连接转为云计算设计的 IBM 产品下载和信息。
- 关于 社区最新话题 的活动聚合。
作者简介:
许薇,软件测试工程师,IBM
李宗恺,软件工程师,IBM
张芸,软件工程师,IBM
转载自:developerWorks 中国
- SDN实战团分享(一):OpenStack网络服务数据平面加速
- SDN实战团分享
- SDN入门实战(一)
- Openstack学习(一)---------------网络服务Neutron
- SDN数据平面发展历史
- ArchSummit干货分享:通向企业级的OpenStack网络服务
- Linux网络服务(一)
- 谢高岗:SDN数据转发平面研究与实践
- SDN入门实战(二)
- Openstack 网络服务Neutron [五]
- SDN、NFV、OpenStack培训
- (一)SDN基本架构
- OpenStack RDO 部署流程 - 3(Neutron网络服务)
- openstack-mikata之网络服务(controller安装部署)
- OpenStack Newton版本部署---- 网络服务(neutron)(计算节点)
- OpenStack Newton版本部署---- 网络服务(neutron)(控制节点)
- SDN学习(一)搭建SDN环境(floodlight+mininet)
- 通向企业级的 OPENSTACK 网络服务
- 你是否还在为android开发环境的搭建而犯难?
- 字符设备驱动函数
- [每天学一点Linux系列]Linux基本概念
- android中的ListView与ScrollView冲突保留ScrollView滚动
- QT5 在VS里用QT Designer 打开UI文件资源丢失情况解决
- SDN实战团分享(一):OpenStack网络服务数据平面加速
- 1人制作手游2月收入1259万:开发者意外成功的背后
- cocoapods一些坑
- OpenWrt的luci web管理器添加新菜单(三)
- 欢迎使用CSDN-markdown编辑器
- JSONObject
- Angularjs基础知识
- 一般来说我们总会在设置Block之后,在合适的时间回调Block,而不希望回调Block的时候Block已经被释放了,所以我们需要对Block进行copy,copy到堆中,以便后用。 当一个Bloc
- MVC设计模式