这里是「算力网络架构手记」北京
专注 AI 集群网络架构与性能优化
深入 GPU×RoCE×NCCL×K8s 跨层瓶颈
只拆真实问题,不写概念科普
👇 试听内容
👉 AI 训练网络全路径拆解视频课 → 私信:AI网络
👉 AI 推理网络全路径拆解视频课 → 私信:推理
👉 AI 网络架构工程指南手册 → 私信:工程指南
👉 AI 算力网络架构系统视频课(真机实验环境) → 私信:系统
👉 日常工作1对1答疑 → 私信:答疑
00
给Linux 网络栈正名
凡是接触过 RDMA 的人,都会听到一句话:
RDMA 绕过 Linux 内核协议栈,直接在网卡和用户态之间搬数据。
这句话确实没错。
但如果只记住这一句,就很容易走向另一个误区:
既然 RDMA 绕过 Linux 网络栈,那 Linux 网络栈是不是就不重要了?
恰恰相反。
在真实 AI 集群里,尤其是 RoCE 场景下,Linux 网络栈虽然不再负责每一个数据包的传统 TCP/IP 转发路径,但它依然深度参与:
所以更准确的说法应该是:
RDMA 数据面可以绕过 Linux 网络栈。但 RDMA 控制面、路径选择、QoS 入口,离不开 Linux 网络栈。
01
不是“不要 Linux 网络栈”,而是“数据搬运绕过传统协议栈”
如果只把 RDMA 理解成:
数据不走内核,所以 Linux 网络栈没用了。
这肯定是不准确的。
RDMA 真正绕过的是传统数据搬运路径中的很多内核参与:
这就是 RDMA 高性能的关键。
但在 RoCE 里,数据包本身依然是以太网 / IP / UDP / RoCEv2 形式在网络里跑。它依然需要:
这些东西从哪里来?
很多都来自 Linux 网络栈和 RDMA 子系统之间的配合。
所以一句话总结:
RDMA 绕过的是“传统数据路径”,不是绕过整台 Linux 主机的网络控制体系。
这个结论很重要。否则你会在排障时犯一个典型错误:
只盯 RDMA 工具,不看 Linux 网络配置。
结果发现:
最后才发现,根因还在 Linux 网络侧。

02
Linux 网络栈第一角色:提供“地址与路径语义”
RDMA 要通信,首先要知道:
对端是谁?从本机哪张网卡出去?走哪条路?
在 RoCE 场景下,这就绕不开 Linux 网络栈。
因为 RoCEv2 本质上跑在 UDP/IP 之上。它需要 IP 地址作为路径语义。
所以你配置的:
ip addrip linkip routeip rule都会影响 RDMA 最终怎么走。
很多人以为 RDMA 只认 HCA,不认 IP。这在 InfiniBand 场景里很好理解。
但 RoCEv2 不一样。
RoCEv2 的 GID 往往和 IP 地址存在对应关系。你在网卡上配置的 IP,会影响 GID 表项。
如果 IP 配错、接口没 up、VLAN 不对、GID index 选错,RDMA 通信就可能:
所以在 RoCE 里,Linux 网络配置不是装饰。
它直接参与 RDMA 地址选择。
假设一台 GPU 服务器有 8 张 RoCE 网卡。
你希望:
如果 Linux 路由没有写对,会发生什么?
最常见的结果是:8 张网卡,实际只从一张出去。
或者更麻烦:
所以多轨 RoCE 里,Linux 路由和策略路由非常关键。
RoCE 的数据面可以绕过内核搬数据,但“从哪张网卡出去、用哪个源 IP、匹配哪个 GID”,仍然离不开 Linux 网络栈。

03
Linux 网络栈第二角色:帮助 RDMA 完成建连
RDMA 通信不是一开始就能直接把数据扔到对端内存里。
它要先建立连接关系。
典型信息包括:
在 RoCE 里,如果使用 RDMA CM 建连,它会用到 Linux 网络栈提供的 IP 路由能力来解析路径。
这就是很多人容易混淆的点:
RDMA 数据传输不走传统 socket 数据面。但 RDMA 建联和路径解析,可能仍然依赖 Linux 的 IP / 路由语义。
-R 行为会不同?很多人在 perftest 里会遇到类似现象:
-R 可以-R 不行这里的 -R 通常表示使用 RDMA CM。
一旦使用 RDMA CM,路径解析就更依赖 IP / 路由 / 源地址选择。
如果你的策略路由不对,或者源地址与目标路径不一致,现象就可能非常诡异。
这时候问题不一定在 RDMA 本身。可能在:
ip ruleNCCL 在建立跨节点通信时,也需要发现和选择可用网络接口。
它会根据:
来决定最终使用哪些路径。
如果 Linux 网络层把接口、地址、路由搞乱,NCCL 看到的世界也会乱。
所以你会看到:
这不是 NCCL “玄学”。
很多时候,是 Linux 网络语义没有对齐。
RDMA 的数据传输可以不靠 Linux TCP/IP 数据面,但 RDMA 的建连、寻路、接口选择,仍然会被 Linux 网络栈深刻影响。

04
Linux 网络栈第三角色:决定 RoCE QoS 的入口标签
在 RoCE 网络里,QoS 非常关键。
尤其是 AI 训练和推理场景:
这时候,Linux 网络栈又开始扮演一个很重要的角色:
给流量打上正确的分类标签。
RoCEv2 是 IP 包。IP 头里有 ToS / Traffic Class 字段。
其中:
如果主机侧没有设置 DSCP,交换机就很难知道:
这个包是不是 RDMA 业务?它该进哪个 priority / TC?它该不该进入 lossless / ECN 队列?
所以,Linux 主机侧是否正确设置 ToS / DSCP,会影响整个 RoCE QoS 链条。
如果包不是 ECT,交换机即使看到拥塞,也不能把它标成 CE。
那 DCQCN 这条链就断了:
所以 RoCE QoS 不是只靠交换机。
服务器侧发出去的包,必须具备正确的标签和 ECN 能力。
它提供了这些入口:
tc/ iptables / nftables 做分类标记所以 Linux 网络栈不是在每个 RDMA 数据包上做传统转发,但它负责给这些包定义“身份”。
在 RoCE QoS 里,Linux 网络栈不一定搬数据,但它经常决定这类数据包带着什么身份进入网络。

05
Linux 网络栈第四角色:多网卡 / 多轨网络的路径组织者
AI 训练服务器经常不是一张网卡。
而是:
这时候,Linux 网络栈的角色就更明显了。
因为多网卡不是“插上就自动均衡”。
你必须解决几个问题:
如果这一步没做好,结果很典型:
物理上是多轨,逻辑上是单轨。
如果一台服务器有 8 张网卡,但只有一条默认路由,Linux 可能会把大量流量都导向同一个出口。
你看到的是:
这不是多轨网络没用。
是 Linux 路由没有把多轨组织起来。
在多 rail RoCE 中,经常需要:
这就是 ip rule 和多路由表的重要性。
它的目标不是“炫技”,而是让系统明确知道:
从这个源地址发出的流,就应该走这张网卡。
因为 RoCE 通信中源地址、GID、接口、路径是强相关的。
一旦源地址选错,可能导致:
所以多轨 RoCE 不是只配交换机。
Linux 服务器侧同样是核心。
多轨网络能不能用起来,很大一部分取决于 Linux 是否把“多张网卡”组织成“多条确定路径”。

06
Linux 网络栈第五角色:可观测性入口
RDMA 性能问题,最后常常表现为:
很多人第一反应是看 RDMA 工具。
这是对的,但不够。
因为你还要看 Linux 网络侧的基础状态:
这些都是 Linux 网络栈和驱动提供的可观测性入口。
ib_write_bw 能告诉你:
但它不一定告诉你:
所以工具要分层看。
可以按这个顺序:
ip link, ethtool, MTU, speedip addr, ip route, ip ruleibv_devinfo, rdma link, GID tableNCCL_DEBUG=INFO, HCA 选择, rail 利用率这条链路很重要。
因为 RDMA 问题很少只属于某一层。
RDMA 排障不能只看 RDMA。Linux 网络栈提供了地址、路径、QoS、接口状态这些关键证据。

07
为什么说 RDMA 数据面“绕过内核”,但不是“绕过 CPU 和操作系统的一切”?
RDMA 确实可以减少 CPU 在数据搬运中的参与。
但这不代表 CPU 和 OS 完全没关系。
原因有几个。
RDMA 需要使用注册内存。
注册过程涉及:
这些都离不开操作系统和驱动。
QP 创建、CQ 轮询、事件处理、连接管理,这些仍然需要 CPU 参与。
只是数据 payload 的搬运不再走传统协议栈 copy 路径。
比如:
这些都需要系统侧参与观测和处理。
RDMA 减少的是数据搬运路径上的 CPU 和内核协议栈开销,不是让操作系统从通信系统里消失。
这很重要,否则你会误以为:
RDMA 慢了,一定是网卡或交换机问题。
不一定。
可能是:
这些仍然和 Linux 系统强相关。

08
在 AI 训练场景里,Linux 网络栈为什么会影响 NCCL 和 AllReduce?
AI 训练网络里,最终真正使用 RDMA 的往往是 NCCL。
NCCL 做的是 collective 通信,比如:
这些通信对网络非常敏感。
而 NCCL 的路径选择,会受到 Linux 网络环境影响。
它会看到:
如果 Linux 网络接口命名混乱、IP 配置不一致、路由不可达,NCCL 的发现结果就会变差。
多轨不是 NCCL 单方面就能完成。
它需要:
如果 Linux 只给了一个可用路径,NCCL 不可能凭空变出 8 rail。
单流测试里,一个路由错误可能只是某条链路慢一点。
但 AllReduce 里:一个 rank 慢,所有 rank 等。
所以 Linux 网络层的小错误会被放大成:
Linux 网络栈的地址、路由、接口、QoS 配置,最终会通过 NCCL 被放大到 AllReduce 的整体性能里。

09
在 AI 推理场景里,Linux 网络栈为什么同样重要?
推理场景看起来不像训练那样重通信。
但在 P/D 分离、KV Cache 迁移、多副本 Decode、TP 推理中,Linux 网络栈仍然很关键。
Prefill 节点生成 KV Cache,Decode 节点继续使用。
如果 Linux 多网卡路由没配好,KV 迁移可能:
这不是单纯“推理引擎”的问题。
它可能是 Linux 网络路径没组织好。
Decode 阶段每个 token 都要走模型。如果用了 TP,每一步仍然可能有 NCCL / RDMA 通信。
这类通信不一定流量大,但非常怕:
Linux 侧接口选择、QoS 打标、路径稳定性都会影响 Decode 的 p99。
推理是用户在线体验。
一个小的网络抖动,可能变成:
所以推理场景下,Linux 网络栈不是“不重要”。
而是更需要稳定。
训练把 Linux 网络问题放大成 step time,推理把 Linux 网络问题放大成 TTFT 和 p99。

10
总结
RDMA 并不是让 Linux 网络栈消失。
它只是把数据搬运从传统内核协议栈路径中拿出来,而地址、路由、QoS、建连、可观测性仍然深度依赖 Linux。
所以,Linux 网络栈在 RDMA 场景下至少扮演六个角色:
所以真不能再简单地说:
RDMA 不走 Linux 网络栈,所以 Linux 网络配置不重要。
更准确的说法应该是:
RDMA 的数据搬运绕过传统协议栈。但 RDMA 的路径选择、QoS、控制面和排障证据,仍然离不开 Linux 网络栈。
很多 RDMA 问题,表面看起来是网卡问题、交换机问题、NCCL 问题。但往下挖,经常会回到 Linux:- IP 配错了- GID 不对- 路由不对- 策略路由没生效- MTU 不一致- DSCP 没打上- ECN 没准备好- NCCL 没看到正确接口- GPU 和 NIC 跨 NUMA所以,真正成熟的 RDMA 排障,不是跳过 Linux。恰恰相反。你要先把 Linux 这层看清楚。因为它虽然不一定在每个数据包上“搬砖”,但它决定了这些数据包:- 从哪里出发- 走哪条路- 带什么标签- 被谁接住- 出问题时你能在哪里看到证据这就是 Linux 网络栈在 RDMA 场景下真正的角色。
👉 AI 训练网络全路径拆解视频课 → 私信:AI网络
👉 AI 推理网络全路径拆解视频课 → 私信:推理
👉 AI 网络架构工程指南手册 → 私信:工程指南
👉 AI 算力网络架构系统视频课(真机实验环境) → 私信:系统
👉 日常工作1对1答疑 → 私信:答疑
如果你也在做 AI 集群架构
欢迎关注「算力网络架构手记」
长期拆解真实算力网络问题