目录

文章目录

  • 目录
  • 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 的实现原理

  1. 基于矢量图节点(Directed Graph of Nodes)的数据包处理(Packet Processing )

  2. 数据包以矢量(Vectors)为粒度的形式在图节点(Graph Nodes)间移动

  3. 适应 CPU 指令高速缓冲(Instruction Cache)的图节点(Graph Nodes)处理程序

  4. 数据包被预取到数据缓存(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,使单个报文的处理开销显著降低。

由此可见,矢量报文处理解决了标量报文处理的主要性能缺陷,并有具有如下优点:

  1. 解决了 I-cache 抖动问题。
  2. 对 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 作为输入/输出的最小处理单位进行处理,有几个好处:

  1. 从软件工程的角度看,每一个 Graph Node 是独立和自治的。

  2. 从性能的角度看,主要的好处是可以优化 CPU 指令缓存(I-cache)的使用。当前 Packet Vector 的第一个报文 packet-1 加载当前 Node 的指令到指令缓存,当前 Packet Vector 的后续报文就可以 “免费” 使用指令缓存。这里,VPP 充分利用了 CPU 的矢量结构,使报文内存加载和报文处理交织进行,达到更有效地利用 CPU 处理流水线。

  3. 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 的实现原理解析相关推荐

  1. 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 ...

  2. FD.io/VPP — IPSec

    目录 文章目录 目录 VPP/IPSec Configuration Use case 1 HTTP Server configuration strongSwan initiator configu ...

  3. FD.io/VPP — VPP 的配置与运行

    目录 文章目录 目录 配置 80-vpp.conf startup.conf 可以配置 VPP 的 Threading Modes 运行示例 non-DPDK 模式运行 VPP DPDK 模式运行 V ...

  4. FD.io/VPP — VPP 的安装部署

    目录 文章目录 目录 源码编译安装 Troubleshooting 问题 1:Errors were encountered while processing 问题 2:NASM is not ins ...

  5. FD.io/VPP — Overview

    目录 文章目录 目录 FD.io VPP FD.io 官网:https://fd.io FD.io(Fast data – Input/Output)是 Linux 基金会下属的一个开源项目,成立于 ...

  6. FD.io VPP 20.09版本正式发布:往期VPP文章回顾+下载地址+相关链接

    目录 下载RPM/DEB包 往期文章回顾与推荐 FD.io是一些项目和库的集合,基于DPDK并逐渐演化,支持在通用硬件平台上部署灵活可变的业务.FD.io为软件定义基础设施的开发者提供了一个通用平台, ...

  7. FD.io VPP官方邮件列表

    https://www.mail-archive.com/vpp-dev@lists.fd.io/ 邮件内容更新截至2020年9月21日17:23:47 Messages by Thread [vpp ...

  8. FD.io VPP:用户文档:VPP RPM包的构建与离线安装

    VPP RPM包的构建与离线安装 RToax 2020年9月 要开始使用VPP进行开发,您需要获取所需的VPP源代码,然后构建软件包. 1. 设置代理 如果你的服务器本地可以连接互联网,则跳过设置代理 ...

  9. FD.io VPP:CentOS7下构建自己的VPP RPM包

    FD.io VPP:用户文档 构建VPP RToax 2020年9月 要开始使用VPP进行开发,您需要获取所需的VPP源代码,然后构建软件包. 1. 设置代理 如果你的服务器本地可以连接互联网,则跳过 ...

  10. How-to: Build VPP FD.IO development environment with Mellanox DPDK PMD.

    目录 References Prerequisite Installation, Compilation and Configuration VPP is an open-source Vector ...

最新文章

  1. 双向TVS管 30KP42CA
  2. iOS url出现特殊字符处理 -- stringByAddingPercentEncodingWithAllowedCharacters
  3. Android Notification实现推送消息过程中接受到消息端有声音及震动及亮屏提示
  4. Python 入门到精通(—)初识Python
  5. 刑事科学技术专业与计算机专业,辽宁警察学院刑事科学技术专业
  6. 自动化测试,面试【必备题】
  7. [TJOI2015]弦论(后缀数组or后缀自动机)
  8. 电脑常见问题之-右键无新建文件夹选项
  9. mocha-在浏览器中运行
  10. 基于低代码平台(Low Code Platform)开发中小企业信息化项目
  11. shui-执行多个window.onload
  12. xUnit安装及注意事项
  13. 网管必看的好东东(十)
  14. 运营商大数据:未来移动联通电信三大运营商数据会同步共享吗?
  15. IE11 error object doesn't support property or method 'fill'
  16. 2021年R2移动式压力容器充装报名考试及R2移动式压力容器充装考试资料
  17. simple_bypass
  18. 如何让外网访问本地WEB服务器
  19. java基础:Linux系统下GiB和GB的换算
  20. 开放原子开源基金会副秘书长刘京娟:中国开源发展现状及趋势思考

热门文章

  1. GRDB使用SQLite的WAL模式
  2. php记录用户搜索历史记录,PHPCookei记录用户历史浏览信息的代码
  3. python读取nii文件_python实现批量nii文件转换为png图像
  4. matlab模拟塞曼图谱,塞曼效应以及能级的计算
  5. ERROR: Command errored out with exit status 1: python setup.py egg_info Check the logs for full comm
  6. JAVA实现顺时针打印矩阵问题(《剑指offer》)
  7. 现在的桥都会做仰卧起坐了!中国首座3D打印桥亮相上海
  8. 清华类脑计算成果再登Nature:张悠慧施路平团队出品,有望打破冯诺依曼瓶颈...
  9. JS 中 this 的指向
  10. 硬科技凭什么产业化?