Opening Up Kernel-Bypass TCP Stacks (ATC 2025)

一句话总结:在统一应用 nophttpd 上对 6 个 TCP stack(Linux/mTCP/F-Stack/IX/TAS/Demikernel)做横向评测,发现没有一个 stack 能在 bulk transfer + small RPC + 高并发连接 + 多核四类 workload 上同时表现良好——Linux 在 bulk 上比 IX 快 1.7×,IX 在 small message 上比 Linux 快 5.2×。

问题

学术界涌现大量 kernel-bypass TCP stack(RDMA 之外的 raw packet I/O 路线,基于 DPDK/netmap),但每篇论文只与 Linux + 1-2 个其他 stack 比较,且通常只针对一个 workload。运维者面对的问题是:到底要不要换 kernel-bypass、换哪个?现有文献回答不了,因为:

  • 没有横向 benchmark:6 个代表性 stack 从未在同一应用、同一硬件、同一 workload 集合下被对比;
  • 各 stack 编译/配置门槛极高,社区难以独立复现(Alibaba 报告说从头写一个 stack 比修旧的便宜);
  • 同一 stack 在不同 workload 下表现差异巨大,论文里报的优势可能在另一种 workload 下完全反转。

核心方法

作者写了 nophttpd——一个最小化的静态内存 HTTP server,针对每个 stack 的原生 API 单独实现一份(Linux 用 epoll、Demikernel 用 Rust async、IX/Demikernel 处理 packet-sized 分块、TAS 通过 LD_PRELOAD),避免用统一 wrapper 偏向某一 stack。在配对的 25GbE 直连机器上跑同一组 workload:

  • Bulk transfer:单连接 2 MB 响应;
  • Small message latency:单连接 64 B 请求、关闭中断聚合;
  • Concurrent connections:4800 持久连接 + RPC;
  • Multicore scalability:1-24 核,server 端 downclock 防 client bottleneck。

为公平测,禁用 TSO(mTCP/Demikernel 不支持),用一致的 wrk 客户端(修过多核 stat 聚合)。期间还要修 stack 本身的 bug:给 TAS 加 Window Scaling,调 mTCP 的 RSS 哈希种子,跳过 IX 上游不稳定版本改用 Reflex 里的 IX。

关键结果

  • Bulk transfer:Linux 14.69 Gb/s 拿第一,F-Stack 13.66 Gb/s 第二;mTCP/TAS 10-12 Gb/s;IX/Demikernel 因 packet-level API 拖累最低。
  • Small message latency:Demikernel 13 µs 最低;Linux busy-poll 也能做到 17 µs,与 kernel-bypass 同档。
  • Concurrent connections:IX 在吞吐上吊打其他 30-684%;Linux/F-Stack 几乎一样烂,说明 syscall 不是瓶颈(FreeBSD TCP 用 DPDK 也救不回来)。
  • Multicore scalability:IX 16 核内最强(比 TAS 高 16-384%、比 mTCP 高 456%),TAS 在 24 核展现最好的扩展斜率(67% 提升);Demikernel 完全不支持多核 stack。
  • Linux vs IX:Linux 在 bulk 上 1.7× IX,IX 在 small message 上 5.2× Linux——没有 one-size-fits-all。

相关