基于智能网卡(Smart Nic)的Open vSwitch卸载方案简介

摘要:
SmartNic技术的初衷是以比普通CPU低得多的成本支持各种虚拟化功能,如sriov、overlay/decap和卸载一些vSwitch处理逻辑。目前,业界还没有完美的SmartNic解决方案来解决传统的vSwitch性能瓶颈,每种解决方案的实施方式也各不相同。没有统一的解决方案。图1.不同SmartNic架构的比较。2.基于SmartNic的OVS卸载方案。2.virtio纯软转发方案。阿里云曾提出一个virtio纯软转发方案。

一、Smart Nic简介

1.1 Smart Nic产生的背景

目前,以Open vSwitch(OVS)为代表的虚拟交换机(vSwitch)以其灵活而丰富的功能支持(如OpenFlow、QOS、VLAN/VXLAN encap/decap)被业界广泛接受,大量应用于云计算多租户场景以及容器场景中。广泛的业务层需求致使数据中心快速增长,数据流量日益激增,vSwitch的收发包瓶颈也日益凸显出来,虽然可以通过软件加速套件(例如dpdk),在一定程度上增强转发性能,但是仍存在以下几个问题:

首先,vSwitch会大量占用宿主机计算资源,尤其是当吞吐增大时,为保证转发质量,vSwitch通常会绑定多个CPU核,这会额外占用大量宝贵的CPU资源,无形之中增加了企业运行成本和能源消耗,这些CPU资源原本可以在其它业务和应用中进行更合理的利用。

其次,虽然可以通过CPU Affinity以及IRQ Affinity等优化手段提高转发性能,但是vSwitch依然面临着性能上的瓶颈,难以满足当前快速增长的高网络带宽应用需求。因此,进一步加速vSwitch势在必行。

最后,业务/应用需求和软件实现上的矛盾,促成了Smart Nic的出现,以Smart Nic为代表的硬件卸载(Hardware Offload)方案被提出并得以广泛推进。

Smart Nic技术诞生的初衷是以比普通CPU低得多的成本来实现对各种虚拟化功能的支持,如sriov,overlay encap/decap,以及部分vSwitch处理逻辑的offload。而且,Hardware Acceleration方案具有天生的处理速度快、性能稳定等优势。除此之外,网卡作为数据流进出的首道关卡,还可以实现监控、嗅探、以避免网络攻击、实现安全隔离的作用。

1.2 Smart Nic和Normal Nic区别

相比于Normal Nic,Smart Nic在很多方面做了改进,例如:

1. Hardware Offload/Acceleration功能

 

  • 区别于Normal Nic,Smart Nic不仅负责L2转发,通过增加额外的处理逻辑还可以实现部分vSwitch的功能。基于Hardware Offload,能够offload部分网络流量(例如基于Tc Flower Offload功能),以及支持对网络数据包header的处理(例如Push/Pop VLAN Tag、VXLAN Encap/Decap等),减小CPU负载,提高网络吞吐;

  • Connection Tracking Offload可以实现L3/L4 Firewall功能;

  • Header Re-write Offload功能,能够对packet header进行set/copy/add操作,可以实现routing、nat等功能;

2. 可编程功能

Smart Nic具备可编程能力,除了实现高性能网络转发以后,还可以实现诸如流表规则匹配,封包过滤,NVMe等功能。表1列出了Smart Nic部分功能的使用场景,以及控制平面/数据平面的功能分工[2]

image.png

表1. Smart Nic部分功能使用场景

1.3 Smart Nic架构

目前几种主流的Smart Nic架构各不相同,大致可以分为ASIC Based、FPGA Based、以及SOC Based三种类型。下图1从性能价格比、操作难易程度、灵活性等几个方面对这三种硬件架构做了简单比较[1]。从图中可以看出,ASIC架构Smart Nic(例如mallanox connectX-5系列)成本低廉且性能优异,这种类型的Smart Nic一般都有可编程接口,但由于处理逻辑在ASIC上固化,控制的灵活空间会比较小;与之相比,基于FPGA的Smart Nic(例如napath NT100E3-1-PTP系列)灵活性则更高,但是成本略高并且编程难度较大;SOC架构(即含有专用CPU,例如mellanox BlueField系列)提供了性能和可操控性的平衡,使用这种架构的一般是各大厂商的自研网卡。

目前,在解决传统的vSwitch性能瓶颈方面,业界还没有一个非常完美的Smart Nic方案,各个方案的实现也是各有千秋,并没有形成一个统一的方案。比如,AWS采用基于通用ARM的方案、Azure采用基于FPGA的方案、华为云采用基于专用网络处理器(NP)的方案、阿里云采用基于可编程ASIC芯片的方案等。

图1. Smart Nic不同架构对比

image.png

二、基于Smart Nic的OVS卸载方案

2.1 virtio纯软转发的方案

阿里云曾经提出过一个virtio纯软转发的方案。阿里云针对自身业务自主开发的AVS项目(和OVS有类似功能)在使用过程中,遇到了诸如AVS占用主机资源过多、业务需求导致的性能瓶颈等问题,也因此催生了Smart Nic项目,方案如下图2所示。结合了SRIOV和virtio的优劣,设计了一套基于纯软转发的方案[3,4]

图2所示是阿里云的Smart Nic设计框架,卡上有一个标准的网卡ASIC和片上系统,片上系统自带内存和CPU,AVS模块整体offload到Smart Nic中。将快速路径(fast-path)和慢速路径(slow-path)进行分离,fast-path offload到ASIC中,AVS自身只负责slow-path包转发。

同时,阿里云结合自己的业务需求,在上层开发了一个基于DPDK的软件转发程序,AVS在网卡完成所有的策略、逻辑、路由、多队列等功能,将SRIOV的VF设备和virtio-net驱动接口进行一一映射,DPDK软件转发程序只需要完成VF和virtio-net的接口转换和报文传递。

该方案具有性能好、不占用主机资源、接口通用以及热迁移方便等优点,已经在阿里云上有了广泛的应用。

image.png

图2. 阿里云Smart Nic方案

2.2 基于代表口映射的方案

采用基于代表口映射方案的是Mellanox厂商,其生产的mellanox connectX系列网卡以高带宽、低延时、高性价比等著称。Mellanox提供的Smart Nic方案[5],如下图3 (a)所示,采用了embeded switch(eSwitch),将OVS的数据面offload到网卡中,控制面保持不变,以提供简便灵活的控制。

从图3(b)所示的数据包传输路径可知,普通OVS在做包转发处理时,首先在kernel space进行查表,如果lookup miss,则会发送netlink upcall信息到user space进行后续的查找(紫色线所示);user space查表,lookup hit以后,会将查表命中的flow table entry下发到kernel space进行缓存,以便后续报文在kernel space能直接hit,从而完成直接转发(黄色线所示),采用这种flow cache技术,能够减少频繁的内核态和用户态进程交互产生的性能开销,提高转发性能,进而提高吞吐;采用eSwitch这种ovs offload方案后,能够进一步优化转发性能,进一步缩短数据包的传输路径,当流缓存到网卡后,后续报文的解析、流表查找和转发等则会直接在网卡内部完成。值得注意的是,Mellanox的这种方案实现的是ovs的fastpath offload,而非full datapath offload。

image.png

图3. Mellanox Smart Nic方案

(a)基于eSwitch offload方案(b)OVS转发逻辑示意图

Mellanox Smart Nic提供了基于SRIOV的加速方案以及基于virtio的DPDK加速方案,后者现在尚未发布,预计2019年年末发布。图4是Mellanox 基于SRIOV的加速方案,可以看出,在SRIOV环境下,vf设备直接透传给vm使用,同时,vf设备建立起和rep代表口的一一映射关系(由Smart Nic实现完成),宿主机OVS需要配置hw-offload=true,打开hardware offload功能,以便OVS能够将内部流表通过TC下发到网卡内部的eSwitch,配置完成后,可以使用和普通OVS场景一样的方式,添加网桥,添加端口(rep代表口)到网桥上,对应的流表会下发到网卡内部,这样虚机之间的流量通信就可以在网卡内部完成,而不需要经过vSwitch的处理逻辑,减小了系统资源占用,同时相比传统的SRIOV场景,增添了更为丰富的控制功能。

图4. Mellanox SRIOV加速方案

image.png

三、基于Mellanox ConnectX-5 Smart Nic实践

3.1前置条件

  • Linux Kernel >= 4.13

  • Open vSwitch >= 2.8

  • Iproute >= 4.12

  • Mellanox ConnectX-5 Smart Nic

  • Mellanox ConnectX-5 FirmWare >= 16.21.0338

  • Mellanox Driver(based on the kernel version)

3.2 创建VF

  • 使能SRIOV && VT-d,grub配置文添加内核参数intel_iommu=on;

  • 创建VF口(假设网卡名为enp6s0f0);

#  echo 0 > /sys/class/net/enp6s0f0/device/sriov_numvfs
#  echo 2 > /sys/class/net/ enp6s0f0/device/sriov_numvfs
  • 验证检查创建的VF口(假设生成的VF口分别为enp6s0f0_0和enp6s0f0_1);

#  cat /sys/class/net/ enp6s0f0/device/sriov_totalvfs
#  ip link show enp6s0f0
// 如果网卡或者创建VF口状态为down,则需要设置为up状态
#  ip link set dev enp6s0f0 up
#  ip link set dev enp6s0f0_0 up
#  ip link set dev enp6s0f0_1 up

3.3 配置Open vSwitch

  • 将PF设备的eswitch模式从legacy更改为switchdev(假设pci号为04:00.0);

#  echo switchdev > /sys/class/net/enp6s0f0/compat/devlink/mode

或者使用devlink工具,如下

#  devlink dev switch set pci/0000:04:00.0 mode switchdev
  • Unbind VF(假设pci号分别为04:00.1,04:00.2);

#  echo 0000:04:00.1 > /sys/bus/pci/drivers/mlx5_core/unbind
#  echo 0000:04:00.2 > /sys/bus/pci/drivers/mlx5_core/unbind
  • 使能网卡的Hardware Offload功能;

#  ethtool -K enp6s0f0 hw-tc-offload on
  • 使能Open vSwitch的Hardware Offload功能;

#  systemctl start openvswitch
#  ovs-vsctl set Open_vSwitch . other_config:hw-offload=true
#  systemctl restart openvswitch
  • 配置Open vSwitch;

#  ovs-vsctl add-br ovs-sriov
#  ovs-vsctl add-port ovs-sriov enp6s0f0
#  ovs-vsctl add-port ovs-sriov enp6s0f0_0
#  ovs-vsctl add-port ovs-sriov enp6s0f0_1
#  ovs-dpctl show
  • Openstack环境下创建port时,注意需要传入capability:switchdev参数;

#  openstack port create --network net_1     --vnic-tpye=direct --binding-profile '{"capabilities":{"switchdev"}}'  sriov_port1
#  openstack port create --network net_1     --vnic-tpye=direct --binding-profile '{"capabilities":{"switchdev"}}'  sriov_port2
  • 创建vm1和vm2,分别选定sriov_port1和sriov_port2,然后ping;

 vm1# ping vm2
  • 在rep口tcpdump抓取vm之间的icmp报文,如图5所示,只能抓到第一笔ping包以及arp request/reply包(vm1持续ping vm2,后续ping包和arp包都会经过网卡转发,rep口就抓不到包了),这说明后续虚机之间的流量offload到了网卡,在网卡中实现了转发,而不再经由OVS进行转发;

image.png

图5. 同节点虚机互ping时Representor口抓包结果

  • 查看流表转发规则:可以看到已经offload到网卡上的流表;

#  ovs-dpctl dump-flows type=offloaded

可以看到类似如下图6所示的输出结果:

image.png

图6. Offload到网卡上的流表示例

3.4 测试结果

下图是采用iperf跨节点打流测试获取的实验数据,分别对如下三种实验场景进行了测试:

  • 传统SRIOV场景(即下图的legacy sriov),对应使用的是传统10G网卡;

  • 开启Hardware Offload(fastpath offload)功能的Mellanox CX-5 25G网卡实验场景(为了进行对比测试,将interface speed配置为10G),其中又分为两类:

  1.  没有安全组的hardware offload场景(即下图的fastpath offload without sg),对应是传统sriov场景;

  2. 包含安全组的hardware offload场景(即下图的fastpath offload with sg),带有安全组的这种场景,包含了一些控制流,需要使用ovs的conntrack功能。

图片

图6. 实验对比图

通过上图6的实验对比图可以看到,不带sg的fastpath offload场景下,网络吞吐为9.18Gbps,和传统的SRIOV场景(吞吐为9.32Gbps)相比,基本持平,这是因为Mellanox的这种方案是基于SRIOV加速的,因此转发速率逼近传统SRIOV场景下的性能,并没有较大的性能损耗;而带有sg的fastpath offload场景下,网络吞吐只达到7.5Gbps,性能出现了较大的下降,是因为Mellanox CX-5网卡在基于SRIOV加速的场景下,不支持ct_state,导致涉及到ct操作带有ct_state匹配字段的流表均不能通过TC下发到网卡中,这时仍然需要在内核态完成这些操作,也因此出现了性能较大损耗的问题。

传统的SRIOV场景,虚机流量经网卡转发,虽然传输路径短,转发性能很高,但是流量控制基本上脱离主机,无法进行控制;Mellanox CX-5网卡基于SRIOV加速流量转发,可以通过conntrack实现流量的控制,进而实现安全组功能,但是目前由于功能上的不完善,导致在开启安全组时,网络转发性能降低,网络吞吐下降。

由此也可以看出,Mellanox Smart Nic的Hardware Offload功能虽然很强大,但是仍然有一些不完善的地方,后续仍需要持续开展软硬件协同,以及进一步的对接和优化工作。

四、Smart Nic应用前景

当前,随着众多业务和应用上需求导致的数据流量激增,对虚拟网络性能的提高变得日益迫切。传统的一些虚拟交换技术难以满足当前快速增长的高网络带宽应用需求,Smart Nic能够实现众多的Hardware Offload功能,为CPU“减负”,释放宝贵的CPU资源,大大提高网络和应用性能,对网络虚拟化应用的性能有很大影响。

目前业内主流厂商都已经进行了Smart Nic的相关研发,有些Smart Nic方案也已经应用到了实际项目中。但是,各个厂商使用的Smart Nic 架构和方案不尽相同,Smart Nic方案目前也比较多,各个方案的实现各有利弊,并没有形成一个统一的方案。我们应用Smart Nic助力网络转型升级,更好地满足公有云、私有云业务需求。

 五、参考链接  

1. http://www.mellanox.com/blog/2018/08/defining-smartnic/

2. http://www.mellanox.com/blog/2018/09/why-you-need-smart-nic-use-cases/

3. https://yq.aliyun.com/articles/604505

4.https://static.sched.com/hosted_files/lc32018/57/Zero-Copy%20Optimization%20for%20DPDK%20vhost-user%20Receiving_Jing%20Chen.pdf

5. http://www.mellanox.com/blog/2018/09/why-you-need-smart-nic-use-cases/

免责声明:文章转载自《基于智能网卡(Smart Nic)的Open vSwitch卸载方案简介》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇《学习opencv》笔记——矩阵和图像操作——cvAnd、cvAndS、cvAvg and cvAvgSdvJava switch 枚举下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

实验2:Open vSwitch虚拟交换机实践

一、实验目的 能够对Open vSwitch进行基本操作; 能够通过命令行终端使用OVS命令操作Open vSwitch交换机,管理流表; 能够通过Mininet的Python代码运行OVS命令,控制网络拓扑中的Open vSwitch交换机 二、实验环境 下载虚拟机软件Oracle VisualBox 或 VMware; 在虚拟机中安装Ubuntu...

[ 伪装 ] 修改User-Agent伪装浏览器信息操作系统

0x00.了解User-Agent(UA)字符串   浏览器在浏览网页时,会将本机的浏览器信息通过请求头中的User-Agent(UA)字符串发送到web服务器。 UserAgent | Introduce 用户代理 User Agent,是指浏览器,它的信息包括硬件平台、系统软件、应用软件和用户个人偏好。 早的时候有一个浏览器叫NCSA Mosaic,...

DirectCompute & DirectX 11 计算着色器编程简介(翻译)

译者注:DirectX一直是Windows上图形和游戏开发的核心技术。DirectX提供了一种在显卡上运行的程序——着色器(Shader)。在DirectX 11之前,着色器是与具体的渲染步骤绑定的,例如像素着色器,顶点着色器等等。而从DirectX11开始,DirectX增加了一种计算着色器(Compute Shader),它是专门为与图形无关的通用计算...

CentOS查看CPU、内存、网络流量和磁盘 I/O【详细】

安装 yum install -y sysstat sar -d 1 1 rrqm/s: 每秒进行 merge 的读操作数目。即 delta(rmerge)/swrqm/s: 每秒进行 merge 的写操作数目。即 delta(wmerge)/sr/s: 每秒完成的读 I/O 设备次数。即 delta(rio)/sw/s: 每秒完成的写 I/O 设备次数。...

扒一扒安卓渲染原理

导语:在测试流畅度的过程中,必不可免的要与FPS,Jank等指标接触,但为了加深理解,今天来简单扒一扒安卓的渲染原理;PerfDog使用Jank作为来代表游戏流畅度的指标,详情可以看APP&游戏需要关注Jank卡顿吗? 一.CPU与GPU结构 现在大部分移动端都会配有CPU(中央处理器)和GPU(图形处理器),有的现在还有一块NPU用于处理智能运算...

收录 Uboot 详解

--------------------------------------------------------------------------------------------------------  我们知道,bootloader是系统上电后最初加载运行的代码。它提供了处理器上电复位后最开始需要执行的初始化代码。     在PC机上引导程序一般...