AsterNOS-VPP 以 LDP 技术释放原生 Nginx 的极致吞吐力

描述

高性能与易用性的企业级抉择

在将 L7 代理能力(如 Nginx)集成到高性能用户态网络栈(如 VPP)时,架构师常面临一种权衡:若要充分发挥 VPP 的转发性能,往往需要对应用进行深度修改,这可能导致生态封闭和运维复杂度提升。然而,在处理现代大规模边缘流量的场景中,将 L7 处理卸载到用户态网络栈已成为一种常见需求。

为此,我们在将 Nginx 与 AsterNOS-VPP 集成时,基于 LD_PRELOAD 机制设计了一套实现方案,力求在保持较高吞吐量的同时,减少对原有应用代码的侵入,以便更好地适应标准的 DevOps 流程。

nginx

传统VPP集成Nginx的瓶颈:VCL“代码孤岛”的代价

路径A:追求跑分极限的VCL方案

在将 Nginx 集成到 VPP 用户态数据面时,传统的“路径A”通常指向 VCL(VPP Communication Library,VPP 通信库)方案 。VCL 方案要求在源码级别修改 Nginx 的核心网络逻辑,将标准的 POSIX socket 调用替换为 VCL API。为什么说VCL是企业网关的“运维噩梦”?
这种深度定制的设计旨在通过纯零拷贝技术压榨出绝对极限的性能,适用于对微秒级延迟有极端要求的封闭“设备”环境。然而,对于企业级网关而言,这种架构是一场运维噩梦。  

  • 紧密耦合与封闭生态:它将 Nginx 与特定版本的 VPP 库紧密绑定,导致用户无法自由加载 Nginx 社区模块。  
  • 高危漏洞修复缓慢:当面对 0 day 漏洞或高危 CVE 时,由于与开源生态切断了联系,用户只能陷入漫长的等待,直到设备厂商完成深度源码合并并发布新版固件。 

AsterNOS-VPP 集成 LDP(LD_PRELOAD)技术的考量

企业边缘网关在追求高吞吐量的同时,也需要稳定处理多样化的L7工作负载(如WAF、GeoIP、Portal认证)。为此,在将Nginx集成到AsterNOS-VPP时,我们选择了基于 LD\_PRELOAD 机制的方案(简称LDP)。该方案允许在轻微性能开销下,换取更好的生态兼容性和运维灵活性。

什么是LDP(LD_PRELOAD)机制?

LDP的核心是利用Linux系统的 LD\_PRELOAD 环境变量。该技术能在程序启动时,优先加载一个预定义的共享库,从而在不修改Nginx原生二进制文件的情况下,在运行时将其部分网络系统调用“拦截”并重定向至用户态网络栈(如VPP)。
核心工程价值:100%原生二进制兼容与零窗口期修补

  • 100% 原生二进制兼容:系统直接运行标准的Nginx二进制文件,无需为其定制编译或使用特殊工具链。这有助于直接沿用已有的复杂配置,并降低与上游版本同步的复杂度。
  • 极速风险漏洞响应:由于 LDP 与原生二进制文件完全解耦,更新基础 Nginx 容器镜像无需任何自定义代码合并,直接更新基础二进制文件即可将漏洞窗口期缩短至零。  

智能透明回退:错综复杂内网环境的“安全网”

在企业内网等复杂环境中,可能存在非标准或管理流量。LDP方案设计了回退机制:当流量不适用于VPP加速路径时,会自动交由原生的Linux内核网络栈处理,避免了对所有流量类型进行适配改造。

VCL与LDP架构深度对比:研发与DevOps维度的较量

为了更清晰地展示这两种技术在现实世界中的研发生态和 DevOps 差异,我们可以通过下表进行直观对比:

评估维度VPP + VCL (侵入式修改)AsterNOS-VPP (LDP机制)
核心设计目标封闭式设备;追求极限跑分指标开放式平台;追求生态兼容与敏捷性
模块扩展性极差(需要厂商为第三方模块适配源码)优秀(原生二进制模块100%即插即用)
CVE修补周期缓慢(依赖深度源码合并与重新编译)即时(直接更新基础二进制文件,无需改动源码)
非标准流量处理弱(缺乏对非标准流量的高效回退机制)强(透明回退至Linux内核进行安全处理)

技术揭密:LDP工作原理—系统调用拦截与旁路内核传输

LDP 的核心是在 Nginx 进程无感知的情况下,将其网络I/O路径从内核态转向用户态的 VPP。对 Nginx 而言,其 socket 相关调用看似仍与内核交互,但实际的数据传输已由 VPP 接管。

系统调用拦截

AsterNOS 利用 Linux 的 LD_PRELOAD机制。在 Nginx 工作进程启动时,系统会预先加载一个名为 libvcl_ldpreload.so的动态库。当 Nginx 调用如 socket(),accept(), read()等标准套接字函数时,该库会在 libc 层面拦截这些调用,并改变其执行路径。

nginx通过LDP机制,将流量从内核转向VPP。

用户态高速数据传输技术

调用被拦截后,LDP 库将与 VPP 主进程建立的共享内存区域(Memory Bridge)进行通信。通过查询 VPP 的会话层(Session Layer)状态,到达的数据包可以直接从 VPP 的环形缓冲区(VPP Ring Buffer)映射到 Nginx 进程的用户态内存空间中。这种方法减少了在内核网络协议栈中的多次数据复制,提升了传输效率。

nginx通过LDP机制,Nginx直接从 VPP获取数据。

内核旁路的效果

通过上述过程,数据平面的主要处理流程被转移到了 VPP 的用户态协议栈中完成,从而避免了在内核网络栈中处理所产生的上下文切换和数据复制开销。VPP 可以直接处理包括 TLS 加解密在内的一系列网络功能,实现了网络功能的用户态加速。

nginxNginx通过AsterNOS-VPP(LDP机制)绕过Linux内核加速网络通信

操作示例:通过 SONiC CLI 管理集成VPP的Nginx

在集成了LDP机制的AsterNOS-VPP中,用户无需手动配置LD_PRELOAD等底层环境变量。系统通过基于SONiC扩展的统一CLI,提供了集中的管理入口。以下为典型操作示例:

# 1. 全局初始化 Nginx 并分配专用 CPU 核心以保证性能 sonic# configure terminal sonic(config)# nginx start sonic(config)# cpu_core nginx_num 2 vpp_num auto # 2. 直接导入并复用现有的 Nginx Server 块配置 sonic(config)# nginx update server /home/admin/proxy.conf # 3. 毫秒级的热加载应用更改 sonic(config)# nginx reload

保持运维体验与开源生态兼容性

在工程实践中,架构的开放性与运维的敏捷性是需要重点考量的因素。本方案通过系统调用拦截技术实现网络加速,旨在减少对上游社区标准组件的修改,从而保持与开源生态的兼容性。用户可以使用未经修改的原生Nginx二进制文件,并沿用已有的配置、工具链与运维流程,以期在获得性能提升的同时,降低对现有DevOps实践的侵入性。

 

参考文献
[1] https://fd.io/technology/

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分