Table of Contents
Open vSwitch(OVS)中的DPDK性能加速
在NFV基础设施(NFVI)中有一个重要的组成部分,叫虚拟交换机。目前,虚拟交换机的实现已经有很多开源和商业的版本。开源的方案有Open vSwitch(OVS)、Snabb Switch、和Lagopus。商业的方案有VMware ESXi、Wind River Titanium Edition和6Wind 6WINDGate。在这些虚拟交换机中,OVS的知名度是最高的,而且还在持续发展中,在很多的SDN/NFV场景下都可以灵活部署。
174.虚拟交换机简介
《使用DPDK打开Open vSwitch(OvS) *概述》
虚拟交换机是运行在通用平台上的一个软件层,可以连接虚拟机的虚拟网络端口,提供一套纯软件实现的路由交换协议栈的一个机制,帮助平台上运行的虚拟机实例(虚拟机之间、或虚拟机与外部网络之间)。虚拟机的虚拟网卡对应虚拟交换机的一个虚拟端口,通用平台上的物理网卡作为虚拟交换机的上行链路端口。虚拟交换机在SDN/NFV的部署中占据一个重要的地方,分别体现为:报文处理、交换功能、互操作性以及安全/流控等管理性。图14-1描述了典型的虚拟交换机和物理交换机的架构。
虽然是虚拟交换机,但是它的工作原理与物理交换机类似。在虚拟交换机的实现中,其两端分别连接着物理网卡和多块虚拟网卡,同时虚拟交换机内部会维护一张映射表,根据路由规则寻找对应的虚拟化链路进而完成数据转发。
虚拟交换机的主要好处体现在扩展灵活。由于采用纯软件实现,相比采用L3芯片的物理交换机,功能扩展灵活、快速,可以更好地满足SDN/NFV的网络需求扩展。
然而,网络业界和电信运营商普遍认为虚拟交换机的报文处理性能,特别是在小包(比如64字节)上的性能,还达不到NFV数据面商用的标准。虽然SR-IOV和PCIe透传技术可以提供给虚拟机以接近物理机上的网络性能,但它们的网络虚拟化特性受限于物理网卡,功能简单,无法支持灵活的安全隔离等特性,如不支持对报文任意偏移量的匹配,或者灵活业务模型的需求。这些应用要求网络报文先经过主机上的处理,比如DPI、防火墙等,然后再把报文送入虚拟机。这些场景都要求有虚拟交换机。
图14-1 数据中心中的典型虚拟交换机和物理交换机的架构
OVS于2009年推出第一个版本,经过这几年的发展,在OVS2.4加入了DPDK的支持后,在用户态数据通路上进行了性能加速,极大地提高了报文转发速度,也改进了扩展性、时延和时延抖动问题。这些优化工作还在持续不断进行中,随着通用处理器性能的提升,相信在不久的未来,OVS会达到电信运营商对NFV的需求,并提高灵活性和易管理性。
175.OVS简介
《使用DPDK打开Open vSwitch(OvS) *概述》
Open vSwitch(OVS)是一个开源的虚拟交换机,遵循Apache2.0许可,其定位是要做一个产品级质量的多层虚拟交换机,通过支持可编程扩展来实现大规模的网络自动化。它的设计目标是方便管理和配置虚拟机网络,能够主动检测多物理主机在动态虚拟环境中的流量情况。针对这一目标,OVS具备很强的灵活性,可以在管理程序中作为软件交换机运行,也可以直接部署到硬件设备上作为控制层。此外,OVS还支持多种标准的管理接口,如NetFlow、sFlow、IPFIX、RSPAN、CLI、LACP、802.1ag。对于其他的虚拟交换机设备,如VMware的vNetwork分布式交换机、思科Nexus 1000V虚拟交换机等,它也提供了较好的支持。由于OVS提供了对OpenFlow协议的支持,它还能够与众多开源的虚拟化平台(如KVM、Xen)相整合。在现有的虚拟交换机中,OVS作为主流的开源方案,发展速度很快,它在很多的场景下都可灵活部署,因此也被很多SDN/NFV方案广泛支持。在几个开源的SDN/NFV项目中,尤其在OpenStack、OpenNebula、和OpenDayLight中,OVS都扮演着重要的角色。根据openstack.org2014年的调查,OVS作为虚拟交换机在OpenStack的部署中是用得最多的。详见[Ref14-1]。
OVS在实现中分为用户空间和内核空间两个部分。用户空间拥有多个组件,它们主要负责实现数据交换和OpenFlow流表功能,还有一些工具用于虚拟交换机管理、数据库搭建以及和内核组件的交互。内核组件主要负责流表查找的快速通道。OVS的核心组件及其关联关系如图14-2所示。
图14-2 OVS核心组件及其关联关系
其中,OVS最重要的组件是ovs-vswitchd,它实现了OpenFlow交换机的核心功能,并且通过Netlink协议直接和OVS的内部模块进行通信。用户通过ovs-ofctl可以使用OpenFlow协议去连接交换机并查询和控制。另外,OVS还提供了sFlow协议,可以通过额外的sFlowTrend等软件(不包含在OVS软件包中)去采样和监控数据报文。
ovs-vswitchd通过UNIX socket通信机制和ovsdb-server进程通信,将虚拟交换机的配置、流表、统计信息等保存在数据库ovsdb中。当用户需要和ovsdb-server通信以进行一些数据库操作时,可以通过运行ovsdb-client组件访问ovsdb-server,或者直接使用ovsdb-tool而不经ovsdb-server就对ovsdb数据库进行操作。
ovs-vsctl组件是一个用于交换机管理的基本工具,主要是获取或者更改ovs-vswitchd的配置信息,此工具操作的时候会更新ovsdb-server的数据库。同时,我们也可以通过另一个管理工具组件ovs-appctl发送一些内部命令给ovs-vswitchd以改变其配置。另外,在特定情况下,用户可能会需要自行管理运行在内核中的数据通路,那么也可以通过调用ovs-dpctl驱使ovs-vswitchd在不依赖于数据库的情况下去管理内核空间中的数据通路。
Openvswitch.ko则是在内核空间的快速通路,主要是包括datapath(数据通路)模块,datapath负责执行报文的快速转发,也就是把从接收端口收到的数据包在流表中进行匹配,并执行匹配到的动作,实现快速转发能力。通过netlink通信机制把ovs-vswitchd管理的流表缓存起来。
OVS数据流转发的大致流程如下:
- 1)OVS的datapah接收到从OVS连接的某个网络端口发来的数据包,从数据包中提取源/目的IP、源/目的MAC、端口等信息。
- 2)OVS在内核态查看流表结构(通过HASH),如果命中,则快速转发。
- 3)如果没有命中,内核态不知道如何处置这个数据包。所以,通过netlink upcall机制从内核态通知用户态,发送给ovs-vswitchd组件处理。
- 4)ovs-vswitchd查询用户态精确流表和模糊流表,如果还不命中,在SDN控制器接入的情况下,经过OpenFlow协议,通告给控制器,由控制器处理。
- 5)如果模糊命中,ovs-vswitchd会同时刷新用户态精确流表和内核态精确流表;如果精确命中,则只更新内核态流表。
- 6)刷新后,重新把该数据包注入给内核态datapath模块处理。
- 7)datapath重新发起选路,查询内核流表,匹配;报文转发,结束。
DPDK加速的OVS
176.DPDK加速的OVS
虽然OVS作为虚拟交换机已经很好,但是它在NFV的场景下,在转发性能、时延、抖动上离商业应用还有一段距离。Intel利用DPDK的加速思想,对OVS进行了性能加速。从OVS2.4开始,通过配置支持两种软件架构:原始OVS(主要数据通路在内核态)和DPDK加速的OVS(数据通路在用户态)。
177.OVS的数据通路
根据上小节OVS的大致流程分析,跟数据包转发性能相关的主要有两个组件:ovs-vswitchd(用户态慢速通路)和openvswitch.ko(内核态快速通路)。图14-3显示了OVS数据通路的内部模块图,DPDK加速的思想就是专注在这个数据通路上。
图14-3 OVS数据通路的内部模块
ovs-vswitchd主要包含ofproto、dpif、netdev模块。ofproto模块实现openf low的交换机;dpif模块抽象一个单转发路径;netdev模块抽象网络接口(无论物理的还是虚拟的)。
openvswitch.ko主要由数据通路模块组成,里面包含着流表。流表中的每个表项由一些匹配字段和要做的动作组成。
178.DPDK加速的数据通路
OVS在2.4版本中加入了DPDK的支持,作为一个编译选项,可以选用原始OVS还是DPDK加速的OVS。DPDK加速的OVS利用了DPDK的PMD驱动,向量指令,大页、绑核等技术,来优化用户态的数据通路,直接绕过内核态的数据通路,加速物理网口和虚拟网口的报文处理速度。
图14-4显示了DPDK加速的OVS的软件架构,以及目前Intel贡献的主要专注点。
- ❑dpif-netdev:用户态的快速通路,实现了基于netdev设备的dpif API。
- ❑Ofproto-dpif:实现了基于dpif层的ofproto API。
- ❑netdev-dpdk:实现了基于DPDK的netdev API,其定义的几种网络接口如下:
- ● dpdk物理网口:其实现是采用高性能向量化DPDK PMD的驱动。
- ● dpdkvhostuser与dpdkvhostcuse接口:支持两种DPDK实现的vhost优化接口:vhost-user和vhost-cuse。vhost-user或vhost-cuse可以挂接到用户态的数据通道上,与虚拟机的virtio网口快速通信。如第12章所说,vhost-cuse是一个过渡性技术,vhost-user是建议使用的接口。为了性能,在vhost burst收发包个数上,需要和dpdk物理网口设置的burst收发包个数相同。
- ● dpdkr:其实现是基于DPDK librte_ring机制创建的DPDK ring接口。dpdkr接口挂接到用户态的数据通道上,与使用了IVSHMEM的虚拟机合作可以通过零拷贝技术实现高速通信。
图14-4 基于DPDK加速的Open vSwitch的软件架构
虚拟机虚拟网卡(virito/vhost还是IVSHMEM)的选择,请参考13.6节。
DPDK加速的OVS数据流转发的大致流程如下:
- 1)OVS的ovs-vswitchd接收到从OVS连接的某个网络端口发来的数据包,从数据包中提取源/目的IP、源/目的MAC、端口等信息。
- 2)OVS在用户态查看精确流表和模糊流表,如果命中,则直接转发。
- 3)如果还不命中,在SDN控制器接入的情况下,经过OpenFlow协议,通告给控制器,由控制器处理。
- 4)控制器下发新的流表,该数据包重新发起选路,匹配;报文转发,结束。
DPDK加速的OVS与原始OVS的区别在于,从OVS连接的某个网络端口接收到的报文不需要openvswitch.ko内核态的处理,报文通过DPDK PMD驱动直接到达用户态ovs-vswitchd里。
对DPDK加速的OVS优化工作还在持续进行中,重点在用户态的转发逻辑(dpif)和vhost/virtio上,比如采用DPDK实现的cuckoo哈希算法替换原有的哈希算法去做流表查找,vhost后端驱动采用mbuf bulk分配的优化,等等。
179.DPDK加速的OVS性能比较
Intel发布过原始OVS与DPDK加速的OVS的性能比较[Ref14-1],主要比较两种场景:一个是物理网口到物理网口,另一个是物理网口到虚拟机再到物理网口。
表14-1列出了当时用于测试的硬件、软件版本和系统配置。读者可以按照下面这个模型自己测试一番。
表14-1 硬件、软件版本和配置
如图14-5和图14-6所示,在这两种场景和256字节数据包的大小下,DPDK加速的OVS比原始OVS的性能分别提高了11.4倍和7.1倍。
图14-5 物理网口到物理网口的性能比较
图14-6 物理网口到虚拟机再到物理网口的性能比较
从图14-6中可以看出,如果用两个处理器核做OVS的转发逻辑比用一个处理器核体高了1.81倍,其可扩展性还是不错的。图14-7和图14-8详细描述了这两个场景下的数据流向。
图14-7显示出物理网口到物理网口场景下的数据流向,具体过程如下:
- 1)匹配数据通过DPDK的fast path加载入OVS。
- 2)数据包到达0号物理端口。
- 3)数据包绕过Linux内核直接通过DPDK针对该网卡的PMD模块进入OVS的用户态空间。
- 4)查询该数据库所匹配的操作。
- 5)此例中的操作是将该数据库转发到1号端口,DPDK的PMD模块会直接将该数据包从OVS的用户态空间发送到1号端口。
图14-7 物理网口到物理网口的数据流向
图14-8显示出物理网口到虚拟机再到物理网口场景下的数据流向,具体过程如下:
- 1)匹配数据通过DPDK的fast path加载入OVS。
- 2)数据包到达0号物理端口。
- 3)通过网卡的DPDK PMD,数据包被接收到用户态的OVS中。
- 4)查询该数据库所匹配的操作。
- 5)将数据包转发到0号虚拟端口。通过DPDK vHost库,将该数据包转发到VM中。
- 6)数据包被接收到VM中后,通过DPDK VirtIO PMD转发回主机。
- 7)通过DPDK Vhost库,数据包再次从1号虚拟端口被接收到用户态的OVS中。
- 8)查询该数据库所匹配的操作。
- 9)此例中的操作是将该数据库转发到1号端口,DPDK的PMD模块会直接将该数据包从OVS的用户态空间发送到1号端口。
图14-8 物理网口到虚拟机再到物理网口的数据流向
14.4 小结
本章主要讲述虚拟交换机作为NFV基础设施的一个重要组成部分,它的性能至关重要。同时我们选取了OVS这个知名度最高、使用度最广的开源虚拟交换机为例,通过分析其数据通路架构,我们利用DPDK的性能优化思想,对其数据通路进行改造,最后得到的性能提升还是很明显的。
系列文章
《《深入浅出DPDK》读书笔记(三):NUMA - Non Uniform Memory Architecture 非统一内存架构》
《《深入浅出DPDK》读书笔记(四):并行计算-SIMD是Single-Instruction Multiple-Data(单指令多数据)》
《《深入浅出DPDK》读书笔记(六):报文转发(run to completion、pipeline、精确匹配算法、最长前缀匹配LPM)》
《《深入浅出DPDK》读书笔记(七):PCIe与包处理I/O》
《《深入浅出DPDK》读书笔记(八):网卡性能优化(异步中断模式、轮询模式、混和中断轮询模式)》
《《深入浅出DPDK》读书笔记(十):硬件加速与功能卸载(VLAN、IEEE1588、IP TCP/UDP/SCTP checksum、Tunnel)》
《《深入浅出DPDK》读书笔记(十一):DPDK虚拟化技术篇(I/O虚拟化、CPU虚拟化、内存虚拟化、VT-d、I/O透传)》
《《深入浅出DPDK》读书笔记(十二):DPDK虚拟化技术篇(半虚拟化Virtio)》
《《深入浅出DPDK》读书笔记(十三):DPDK虚拟化技术篇(加速包处理的vhost优化方案)》
《《深入浅出DPDK》读书笔记(十四):DPDK应用篇(DPDK与网络功能虚拟化:NFV、VNF、IVSHMEM、Virtual BRAS“商业案例”)》
《《深入浅出DPDK》读书笔记(十五):DPDK应用篇(Open vSwitch(OVS)中的DPDK性能加速)》
相关阅读
《DPDK PMD( Poll Mode Driver)轮询模式驱动程序》
《DPDK笔记 RSS(receive side scaling)网卡分流机制》
《网卡多队列:RPS、RFS、RSS、Flow Director(DPDK支持)》
《Linux环境中的网络分段卸载技术 GSO/TSO/UFO/LRO/GRO》
《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》
《KVM Virtio: An I/O virtualization framework for Linux(Linux虚拟IO框架)》
《Linux虚拟化KVM-Qemu分析(二)之ARMv8虚拟化》
《Linux虚拟化KVM-Qemu分析(三)之KVM源码(1)》
《Linux虚拟化KVM-Qemu分析(四)之CPU虚拟化(2)》
《在CentOS上进行虚拟化:QEMU、Xen、KVM、LibVirt、oVirt》
《ARM SMMU原理与IOMMU技术(“VT-d” DMA、I/O虚拟化、内存虚拟化)》
《KVM Virtio: An I/O virtualization framework for Linux(Linux虚拟IO框架)》