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会越来越好。