前言:高性能网络的下半场

在云原生和 AI 大模型时代,网络性能的瓶颈正从“带宽”转向“拷贝”。为了消除 CPU 拷贝开销,TCP devmem (设备内存) 应运而生。然而,容器环境下虚拟网卡(veth/netkit)与物理硬件的“天然隔阂”,让这项黑科技长期难以进入容器。

最近,Linux 内核社区提交了一组重磅补丁(Patchset),通过 “队列租赁” (Queue Leasing) 方案,正式打通了 netkit 设备对 devmem TX 的支持。今天我们就来深度扒一扒这背后的前世今生。


一、 技术背景回顾:演进的代价

1. netkit 的前世今生:veth 的接班人

在 netkit 出现之前,容器通信的霸主是 veth pair

  • veth (Virtual Ethernet):模拟一根网线,两端分别插在不同命名空间。虽然简单,但数据包在内核协议栈中要走很长的路径,且在高并发下 CPU 开销极大。

  • netkit (2024年登场):它是专为 eBPF 设计的高性能虚拟接口。它不再模拟复杂的以太网特性,而是作为一个“BPF 钩子载体”,允许数据包通过 BPF 程序直接重定向(Redirection),极大地缩短了路径,是 Cilium 等现代容器网络的理想选择。

2. devmem 的崛起:零拷贝的终极形态

  • 传统 TCP:数据从网卡到内存,再从内存拷贝到用户态(或 GPU 显存),CPU 忙于搬运数据。

  • TCP devmem:允许数据直接在硬件设备内存(如 GPU 显存、TPU 内存)和网卡之间传输。

    • RX (接收):网卡直接将数据写入 GPU 显存。

    • TX (发送):网卡直接从 GPU 显存读取数据发出。

    • 核心痛点:由于数据不在主内存,CPU 看不见也读不了(Unreadable skb),这对内核的校验和验证提出了极高要求。


二、 现状与痛点:被阻断的发送路径

虽然 netkit 很快,devmem 很强,但两者结合时却遇到了“身份验证”问题。

问题描述:

容器通过虚拟网卡(netkit)发送数据。当应用尝试通过 netkit 发送存储在 GPU 显存中的数据时,内核的 devmem TX 路径会进行安全检查:

  1. 内核问:“当前发包的设备(netkit)支持 DMA(直接内存访问)吗?”

  2. netkit 答:“我是虚拟设备,没有硬件 DMA 控制器。”

  3. 内核判定:“不支持!丢弃数据包(Drop)。”

现状:

目前 netkit 的 RX(接收) 路径由于逻辑较简单,已经能够配合物理网卡工作。但 TX(发送) 路径因为涉及复杂的 DMA 绑定和本地化内存分配(NUMA),在补丁发布前一直处于不可用状态。


三、 补丁方案拆解:队列租赁(Queue Leasing)

针对上述问题,Bobby Eshleman 等开发者提出了 “队列租赁” 的概念。这套补丁集(即你看到的 1.txt 中的内容)核心逻辑如下:

1. 代理机制(Proxying)

补丁允许 netkit 设备从底层的物理网卡(如 Nvidia ConnectX-6)中“租赁”硬件队列。

  • 逻辑绑定:在容器内,应用依然操作 netkit 的队列 ID。

  • 底层映射:内核会在底层自动将这个虚拟队列映射到物理网卡的真实硬件队列上。

2. 身份“借用”

这是最精妙的地方。当 bind-tx 在 netkit 设备上调用时:

  • 内核不再死板地检查 netkit。

  • 内核会查表:“噢,这个 netkit 租了物理网卡 eth0 的队列。”

  • 验证重定向:内核转而检查物理网卡 eth0 是否支持 netmem TX。如果是,则通过验证,并将 eth0 作为 DMA 操作的实际目标。

3. 双重保险验证

为了防止数据包被意外重定向到不支持 devmem 的设备,补丁引入了 validate_xmit_unreadable_skb() 增强检查:

  • 第一道关卡:数据包在 netkit 层面验证,确保绑定的物理网卡合法。

  • 第二道关卡:如果 BPF 逻辑将包重定向到其他网卡,在最终发送前会再次检查目标网卡。如果不支持,则宁可丢包也不引发系统崩溃。


四、 性能表现与意义

该补丁已经在 100G 网卡(Nvidia ConnectX-6 和 Broadcom BCM957504)上通过了严格测试。

它的意义在于:

  • 容器原生性能:容器内的 AI/HPC 应用终于可以像跑在宿主机上一样,利用 TCP devmem 实现零拷贝,且性能无损。

  • 架构解耦:容器不需要知道物理网卡的复杂参数,只需要通过“租赁”的虚拟队列即可享受硬件加速。


五、 结语

veth 到支持 devmem TXnetkit,Linux 内核网络协议栈正在经历一场面向 AI 时代的重构。通过“队列租赁”,我们不仅打破了虚拟与物理的界限,更在高性能网络通信的道路上迈出了关键一步。

如果你正在开发高并发 AI 推理服务或分布式存储,这个补丁集绝对值得你持续关注!


参考资料:

  • Linux Kernel Mailing List (LKML)

  • BPF Kernel Development

  • Project: Netkit and Queue Leasing Support

Logo

AtomGit 是由开放原子开源基金会联合 CSDN 等生态伙伴共同推出的新一代开源与人工智能协作平台。平台坚持“开放、中立、公益”的理念,把代码托管、模型共享、数据集托管、智能体开发体验和算力服务整合在一起,为开发者提供从开发、训练到部署的一站式体验。

更多推荐