
在现代高性能交易系统中,网络延迟和吞吐量成为关键性技术指标。内核旁路(Kernel Bypass)技术因其能有效降低网络传输延迟、提升吞吐性能,受到越来越多系统开发者的关注。本文将围绕内核旁路的几种主流实现方式进行对比分析,并基于实际测试环境的结果,探讨其在不同场景下的表现和应用价值。
传统网络数据路径需要经过内核协议栈处理,每次数据包收发都会带来上下文切换、中断和系统调用等开销。内核旁路的核心思想是在用户态实现网络数据的收发,直接与网卡交互,避开内核协议栈,从而显著减少延迟与系统开销。

实现内核旁路的常见方式包括:DPDK、Netmap、Solarflare OpenOnload、PF_RING、Snabb、PSIOE 等。
DPDK(Data Plane Development Kit)是 Intel 提出的用户态高速数据包处理框架,基于 UIO(Userspace I/O)机制实现网卡驱动用户态运行。它具备零拷贝、大页内存、流过滤等特性,支持多核并行和硬件加速,适用于对性能要求极高的场景。
DPDK 的优势在于高度可定制和完善的 API 支持,但局限于 Intel 系列网卡,并存在“网卡独占”问题,即系统在使用 DPDK 后,其他程序无法访问该网卡。
Netmap 同样基于用户态实现高速收发,但通过修改内核驱动,在用户态映射网卡内存,实现高效访问。其优势在于代码轻量、可支持标准系统调用如 select、poll,并具备较好的跨平台支持。但其收发操作依赖 ioctl 调用,存在性能瓶颈,且仅支持部分网卡驱动。
OpenOnload 是 Solarflare 公司推出的一种方案,使用 LD_PRELOAD 技术替换应用中的标准 socket 系统调用,通过 EF_VI 库在用户态实现 TCP/IP 协议栈。其好处是应用无需修改即可接入旁路功能,延迟表现优异。但限制在 Solarflare 网卡,成本与兼容性问题较大。
PF_RING、Snabb 等侧重数据捕获和 L2/L3 层处理,适用于 IDS、监控等场景。PF_RING 在收包效率方面表现突出,但发包能力依赖收费模块(DNA);Snabb 和 PSIOE 的应用范围更小,存在诸如缺乏标准调用支持、网卡兼容性差等问题。
为了对以上提出的内核旁路方案进行比对,在开发机上进行了延迟性能测试。主要包括 ping,UDP 包转发,经过内核的 UDP 包转发。
1. 测试环境
2. 测试方案
测试数据包大小为 1024 字节,数据包为 10 万个。每一个包统计一次环路延迟,最终取 平均值。 测试过程为:client 发送 UDP 包给 server;然后 client 阻塞等待从 server 接收包;server 死循环,收到从 client 发来的数据包后,立即从另一个 socket 转发出去;client 在接收到该 数据包后,退出阻塞状态。统计总的延迟。然后进入下一次循环。
Step1:
从 12 机器 ping 11 机器。11 机 器旁路程序收到数据后,直接交给 内核网络协议栈。协议栈返回信息 交给旁路程序,再由旁路程序发送 出去。 测试使用的程序仍然为常规 Linux 下转发程序。
Step2:
从 12 机器向 11 机器发送 UDP 广 播报文。11 机器旁路程序收到数据 后,直接交给内核网络协议栈,协 议栈交给用户程序,用户程序转发 给协议栈,最终协议栈将返回信息 交给旁路程序,再由旁路程序发送 出去。
Step3:
从 12 机器向 11 机器发送 UDP 广播 报文。11 机器从 3490 端口收到 后,更改目的端口号为 3492,立即 从网卡发送出去。(1s 发一个包, 统计收发时延)
测试场景 | Linux 原生 | DPDK | Netmap | 说明 |
|---|---|---|---|---|
ping(旁路后交由内核处理) | 37μs | 35~881μs | 146.8μs | DPDK 出现周期性波动 |
UDP 单向转发(内核→App→内核) | 89μs | 351μs | — | Netmap 跑不通示例 |
UDP 转发(MAC/IP 重写)1024B | 89μs | 89μs | 101μs | Netmap 性能较差 |
UDP 转发(MAC/IP 重写)256B | 48μs | 48μs | 99μs | Netmap 延迟不变 |
收发双方都旁路(DPDK) | — | 64μs | — | DPDK 显著提升性能 |
备注:
网卡类型 | 平均延迟(μs) | 说明 |
|---|---|---|
Mellanox MT27500 | 29μs | Linux 原生 |
Solarflare SFC9120 | 21μs | Linux 原生 |
Solarflare + Onload | 12μs | 使用 OpenOnload TCP/IP 协议栈 |
值得注意的是,DPDK 的性能提升明显体现在收发双方均使用旁路时。一端使用旁路而另一端仍为内核协议栈时,整体延迟收益较小。此外,Netmap 延迟表现不如人意,但在 PPS 吞吐场景中仍有其独特优势。
选择内核旁路方案时应结合实际应用需求:
同时,建议通过结合 KNI 等机制将关键流量旁路至用户态,非关键数据交由内核处理,以兼顾系统兼容性与性能。
通过比较实现机制可以看出,所有的内核旁路方案,无非都是在用户态实现网卡驱动, 或者直接在用户态 mmap 映射网卡缓存地址来达到操纵网卡收发数据。 在环路延迟方面,通过性能测试结果可以看出,千兆网卡下,dpdk 旁路性能明显优于 netmap 和 linux。 以下是 dpdk 和 netmap 的整体对比
比较维度 | DPDK | Netmap | 结论说明 | 获胜项 |
|---|---|---|---|---|
代码量 | 约 191 万行 | 约 5 万行 | Netmap 更轻量 | ✅ Netmap |
方法库支持 | 丰富 | 基本无 | DPDK 功能更完整 | ✅ DPDK |
实现语言 | C | C | 相同 | — |
UDP 延迟(256 字节) | 48μs | 99μs | DPDK 延迟显著更低 | ✅ DPDK |
从网卡搬移数据到用户空间效率 | 约 50 个 CPU 周期 | 约 65 个 CPU 周期 | 二者均优于常规协议栈(200 周期) | ✅ DPDK |
吞吐能力 | 可达网卡峰值 | 可达网卡峰值 | 表现相当 | — |
框架实现方式 | 应用层实现网卡驱动 | 修改原生网卡驱动 | DPDK 更适合无侵入式部署 | ✅ DPDK |
网卡支持 | Intel 系列 | 仅 ixgbe 等部分驱动 | DPDK 适配性更强 | ✅ DPDK |
网卡是否独占 | 是(数据路径独占) | 是(数据通道独占) | 都存在独占问题 | — |
稳定性与故障恢复 | 出错需重新配置网卡/IP | 出错自动退出旁路状态 | Netmap 故障切换更快 | ✅ Netmap |
从以上对比可以看出,dpdk 更符合我们的应用场景,即低延迟和定制化需求。 在解决了当前 DPDK KNI 存在的周期性问题和两极分化问题后,可以有一个更好的内 核旁路框架即: 将我们关心的数据直接旁路给应用程序,将我们不关心的数据通过 kni 传递给内核,交 由操作系统处理。在这种方案下,可以解决使用 dpdk 引起的网卡独占问题,同时也不再影 响物理机上的其它业务,例如 arp、icmp、scp 等。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 [email protected] 删除。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 [email protected] 删除。