FD.io/VPP — VPP 的实现原理解析
目录
文章目录
- 目录
- VPP 的实现原理
- Packet Vector(矢量数据报文)
- 标量报文处理方式
- I-cache miss 问题
- 矢量数据报文处理方式
- 标量 v.s. 矢量报文的处理流程
- Packet Processing Graph(数据报文的矢量图)
- Packet Processing Graph 的处理流程
- Packet Processing Graph 的 Plugin 机制
- Vector processing Example
- Ping
- Split
- Cloning
- IPSec flow
VPP 的实现原理
基于矢量图节点(Directed Graph of Nodes)的数据包处理(Packet Processing )。
数据包以矢量(Vectors)为粒度的形式在图节点(Graph Nodes)间移动。
适应 CPU 指令高速缓冲(Instruction Cache)的图节点(Graph Nodes)处理程序。
数据包被预取到数据缓存(Data Cache)中。
NOTE:Instruction cache & data cache always hot -> Minimised memory latency and usage.
Packet Vector(矢量数据报文)
所谓的 “矢量(Vector)” 是与传统的 “标量(Scalar)” 报文处理相对而言的。矢量是一个自然科学术语,是一种既有大小又有方向的量,又称为向量。在计算机科学中,矢量图(Vector Graph)可以无限放大永不变形。
标量报文处理方式
标量报文处理方式:是人类常用的逻辑思维方式,即:报文(Packet)是按照到达先后顺序来处理,第一个报文处理完,再处理第二个,依次类推。更为传统的方式还需要结合处理中断,并遍历调用栈(e.g. A calls B calls C….return return return…), 然后从中断返回,函数会频繁嵌套调用。最后,该过程执行后续三种操作之一:1)不作处理;2)丢弃或重写;3)转发报文。
由此可见,传统的标量报文处理方式具有一个明显的缺陷 —— I-cache misses(CPU 指令缓存抖动)。因为 Cache 具有时间局限性和空间局限性的特点,所以每个数据报文都会产生一个 I-cache misses。面对这个问题,除了提供更大的 Cache 空间之外,没有解决方法。
I-cache miss 问题
短时间存活的数据流或高熵数据报文字段(那些在数据包之间具有不同值的数据包)都会使 I-cache(CPU 指令缓存)失效。
当计算设备启动时,I-cache 是空的,称为缓存是 “冷” 的,此时所有冷缓存查询都会失败。未命中的数据报文随后用于填充缓存,称呼该动作为缓存 “预热”,称呼此时的 I-cache 为缓存是 “热” 的,此时热缓存的查询会有适当数量的 “命中”。
缓存可以使用简单的先进先出(FIFO),或者最近最少使用(LRU)或最不常用(LFU)算法决定是否用新的缓存替换旧的缓存。这个替换策略很重要,因为高速缓存流失可能是由于不良的替换算法造成的。然而,更可能的原因是那些讨厌的短时间存活的数据流,每次新添加短时间存活的数据流缓存都会导致后续查询 miss,并且可能会替换缓存中的长期数据流缓存。I-cache 缓存中的有用的数据不断被替换,这一现象称之为 “缓存抖动”。
显然的,I-cache 缓存抖动会导致数据报文处理效率的显著降低。同时,根据数据报文处理的时间局部性和空间局部性原理,我们知道在短时间内采样的数据报文分组它们本质上相似,即使不相同,相似性也很强。具有此类属性的数据报文将重用相同的资源,并将访问相同(缓存)的内存位置。VPP 根据该特性,通过防止 I-cache 缓存抖动可以显著提高数据报文的处理效率。
矢量数据报文处理方式
矢量报文处理方式:则是一次处理多个报文,即:一次处理一个报文数组(Packet Vector),而非单个报文(Packet)。把一批从底层硬件队列 Rx Ring(收队列)收到的报文,组成一个报文数组,称为 Packet Vector(矢量报文),再助于 Packet Processing Graph(报文处理图)来组织处理流程。
矢量报文处理方式积极地利用了 Cache 的时间局部性特点,将一组 Packets 组织称一个 Packet Vector,如果 I-cache 命中,则这一组 Packet 都会命中;否则,都未命中。而未命中时,则通过 Packet Vector 中的第一个报文 packet-1 为 I-cache 进行预热,为 Packet Vector 中后续的 Packets 进行 CPU 指令缓存加速。如此的,Packet Vector 中剩下 Packets 的处理性能可以直接达到极限。
简而言之,矢量报文处理方式将整个 Packet Vector 的高速缓存 Miss Time 分摊到了第一个报文(packet-1)的高速缓存 Miss Time,使单个报文的处理开销显著降低。
由此可见,矢量报文处理解决了标量报文处理的主要性能缺陷,并有具有如下优点:
- 解决了 I-cache 抖动问题。
- 对 I-cache 进行预热缓解了读时延问题,高性能并且更加稳定。
标量 v.s. 矢量报文的处理流程
标量报文处理
矢量报文处理
Packet Processing Graph(数据报文的矢量图)
VPP 的软件架构包括一个开发框架和一系列根据 Packet Processing Graph 组织的 Graph Node。其中:
Packet Processing Graph:则由多个 Graph Node(图节点)组成,Graph Node 把整个报文处理流程分解为一个个先后连接的 Service Node(服务节点)。Packet Vector 首先被第一个 Graph Node 处理,然后依次被第二个、第 N 个 Graph Node 处理,依次类推。
开发框架:包含了基本的数据结构、定时器、驱动程序、在 Graph Node 间分配 CPU 时间片的调度器、性能调优工具(e.g. 计数器、抓包工具)。VPP 的开发框架采用了 Plugin 机制,Plugin Graph Node 与 VPP Build-in Graph Node 被同等对待,从而有利于快速灵活地开发新功能。因此,插件机制使开发者能够充分利用现有模块快速开发出新功能。实际上,插件的本质就是实现了某一特定功能的 Graph Node,但也可以是一个驱动程序或者 CLI。Plugin Graph Node 能被插入到 VPP 的 Packet Processing Graph 中的任意位置。
Packet Processing Graph 的处理流程
如上图,VPP 首先从 Input Node(输入节点)轮询(或中断)以太网接口的接收队列,获取批量报文。接着把这些报文按照下一个 Graph Node 的功能组成一个 Packet Vector 或者帧(Frame)。比如:Input Node 收集所有 IPv6 的报文并把它们传递给 ip6-input Node。
当 ip6-input Node 被调度时,它取出第一个报文 packet-1,利用双循环(Dual-Loop)或四循环(Quad-Loop)以及通过预取报文到 CPU 缓存技术来处理报文,可以有效减少 I-cache miss 数量,以达到最优性能。当 ip6-input 节点处理完当前帧的所有报文后,把报文传递到后续不同的节点。比如:如果某报文校验失败,就被传送到 error-drop 节点。而正常报文被传送到 ip6-lookup 节点。packet-1 依次通过不同的 Graph Node,直到它们被 interface-output Node 发送出去。
每个 Graph Node 都利用 Packet Vector 作为输入/输出的最小处理单位进行处理,有几个好处:
从软件工程的角度看,每一个 Graph Node 是独立和自治的。
从性能的角度看,主要的好处是可以优化 CPU 指令缓存(I-cache)的使用。当前 Packet Vector 的第一个报文 packet-1 加载当前 Node 的指令到指令缓存,当前 Packet Vector 的后续报文就可以 “免费” 使用指令缓存。这里,VPP 充分利用了 CPU 的矢量结构,使报文内存加载和报文处理交织进行,达到更有效地利用 CPU 处理流水线。
VPP 也充分利用了 CPU 的预测执行功能来达到更好的性能。从预测重用报文间的转发对象(比如:邻接表和路由查找表),以及预先加载报文内容到 CPU 的本地数据缓存(d-cache)供下一次循环使用,这些有效使用计算硬件的技术,使得 VPP 可以利用更细粒度的并行性。
VPP 的 Packet Processing Graph 特性,使它成为一个松耦合、且高度一致的软件架构。每一个 Graph Node 利用 Packet Vector 作为输入和输出的最小处理单位,这就提供了松耦合的特性。通用功能被组合到每个 Graph Node 中,这就提供了高度一致的架构。
Packet Processing Graph 的 Plugin 机制
VPP Packet Processing Graph 中的 Node 是可替代的,这个特性和 VPP 支持动态加载 Plugin Node 的机制相结合时,新功能能被快速开发,而不需要新建和编译一个定制的代码版本。
简而言之,VPP 的 Graph Node 组织方式,使用户可以根据需求,通过 Plugin 的方式插入新的 Graph Node 或者重新排列 Graph Nodes 的处理顺序,扩展非常方便,也不会影响原有核心处理流程。
Vector processing Example
Ping
Split
Cloning
IPSec flow
FD.io/VPP — VPP 的实现原理解析相关推荐
- FD.io VPP的C语言接口如何使用:FD.io VPP: How To Use The C API
目录 引言 - Introduction C语言API概述 - C API Overview 运行环境 - The Runtime Environment API回顾 - Message API Re ...
- FD.io/VPP — IPSec
目录 文章目录 目录 VPP/IPSec Configuration Use case 1 HTTP Server configuration strongSwan initiator configu ...
- FD.io/VPP — VPP 的配置与运行
目录 文章目录 目录 配置 80-vpp.conf startup.conf 可以配置 VPP 的 Threading Modes 运行示例 non-DPDK 模式运行 VPP DPDK 模式运行 V ...
- FD.io/VPP — VPP 的安装部署
目录 文章目录 目录 源码编译安装 Troubleshooting 问题 1:Errors were encountered while processing 问题 2:NASM is not ins ...
- FD.io/VPP — Overview
目录 文章目录 目录 FD.io VPP FD.io 官网:https://fd.io FD.io(Fast data – Input/Output)是 Linux 基金会下属的一个开源项目,成立于 ...
- FD.io VPP 20.09版本正式发布:往期VPP文章回顾+下载地址+相关链接
目录 下载RPM/DEB包 往期文章回顾与推荐 FD.io是一些项目和库的集合,基于DPDK并逐渐演化,支持在通用硬件平台上部署灵活可变的业务.FD.io为软件定义基础设施的开发者提供了一个通用平台, ...
- FD.io VPP官方邮件列表
https://www.mail-archive.com/vpp-dev@lists.fd.io/ 邮件内容更新截至2020年9月21日17:23:47 Messages by Thread [vpp ...
- FD.io VPP:用户文档:VPP RPM包的构建与离线安装
VPP RPM包的构建与离线安装 RToax 2020年9月 要开始使用VPP进行开发,您需要获取所需的VPP源代码,然后构建软件包. 1. 设置代理 如果你的服务器本地可以连接互联网,则跳过设置代理 ...
- FD.io VPP:CentOS7下构建自己的VPP RPM包
FD.io VPP:用户文档 构建VPP RToax 2020年9月 要开始使用VPP进行开发,您需要获取所需的VPP源代码,然后构建软件包. 1. 设置代理 如果你的服务器本地可以连接互联网,则跳过 ...
- How-to: Build VPP FD.IO development environment with Mellanox DPDK PMD.
目录 References Prerequisite Installation, Compilation and Configuration VPP is an open-source Vector ...
最新文章
- 双向TVS管 30KP42CA
- iOS url出现特殊字符处理 -- stringByAddingPercentEncodingWithAllowedCharacters
- Android Notification实现推送消息过程中接受到消息端有声音及震动及亮屏提示
- Python 入门到精通(—)初识Python
- 刑事科学技术专业与计算机专业,辽宁警察学院刑事科学技术专业
- 自动化测试,面试【必备题】
- [TJOI2015]弦论(后缀数组or后缀自动机)
- 电脑常见问题之-右键无新建文件夹选项
- mocha-在浏览器中运行
- 基于低代码平台(Low Code Platform)开发中小企业信息化项目
- shui-执行多个window.onload
- xUnit安装及注意事项
- 网管必看的好东东(十)
- 运营商大数据:未来移动联通电信三大运营商数据会同步共享吗?
- IE11 error object doesn't support property or method 'fill'
- 2021年R2移动式压力容器充装报名考试及R2移动式压力容器充装考试资料
- simple_bypass
- 如何让外网访问本地WEB服务器
- java基础:Linux系统下GiB和GB的换算
- 开放原子开源基金会副秘书长刘京娟:中国开源发展现状及趋势思考
热门文章
- GRDB使用SQLite的WAL模式
- php记录用户搜索历史记录,PHPCookei记录用户历史浏览信息的代码
- python读取nii文件_python实现批量nii文件转换为png图像
- matlab模拟塞曼图谱,塞曼效应以及能级的计算
- ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full comm
- JAVA实现顺时针打印矩阵问题(《剑指offer》)
- 现在的桥都会做仰卧起坐了!中国首座3D打印桥亮相上海
- 清华类脑计算成果再登Nature:张悠慧施路平团队出品,有望打破冯诺依曼瓶颈...
- JS 中 this 的指向
- 硬科技凭什么产业化?