矢量包处理(VPP)比传统内核方法快 100 倍


矢量包处理 (VPP) 是一种开源软件,可以通过批处理数据包和使用 SIMD 指令等技术在商用硬件上提高吞吐量。

矢量包处理 (VPP) 是一种在软件中高速处理数据包的技术。它将数据包处理从内核移到用户空间以获得更好的性能。

VPP 不是通过整个处理图顺序处理每个数据包,而是通过图中的每个节点处理数据包向量,然后再移动到下一个节点。这减少了缓存和获取每个数据包指令的开销。

矢量数据包处理使软件通过并行图形处理处理网络数据包的速度比传统内核方法快 100 倍。

VPP 可以在单个内核上处理超过 100 Gbps 的大型数据包,从而允许软件取代昂贵的专用硬件。它使用插件架构和 API 使其可编程和可扩展。

VPP 部署在各种硬件和不同环境中,例如裸机、虚拟机和容器。它是一个开源项目,需要通过测试、支持和集成来产品化以供实际使用。

基于内核的数据包处理
几十年来流行的数据包处理模型一直是“基于内核的”。

现在,内核是操作系统皇冠上的宝石。它管理计算机及其最重要硬件的操作 - 特别是内存和 CPU 时间。内核也很小(相对而言)。它很精致。而且,当许多计算机进程请求它的关注时,它会非常非常繁忙。

因此,数据包的内核处理是围绕以下原则设计的:一次接收一个数据包,从指令缓存中获取一条指令,对数据包执行该指令,获取下一条指令,执行该指令,依此类推。然后,该数据包以愉快的方式发送,第二个数据包进入并经历相同的例程。

一堆木材的比喻:其中每块木材都需要切割、打磨并钻孔。有两种方法可以完成这项工作。

  1. 一次一块地对每块板进行切割、打磨和钻孔。
  2. 或者,切割所有板,然后打磨所有板,然后钻孔所有板。

第二种方法将节省大量时间,因为您将避免在每个电路板上的每个流程步骤中更换工具。

基于内核的处理是前一种方法。在强大的 CPU(例如 Intel® Xeon® 级处理器)上,使用原生 Linux 进行的数据包转发最高可达每秒 200 万个数据包 (Mpps),并且很容易受到内核锁定和其他影响的阻碍。通过实验技术,Linux 已被证明在人工基准测试中取得了一些进展,例如丢弃所有收到的数据包,但仍然需要大量工作,并且 VPP 现已可用。

现在,如果上述设备之一具有 10 Gbps 接口,您将如何足够快地处理数据包以填充该管道?

对于单个 10 Gbps 链路,将多个 Linux 系统与负载平衡器捆绑在一起将消耗大量成本、空间、热量等 - 所以您知道这是怎么回事。需要大量的资本支出和运营支出。或者,您可以选择昂贵的供应商专有的专用集成电路 (ASIC) 或现场可编程门阵列 (FPGA) 解决方案。

矢量包处理
如果数据包处理可以摆脱内核的限制会怎么样?如果数据缓存可以同时应用于一组数据包,而不是一次一个,会怎么样?

这不再是“假设”。这是现实。介绍矢量包处理 (VPP)。VPP 是思科矢量数据包处理技术的开源版本,该技术是价值超过 10 亿美元的思科 ASA 和 CSR 产品的核心。所以,核心技术已经得到验证。本质上,VPP 是一种模块化数据包处理节点图抽象,其中每个节点处理数据包向量以减少 CPU I-cache 抖动,并且可通过插件进行扩展和动态重新配置。

VPP 将数据包处理工作负载从内核空间移至用户空间。用户空间是程序和库(操作系统用于与内核交互的软件,例如执行输入/输出、操作文件系统对象、应用程序软件等的软件)所在的位置。因此,有更多的“活动空间”来管理基于缓存的指令集。

然后,它通过数据包处理图处理该数据包向量,这是关键的性能突破。

VPP 不是通过整个图处理每个数据包,然后获取第二个数据包并通过整个图处理它,而是通过第一个图节点完全处理数据包向量,然后再移动到下一个图节点。向量中的第一个数据包会“预热”指令缓存,因此可以极快地处理剩余数据包 - 大幅降低处理向量中每个后续数据包的成本。这导致

  • 1) 处理单个数据包的性能非常高,
  • 2) 随着时间的推移处理大量数据包时具有统计上可靠的性能。

此外,VPP 通常会预取它所知道的下一个数据包,确保从 RAM 获取下一个数据包时 CPU 不会停止。因此,吞吐量很高,延迟始终很低。

部署
FD.io 是一系列项目和库的集合,旨在在通用硬件平台上实现灵活、可编程和可组合的服务。当然,VPP 在其中占有重要地位。它在多种架构的用户空间中运行,包括 x86 服务器和嵌入式设备上的 x86、ARM 和 PowerPC 架构。


网友分享:

  • 我们多年来一直在使用 BGP 和 VPP 运行我们的核心路由器,在软件堆栈上推动约 40-50 Gbps,而不需要那些昂贵的 ASIC。
  • VPP 通过从用户空间轮询 NIC 来避免用户空间和内核之间的上下文切换。与进入内核的解决方案相比,这减少了延迟。
  • VPP 在每个处理阶段批量处理数据包,然后进入下一阶段,从而提高缓存命中率。将核心专用于阶段可以进一步优化这一点。
  • 虽然 GPU 可以提供并行性,但 GPU 上的数据包处理会带来可能不适合网络的延迟。CPU 上的 VPP 可提供更好的延迟,而无需牺牲并行性。