真实面经题目 · 原创解析

RDMA 连接和性能调优通常关注哪些参数?

RDMA 参数题通常不是让背某一个结构体字段,而是考察能否把关键配置维度讲清楚:资源对象参数、连接寻址参数、传输可靠性参数、内存注册参数、网络层参数以及性能调优参数。完整答案应覆盖 QP、CQ、PD、MR、LID/GID、QPN/PSN、MTU、SL 或 traffic class、RoCE v2 的 IP/UDP/VLAN/PFC/ECN,以及 inline、队列深度、CQ moderation、retry、RNR timeout 等影响吞吐和延迟的参数。

出现于:阿里巴巴 · 算法

60 秒回答模板

可以按六层回答。第一层是资源对象:PD 用来隔离资源,MR 描述注册内存和权限,CQ 收完成事件,QP 承载发送和接收队列。第二层是寻址与连接:InfiniBand 关注 LID、GID、QPN、PSN、path MTU、SL;RoCE v2 还要关注 IP、UDP 端口、VLAN、traffic class。第三层是队列与完成:send queue depth、recv queue depth、CQ depth、WQE 数量、SGE 数量、inline data 阈值、CQ moderation 都会影响并发度、内存占用和延迟。第四层是传输语义:SEND/RECV、RDMA READ、RDMA WRITE、atomic 对远端权限、远端 key、完成语义和资源消耗要求不同。第五层是可靠性与拥塞:retry count、timeout、RNR retry、min RNR timer、PFC、ECN、DCQCN 等决定丢包、拥塞和接收端无 buffer 时的行为。第六层是性能调优:小消息重视 inline、轮询 CQ、低 moderation;大流量重视 MTU、队列深度、批量 posting、NUMA 亲和、内存注册复用、PFC/ECN 配置和避免频繁注册内存。

考点 资源对象参数
主线 连接寻址参数
易错点 只回答 MTU、IP、端口,忽略 QP、CQ、MR、P…

深入解析

01

资源对象参数

RDMA 程序首先要创建并配置一组核心对象。PD 是 protection domain,用来把 QP、MR 等资源放在同一个保护域内,避免不相关资源互相访问。MR 是 memory region,来自内存注册,关键参数包括起始地址、长度、lkey、rkey 和 access flags。CQ 是 completion queue,关键参数是 CQ depth、是否绑定 completion channel、是否做 CQ moderation。QP 是 queue pair,包含 send queue 和 recv queue。

02

连接寻址参数

RDMA 通信需要把本端和对端的地址、队列号、初始序列号等信息交换好。InfiniBand 场景里常见的是 LID、GID、QPN、PSN、path MTU、SL、端口号等;RoCE 场景里 GID 更关键,通常还涉及 IP、MAC、UDP 端口、VLAN、traffic class 或 DSCP。QPN 标识对端 QP,PSN 用于包序号和可靠传输,LID/GID 用于路径寻址。

03

QP 状态与可靠性参数

QP 通常经历 RESET、INIT、RTR、RTS 等状态,状态切换时会设置不同参数。INIT 阶段关注端口、pkey index、access flags;RTR 阶段关注对端 QPN、目的 LID/GID、path MTU、rq PSN、max dest RD atomic、min RNR timer;RTS 阶段关注 sq PSN、timeout、retry count、RNR retry、max RD atomic。这些参数决定连接是否能建立、包丢失后如何重传。

04

队列与完成参数

send queue depth 和 recv queue depth 决定可以同时挂起多少 WQE。队列太小会限制吞吐,太大则增加内存占用和缓存压力。recv queue 对 SEND/RECV 语义尤其关键,如果没有提前 post receive,可能触发 RNR。CQ depth 要能覆盖可能产生的完成数,否则有溢出风险。CQ moderation 控制多少个完成或多久产生一次通知,降低中断开销但可能增加尾延迟。

05

内存注册与权限参数

RDMA 访问的内存必须注册成 MR,注册后网卡获得地址转换和访问权限。关键参数包括地址、长度、page pinning、lkey、本地访问权限、rkey、远端读写或原子权限。常见 access flags 包括 local write、remote read、remote write、remote atomic。RDMA WRITE 要求远端 MR 开 remote write,RDMA READ 要求远端 MR 开 remote read。

06

操作语义参数

SEND/RECV 依赖对端提前投递 receive WQE,适合控制消息或请求响应。RDMA WRITE 是本端直接写远端内存,通常低延迟且不要求远端 CPU 参与,但需要对端提前暴露地址和 rkey。RDMA READ 是本端从远端内存拉取数据,对 outstanding read 数和链路往返更敏感。atomic 包括 compare-and-swap、fetch-and-add 等,适合分布式同步但吞吐通常受限。

07

RoCE v2 网络参数

RoCE v2 跑在以太网上,除了 RDMA 对象参数,还要关注二三层网络配置。关键项包括源/目的 IP、UDP 端口、GID index、VLAN、PCP、MTU、traffic class 或 DSCP、PFC、ECN、拥塞控制算法。PFC 用于按优先级暂停流量,避免无损队列丢包;ECN 用于显式拥塞标记,配合 DCQCN 等拥塞控制降低队列堆积。

08

吞吐与延迟调优参数

小消息低延迟通常关注 max inline data、减少 completion、busy polling、NUMA 亲和、CPU 绑核、减少系统调用和锁竞争。大消息高吞吐通常关注 MTU、队列深度、批量 post send、多个 QP 或多流并行、SGE 数量、内存注册复用、PCIe 带宽、网卡限速、PFC/ECN 和 CPU cache 行为。signaled completion 过多会增加 CQ 压力。

易错点

  • 只回答 MTU、IP、端口,忽略 QP、CQ、MR、PD 这些 RDMA verbs 核心对象。
  • 把 LID 和 GID 混为一谈,没有区分 InfiniBand 与 RoCE v2 的寻址差异。
  • 认为 RDMA WRITE 不需要权限,只要知道远端地址即可,忽略 rkey 和 remote write access flag。
  • 只追求更大的队列深度,忽略 CQ 溢出、缓存压力、内存占用和尾延迟。
  • 把 retry count 调很大当成性能优化,实际上这可能掩盖丢包、拥塞或 QoS 配置错误。
  • 忽略 recv queue 预投递,导致 SEND/RECV 场景频繁出现 RNR。
  • 认为 RoCE v2 只需要配置 IP 可达,忽略 VLAN、PFC、ECN、traffic class、MTU 和交换机 QoS 一致性。

面试官追问

为什么 RDMA 需要先注册内存?

因为网卡要绕过内核协议栈直接 DMA 访问用户态内存,必须提前完成页固定、地址转换和权限登记。注册后得到 lkey 和 rkey,本地访问用 lkey,远端访问用 rkey。这样既能保证硬件可访问,也能限制远端只能访问被授权的内存范围。

send queue depth 和 recv queue depth 怎么选?

要按并发请求数、RTT、消息大小和消费速度选择。send queue depth 太小会导致发送端频繁等待,无法跑满链路;recv queue depth 太小会导致 SEND/RECV 场景触发 RNR;太大则浪费内存并增加缓存压力。实际常用压测确定,使队列不空、不溢出,并留出突发余量。

inline data 有什么作用?

inline data 是把小消息直接放进 WQE 中,网卡不需要再从用户 buffer DMA 读取数据,因此可降低小消息延迟。代价是 WQE 更大、队列占用更高,而且受 max inline data 限制。适合几十到几百字节级的小消息,不适合大块数据。

RNR retry 和 retry count 有什么区别?

retry count 主要处理可靠连接中包丢失或超时后的重传;RNR retry 处理 receiver not ready,也就是对端没有可用 receive WQE 的情况。前者偏网络或超时问题,后者偏接收队列投递不足或消费不及时。

RoCE v2 为什么强调 PFC 和 ECN?

RoCE v2 基于以太网承载,传统以太网可能丢包,而 RDMA 对丢包和重传非常敏感。PFC 用优先级暂停减少丢包,ECN 用拥塞标记触发端侧降速。两者配合可以降低队列堆积和重传,但配置不一致会造成严重尾延迟和吞吐波动。

RDMA READ、WRITE、SEND 怎么选?

控制消息和需要对端明确消费的请求常用 SEND/RECV;单向数据推送常用 RDMA WRITE;需要主动从远端拉数据常用 RDMA READ;分布式同步或计数场景可用 atomic。选择依据是 CPU 参与程度、权限暴露范围、完成通知需求、延迟和并发读写压力。