替代专用硬件!一文梳理开源VPP+DPDK技术和产业界应用实例
VPP 这一开源技术在通用 CPU 的基础上,实现了传统上需要专门的网络硬件设备(如路由器)和专业的网络操作系统才能达到的性能,以极高的性价比为广大用户带来了开放网络技术的红利。
VPP(Vector packet processing)是 Linux 基金会下 FD.io 项目的一部分,目标是提供一个快速的 L2-L4 用户态网络堆栈,该堆栈可在 x86、ARM 和 POWER 等常见架构上运行。VPP 从网络 IO 层读取最大可用数据包矢量,然后通过数据包处理图(Packet Processing Graph)处理这个矢量。
VPP 集成了DPDK(Data Plane Development Kit)项目,通过它直接访问硬件网卡资源。
什么是VPP(矢量包处理)
与矢量包处理相对的是传统的“标量(scalar)”处理。
在标量处理模式下,系统一次仅处理一个数据包,完成整个包处理流程后再处理下一个包。在这种模式下,每个数据包都需要独立分配计算资源、缓存管理、并经历上下文切换。当网络I/O速度很高时,这些额外的开销与处理单个包的时间相近,导致效率低下。
VPP 通过引入以下改进克服了标量处理的不足:
批量处理多个数据包
VPP 通过将一组数据包(典型为64个或更多)组合成一个“矢量”,在每个节点中一次性对这些数据包进行处理。与逐个包处理相比,这种方式分摊了资源准备和上下文切换的开销,从而显著提升了矢量中每个数据包的处理速度。
利用 SIMD 并行处理能力
现代 CPU 的 Single Instruction Multiple Data(SIMD)指令集能够通过单条指令同时对多个数据执行相同的操作。相比于传统的“每次仅处理一个数据”的方式,SIMD 显著提高了运算速度。例如,Marvell OCTEON 10 ARM Neoverse N2处理器支持的 SVE2(Scalable Vector Extensions Version 2)允许灵活配置128位到2048位的矢量长度。在2048位配置下,一条指令可以同时处理高达64个 IPv4 地址,从而大幅提升网络数据流的处理能力。
优化缓存利用
现代CPU通常具备较大的 L1/L2 缓存。矢量处理可以将多个数据包一次性加载到高速缓存中,减少对内存的频繁访问。例如,Marvell OCTEON 10 ARM Neoverse N2 处理器拥有64KB的L1缓存,可以一次存储约42个1500字节的完整数据包或3276个 IPv4 包头,从而减少了多次的缓存-内存交换,进一步提高了包处理效率。
简言之,矢量包处理通过批量化、并行计算和缓存优化,有效提升了处理速度,特别适用于高性能网络环境。
VPP 的优势:用户态网络协议栈
传统的 Linux 网络协议栈工作在内核态,注重通用性和软件灵活性,但在高性能网络中存在瓶颈,主要问题包括:
内核态与用户态切换开销
用户态程序处理网络数据时需要频繁切换到内核态,特别是在高流量场景下会带来显著的延迟。
- 逐层处理开销:协议栈按 OSI 模型逐层处理,每层都涉及协议解析和数据拷贝,导致效率低下。
- 软中断和单线程限制:Linux 内核的网络栈主要依赖软中断和单线程处理,无法充分利用多核 CPU 的优势,特别是高并发时。即使通过RSS(Receive Side Scaling)将不同的数据流分配到多个CPU核心,仍然存在调度和同步的开销,无法实现完全并行处理。
VPP在用户态实现了完整的网络协议栈,包括IP, TCP, Session层和应用层公共库。它解决了传统Linux协议栈的一些问题:
减少上下文切换
VPP在用户态运行,避免了用户态和内核态之间的切换,利用DPDK直接访问网卡,跳过了内核的网络协议栈。
融合协议处理
VPP将 IP、TCP、Session 等协议层结合在一起,减少了协议层之间的冗余数据传递,数据包不需要在每层之间进行反复的数据拷贝和传递,因为这些协议层的处理是在同一内存区域中完成的。
用户态多线程处理
与内核态的单线程处理模型不同,VPP 充分利用现代 CPU 的多核和多线程能力,并在用户态中通过线程池并行处理多个数据流。
用户态的线程调度开销更小,任务分配更灵活,借助多线程,VPP能够将网络流量有效地分布到多个 CPU 核心,近乎线性地提升网络吞吐量。
简言之,用户态网络协议栈技术使得VPP通过减少内核态与用户态切换、融合协议层处理、多线程优化和直接硬件访问,显著提升了高并发和高吞吐量场景下的网络性能。
DPDK 与 VPP 的集成
数据平面开发套件 (DPDK) 是由 Linux 基金会主办的一个开源项目,它提供了一组用户态的库和驱动程序,可提高各种 CPU 架构(如 Intel x86、ARM 和 PowerPC)上的数据包处理速度。
DPDK 绕过 Linux 内核,在用户态执行数据包处理以最大限度地提高网络性能。DPDK 通过使用在用户态运行的”轮询模式驱动程序” (Poll Mode Driver,PMD) 来实现这一点,该驱动程序不断检查传入的数据包队列以查看新数据是否已到达,从而实现高吞吐量和低延迟。PMD 在数据链路层(L2)工作。
VPP 专注于从 L2-L7 的网络协议,并使用 DPDK 作为其网络驱动程序。这种集成将 DPDK 的 L2 性能与 VPP 在 L3 到 L7 上的灵活性相结合。
它们的结合带来如下好处:
- 直接硬件访问: VPP 使用用户态的 DPDK 来直接访问网络硬件,从而避免了传统 Linux网络协议栈中的内核态与用户态切换,消除了大部分与内核相关的开销。
- 直接内存访问: VPP 通过将网络设备的 DMA 内存区域映射到用户态,减少了内存拷贝和上下文切换。
通过与 DPDK 相结合,VPP 实现了完整的用户态网络协议栈,并大幅度提升网络处理性能。
开放网络硬件平台应用实例
智能网关平台
凭借 VPP 技术,星融元新推出的一款采用Marvell OCTEON 10 ARM Neoverse2 8核处理器的小盒子(ET2500),在加载全部BGP路由(约100万条)的情况下,仍具备高达 48Gbps 的路由性能,足以同时处理 3000 个4K高清视频通话的流量,满足企业、小型城域网和小型云边缘网关的需求。
相比未采用 VPP 的同等处理器的网关设备,性能提升了10倍以上。
产品介绍请参考:深度拆解:ET2500 系列开放智能网关平台
ET系列开放计算平台(ET2000/3000系列等)提供一站式的软件开发环境,包括底层基座操作系统、容器虚拟化环境及丰富的应用开发套件。客户可以将跑在x86服务器上的应用便捷的迁移到该平台,同时也可以快速的进行自研应用的开发,充分满足边缘计算、大数据处理、物联网及人工智能等场景的多样化业务需求。
智能网卡
星融元自主研发的 Helium DPU 网卡基于高性能 DPU 芯片设计,提供PCle Gen3.0/4.0 通道接口并支持高达100Gbps多功能业务处理能力,对网络、计算、存储等功能进行卸载和加速,充分释放服务器CPU资源。
基于x86开发的各种 DPDK 应用、VPP 应用和一般 Linux 驱动应用,仅需要简单编译就可以迅速移植到Helium DPU 网卡上。目前 Helium DPU 网卡提供 4 x25GE 和 2x100GE 两种端口速率规格,更高规格的网卡产品正在开发中。
产品和方案咨询:400-098-9811
更多开放网络技术分享,请关注公众号:星融元Asterfusion