zoukankan      html  css  js  c++  java
  • DPDK在OpenStack中的实现

    随着云计算与大数据的快速发展,其对数据中心网络的性能和管理提出了更高的要求,但传统云计算架构存在多个I/O瓶颈,由于云平台基本上是采用传统的X86服务器加上虚拟化方式组建,随着40G、100G高速网卡的出现,如何在通用的X86平台上实现网络的快速转发就成为关键。DPDK是INTEL推出的基于X86平台提升数据面报文快速处理速率的应用程序开发包[1],关于DPDK的资料已经比较多,本文不再做过多介绍,本文重点关注DPDK与OpenStack的结合。
    目前在OpenStack中使用DPDK实现数据平面用户态转发的项目有两个networking-ovs-dpdk 和networking-vpp,networking-vpp[2]项目还在功能完善阶段,而Open vSwitch+DPDK的实现已经全部合入主干,因此本文主要介绍Open vSwitch+DPDK的实现原理、如何配置使用以及该特性目前在社区的完善度。

    Open vSwitch with DPDK

    Open vSwitch在2.2版本开始支持DPDK,从2.4开始可以使用DPDK优化的vHost路径[3],其架构如下图所示[4]:

    Open vSwith使用DPDK在用户态实现了netdev datapath:使用轮询driver绕过内核协议栈来直接处理物理网卡上的数据包,使用vHost and IVSHEM库作为宿主机到guest OS的控制和数据通道。当使用IVSHEM时,可以在guest OS中运行DPDK应用,这种场景下DPDK中的应用必使用宿主机上的共享内存大页。对于vHost的实现,Open vSwith通过socket实现控制消息的处理,通过共享的内存大页实现真正数据包的处理。

    Open vSwitch中vHost-user类型

    vHost-user介绍

    vhost-user是利用现有的vhost提供的机制(共享内存,ioeventfd和irqfd),针对virito设备实现的一种交换的传输方式。vhost-user通过UNIX socket在两个进程之间设置Vrings和共享内存。当virtio设备发出kick信息时,也通过UNIX socket和进程进行交互,想了解关于vhost、vhost-user更多细节可参考我同事写的一篇文章[14]。

    结合Open vSwitch和QEMU使用时,在Open vSwitch的vhost-user模式下,Open vSwitch作为backend,QEMU作为client,在vhost-user-client模式下,QEMU作为backend,Open vSwitch作为client,下一节会有详细说明。

    Open vSwitch支持的vHost-user类型

    在Open vSwitch中vHost User通过socket进行通信,模式为client-server,其中server端负责创建/管理/销毁所需socket连接,客户端只需要通过socket连接到server端,Open vSwitch支持两种类型的vHost User端口[5]:

    VHOST-USER

    vhost-user在Open vSwitch中的端口类型为dpdkvhostuser,该模式下Open vSwitch作为server端,QEMU作为client端,使用该类型端口时,要求QEMU版本必须>=2.2。
    该模式下vHost端口不具备‘reconnect’能力。当Open vSwitch服务异常后,QEMU作为client端能感知到该异常并将端口状态置为down,但当Open vSwitch服务恢复后,QEMU作为client端不会自动重新连接server,导致虚拟机网络无法自动恢复。

    VHOST-USER-CLIENT

    vhost-user-client在Open vSwitch中的端口类型dpdkvhostuserclient,该模式下Open vSwitch作为client端,QEMU作为server端,使用该类型端口时,要求QEMU版本必须>=2.7。
    该模式下vHost端口具备‘reconnect’能力。使用该类型端口创建虚拟机时,QEMU会等端口创建成功,client连接上后启动虚拟机,在Open vSwitch服务出现异常或被停止后,QEMU会将端口状态置为down,当Open vSwitch服务恢复正常后,client会重新连接server,触发QEMU重新将端口状态置为up。

    Open vSwitch with DPDK在OpenStack中的实现

    OpenStack对Open vSwitch with DPDK的支持是在Kilo版本,这是一个跨Nova和Neutron两个模块的特性,Nova中需要在libvirt 的vif driver中新增一个vhost user driver,具体实现可参考[6],Neutron侧的代码放在一个独立的子项目networking-ovs-dpdk[7],在Mitaka版本,Neutron侧的代码全部合入主干[8],但该特性的CI仍然保留在networking-ovs-dpdk子项目。
    本文以OpenStack最新发行版Ocata介绍该特性的实现,OS选用Ubuntu 16.04,由于该特性需要使用内存大页,服务器推荐至少8G内存,2块物理网卡,本实验使用的是Intel 82567网卡。

    配置内存大页

    传统的X86平台默认内存页大小为4K,可配置2MB,1GB 的内存大页,可参考[9]中相关说明,生产环境中需要根据实际需求来选择大页内存类型,例如在NFV场景,对虚拟机的性能有较高要求,宿主机的CPU和内存不开启复用,那么配置1GB的内存大页更合理,本实验使用2MB的内存大页。

    挂载内存大页,并设置OS启动时自动挂在大页

    重启OS

    验证大页是否挂载成功

    绑定使用DPDK的网卡

    安装DPDK

    推荐使用源码编译安装DPDK[9],DPDK最新开发版本为17.02,最新稳定版本为16.11.1:

    加载IGB_UIO驱动

    编译好的DPDK中包括该驱动:

    绑定网卡

    查询网卡的PCI号:

    使用DPDK源码中提供的绑定脚本绑定网卡

    网卡绑定成功后如下图所示:

    NEUTRON中相关配置

    OPENVSWITCH-AGENT安装配置

    openvswitch-agent安装时只会自动安装openvswitch,需要手动安装openvswitch-dpdk,推荐使用openvswitch的源码编译、安装,安装之前需要先停掉openvswitch服务。

    编译安装OPENVSWITCH

    从官方下载openvswitch:http://openvswitch.org/download,本实验使用ovs 2.6.1版本

    创建OVS 数据库

    设置OVS使用的内存大页

    可先查询各NUMA node上内存大页的使用情况,

    启动OVS DB服务

    设置ovs以DPDK的方式启动:

    添加物理网卡

    物理网卡绑定DPDK驱动后才能被ovs-vswitchd发现:

    在openvswitch2.7之前,物理网卡在openvswitch中的命名以dpdk开头:

    启动OVS-VSWITCHD

    创建DATAPATH类型为NETDEV的网桥

    修改OPENVSWITCH-AGENT配置文件

    在ovs标签下修改下面3个配置项:

    重启openvswitch-agent服务

    Nova中相关配置

    创建带内存大页的flavor:

    基本功能验证

    创建虚拟机

    在Ocata版本之前,Neutron只支持vhost-user类型的port,Ocata实现了对vhost-user-client类型的port的支持[11]。
    创虚拟机时,Neutron会根据openvswitch-agent上报openvswitch支持的interface type作端口绑定,在vhost-user-client和vhost-user都支持的情况下优先使用vhost-user-client。
    虚拟机使用vhost-user port如下图所示:

    虚拟机使用vhost-user-client port如下图所示:

    可以通过查看端口的状态来检查虚拟机的网卡是否被Open vSwitch和QEMU正确处理:

    虚拟机热迁移

    经验证在Ocata版本Nova支持对带vhostuser类型网卡的虚拟机进行在线迁移。

    支持的网络类型

    经验证在Ocata 版本,Neutron中flat、vlan、vxlan类型的网络均支持vhostuser类型的port,如何配置使用vxlan网络可参考[12]。

    安全组功能

    当Open vSwitch使用DPDK后,使用iptables实现的安全组driver已经无法使用,但完全基于OpenFlow流表实现的安全组driver在Newton版本已经实现[13],修改openvswitch-agent的配置文件:

    经验证vhostuser类型port的安全组功能在Ocata版本基本可用,但还存在一些问题,例如计算节点上port较多时,Open vSwitch流表数量过多(社区已在做相关优化[15]),链接跟踪无法自动清除问题。

    总结

    通过上述实验可以看出,OpenStack的发展速度确实比较快,对Open vSwitch with DPDK的基本功能已经全部支持。本文只是验证了一下该特性的基本功能,后续会再做一下稳定性和性能相关测试,如何将该特性应用到生产环境会是我接下来研究的重点。

    参考资料

    1. http://dpdk.org/
    2. https://launchpad.net/networking-vpp
    3. http://openvswitch.org/releases/NEWS-2.4.0
    4. https://docs.mirantis.com/openstack/fuel/fuel-9.1/nfv-guide/ovs-dpdk.html
    5. http://docs.openvswitch.org/en/latest/topics/dpdk/vhost-user/#vhost-user-vs-vhost-user-client
    6. https://blueprints.launchpad.net/nova/+spec/libvirt-vif-vhost-user
    7. https://launchpad.net/networking-ovs-dpdk
    8. https://review.openstack.org/#/c/237264/
    9. http://docs.openvswitch.org/en/latest/intro/install/dpdk/
    10. https://www.kernel.org/doc/Documentation/vm/hugetlbpage.txt
    11. https://bugs.launchpad.net/neutron/+bug/1604924
    12. https://github.com/openvswitch/ovs/blob/master/Documentation/howto/userspace-tunneling.rst
    13. https://docs.openstack.org/developer/neutron/devref/openvswitch_firewall.html
    14. http://www.udpwork.com/item/12720.html
    15. https://review.openstack.org/#/c/333804/

  • 相关阅读:
    GitHub常用 库
    App性能优化
    iOS App性能优化
    UIButton图片与文字位置调整
    Mac常用目录
    js数字转金额,ajax调用接口,后台返回html(完整页面),打开新窗口并写入html
    js坑 把数字型的字符串默认为数字 把前面的0给去掉了("001")
    url跳转路径参数获取
    常用正则表达式,手机号,邮箱,网址
    Js获取操作系统版本 && 获得浏览器版本
  • 原文地址:https://www.cnblogs.com/allcloud/p/7771218.html
Copyright © 2011-2022 走看看