高性能转发领域的重要功臣——VPP开源代码

开源
通过轮训模式,绕过Linux内核协议栈,做到零拷贝,直接把数据收到用户态,而DPDK仅仅是IO技术,并没有完善的网络协议栈,因此,VPP应运而生,VPP全程向量报文处理,是思科开源出来的一款网络协议栈软件。

Labs 导读

众所周知,在数据通信领域,传统厂商如华为、中兴、思科等均是用自己的网络转发平台配合硬件板卡转发,也就是我们俗称的硬转发。近些年,随着SDN/NFV等新型网络技术兴起,使用x86平台CPU转发的需求不断的被提及,发展迅速,也相应的出现了一些开源的网络操作系统,比如Linux内核转发,Linux内核中有丰富的网络协议栈,能处理基本的网络二三层转发、NAT、ACL等功能,但是Linux内核最大的问题是性能不够高,难以适应海量级用户转发。

Part 01、VPP简介 

VPP全称Vector Packet Processing,据说是Cisco 2002年开发的商用代码。2016年2月11号,Linux基金会创建FD.io项目。Cisco将VPP代码的开源版本加入该项目,目前已成为该项目的核心。VPP运行于用户空间,支持多种收包方式,最常用的就是DPDK收发包。VPP有两个关键特性:

  • 框架可扩展
  • 成熟的交换/路由功能

VPP是一个模块化和可扩展的软件框架,用于创建网络数据面应用程序。更重要的是,VPP代码为现代通用处理器平台(x86、ARM、PowerPC等)而生,并把重点放在优化软件和硬件接口上,以便用于实时的网络输入输出操作和报文处理。

为了提高性能,VPP数据平面是由转发节点的有向图组成,这些节点在每次调用时处理多个数据包。阶段模块化设计框架允许任何人“插入”新的图形节点,而不需要更改核心/内核代码。

Part 02  VPP的技术原理 

所谓VPP向量报文处理是与传统的标量报文处理相对而言的。传统报文处理方式,同时也是人类常用的逻辑思维方式,即:报文是按照到达先后顺序来处理,第一个报文处理完,处理第二个,依次类推;A callsB calls C….return return return,函数会频繁嵌套调用,并最终返回。Linux内核转发、OpenVswitch的报文处理都是标量报文处理。

由此可见,传统标量报文处理有如下缺陷:

1、I-cache 抖动(cache时间局限性和空间局限性特点)

2、I-cache misses

3、除了扩大cache外,没有变更方案。

相比较而言,向量报文处理则是一次处理多个报文,也相当于一次处理一个报文数组packet[n]如下图:

图片

直白来说,标量报文处理,也就是传统的报文处理,一次是一个包走完整个转发流水线,因为转发流水线上包含各类的功能,比如以太处理、IP处理、ARP处理、策略处理、NAT处理等等,每个处理模块在CPU中是不同的指令去完成,所以一个包顺序的走完这些流程,导致CPU cache中缓存的指令不能复用,所以会产生抖动,势必影响转发效率。而向量报文处理,一次性处理一组向量的报文,一个处理模块一次性处理多个报文,CPU cache中缓存的指令能够最大程度得到复用,效率自然会高。

VPP把一批底层硬件队列Rx ring收到的包,组成一个Packet Vector或者是一组包,借助于报文处理图Packet Processing graph来实现处理流程,图节点graph node把整个过程分解为一个个先后连接的服务node。这一组包(packet vector)被第一个graph node节点的任务处理,然后依次被第二个graph node节点的任务处理,依次类推,如下图所示:

图片

Part 03、  VPP的扩展性  

上图中提到了新功能的插入。纵观其他软转软件比如Linux kernel协议栈、open vswitch,整个转发协议栈代码基本上是分层的,一个总的入口函数,然后根据不同的处理模块,进入不同层次的处理函数,如果在某部分新增处理模块,需要修改主框架的函数逻辑,业务和主框架未解耦,扩展起来不够灵活。

而VPP则不是,VPP采用一种新的思路来实现业务功能处理,VPP是通过graph node串联起来形成一条数据路径来处理报文,每一个功能模块是一个独立的node实现,VPP的总体调度框架把这些node串联起来,node之间可以指定优先级和前后关系,相互独立,调整起来只需要改变优先级和先后关系。另外,如果新增功能,只需新增一个node,在node中实现新增功能逻辑,然后插入到相应node前后,不用的时候可以disable掉,非常方便,而且新增node可以以插件形式编译,做到即插即用。

举个例子,正常的处理顺序:DPDK收包node ---> 以太处理node  --> IP输入node --> IP路由查找node --> 输出node。新增一个需求,需要DPI匹配指导转发,那么DPI功能单独写成一个node,插入到IP输入node和IP路由查找node之间,就ok了。

Part 04、VPP的应用 

前面提到过,VPP是个高性能转发的开源软件,在如今SDN、NFV、云化、算力网络的时代,他会发挥更大的价值。VPP可以在云化场景中作为软路由器/交换机来使用,比如SD-WAN场景中,云端POP点需要具备接入、策略转发、路由、NAT、隧道等能力,VPP因其丰富的网络协议栈功能以及高性能处理能力,能够胜任。比如安全场景中,VPP可以应用于企业出口,做安全网关来使用,再比如,5G核心网中的UPF,也可以使用VPP来实现。总之,需要软转发的地方,总会出现VPP的身影。

Part 05、 后记  

前面提到VPP有诸多变革性的优点,比如丰富的二三层网络协议栈、新增业务开发灵活可扩展、高性能转发等等,但它也不是万能的,VPP的代码上手难度比OVS和Linux内核要高,另外和其他控制面软件在交互的时候,还略有不足,比如对接路由开源软件frrouting,需要通过自身的router插件来实现对接,但是router插件很早之前便没有更新了,功能有所欠缺。同时,VPP本身的稳定性并未达到商用标准,需要使用者在使用的过程中不断的修复和完善,当然,VPP社区也在不断的更新,补充更加丰富的功能以及BUG修复,但要想把开源VPP改造成一个成熟的可商用的稳定产品,还有很多工作要做,同时也相信VPP会越来越好。

责任编辑:庞桂玉 来源: 移动Labs
相关推荐

2016-09-19 10:14:54

PythonNumpy数据

2012-12-17 13:51:22

Web前端JavaScriptJS

2009-08-12 17:48:56

存储高性能计算曙光

2009-06-24 15:00:39

Javascript代

2024-03-20 08:00:00

软件开发Java编程语言

2010-05-07 17:50:31

Unix服务器

2014-04-25 09:02:17

LuaLua优化Lua代码

2015-12-17 13:19:29

编写高性能Swift

2018-01-12 14:37:34

Java代码实践

2015-09-01 15:45:50

开源字体Hack

2010-07-29 11:20:49

Flex源代码

2009-04-20 20:09:15

2018-02-28 10:11:50

腾讯框架开源

2021-02-23 15:24:51

腾讯组件开源

2015-07-16 11:33:10

联想

2024-05-14 15:43:02

2011-04-25 14:06:23

java

2011-04-07 09:25:25

内存Java

2023-11-10 15:35:24

2012-07-05 09:33:32

WPSOpenOffice开源
点赞
收藏

51CTO技术栈公众号