矢量报文处理
一、标量与矢量报文处理
(1)标量报文处理
典型的标量报文处理网络协议栈一次仅处理一个数据包:中断句柄从网口获取一个数据包,并对其进行一系列的处理(处理接口调用)。
+---> fooA(packet1) +---> fooB(packet1) +---> fooC(packet1)
+---> fooA(packet2) +---> fooB(packet2) +---> fooC(packet2)
...
+---> fooA(packet3) +---> fooB(packet3) +---> fooC(packet3)
标量报文处理虽然简单,但有以下问题:
1.当指令路径长度(code path length)超出微处理器的指令高速缓存(Instruction Cache)的大小时,微处理器不断地加载新的指令集,会造成抖动(Cache Trashing)。
2.由于区域栈从微处理器的一级高速缓存(D-Cache)中被挤出,相关深调用栈也会增加加载存储模块的压力。
(2)矢量报文处理
对比而言,矢量报文一次性处理多个数据包。称为“数据包矢量”或“矢量”。中断句柄从网口获取数据包矢量(多个数据包),并对矢量进行一系列处理(处理接口调用)。
+---> fooA([packet1, +---> fooB([packet1, +---> fooC([packet1, +--->
packet2, packet2, packet2,
... ... ...
packet256]) packet256]) packet256])
此种方式解决的问题:
1.通过多个数据包分担指令高速缓存的加载损耗,解决了上述的缓存抖动问题。
2.通过一次性从网口获取矢量报文,并在有向节点图中处理它们,解决调用栈过深造成的低效问题。该有向图调度器每次触发一个节点分发接口,从而将调用栈深度约束到少数几个栈帧。
此方式的优化方法还有:通过流水线与预取最小化表数据读取延迟,通过平行加载数据包来满足数据包处理。
(3)相关概念
抖动
当计算机的虚拟内存资源被过渡使用时,会造成不断地分页与缺页的状态,对大多应用级进程造成影响。这种现象会持续到用户关闭部分应用或者活跃的进程释放了额外的虚拟内存。
在完成了初始化阶段后,大部分运行在与其自身需要的整体内存而言相对较少的代码与数据页上运行。访问频次最高的页被称为工作集。当工作集只占用整个系统的虚拟内存很少一部分资源时,虚拟内存系统可以高效的工作,并且解决页错误所耗费的计算资源也相当有限。但是,随着工作集的不断增长,解决页错误所耗费的资源将远超过程序本身工作所需要的资源。这种现象,被称为抖动(Trashing)。
指令路径长度(Instruction path length)
运行计算机程序的某部分所需的机器指令数量,被称为指令路径长度。整个程序的指令路径长度可作为计算该算法在指定计算机硬件上的性能能的方式。
二、数据包处理图
数据包处理图是vpp设计的核心。具有以下特性:
插件式,易于理解与扩展;
成熟的图节点架构;
流水线重组的完全控制;
快速,插件优先级相同;
vpp数据包处理流水线被分解为数据包处理图。这种模块化的方式意味着任何都可以插入新的节点。这使得vpp易于扩展,并且依据具体目标自定义插件。vpp还可通过其底层接口进行配置。
在运行时,vpp平台从接收端接口收集数据包进矢量,每个矢量最多包含256个数据包。然后,应用数据包处理图,以节点为单位对数据包进行处理。每个节点依次作用于矢量,并根据其代表的网络协议进行处理数据包。图节点体量小、模块化,且松耦合。使得引入新节点,与已存在的节点建立连接变得容易。
插件以动态库的形式存在,并被vpp在运行时加载。vpp根据插件路径查找动态库,并在启动阶段依次加载他们。插件即可引入新节点,也可重新组织图节点。你可以在vpp源码树上建立完全独立的节点,既你可以把它当做独立的组件。
三、网络协议栈(2~3层)
协议栈 |
---|
路由、网桥快表 |
任意元组识别器 |
控制面功能 |
表述不当、以及错误之处,欢迎指正。