RDMA 可靠连接下的 RNR 参数调优:从重试机制到连接崩溃的致命陷阱
在 RDMA(Remote Direct Memory Access,远程直接内存访问)编程中,RC(Reliable Connection,可靠连接)模式是应用最广泛的传输类型之一。它保证了数据有序、无损地交付。然而,这个可靠性并非没有代价——RC 模式有一个鲜为人知但致命的弱点:错误的 RNR 参数配置,能在微秒级延迟抖动下,把一个正常的连接推向毁灭性的错误状态。
本文将深入解析 RNR 机制的完整行为链条,并给出生产环境中min_rnr_timer与rnr_retry两个关键参数的工程化选择策略。
一、RNR 机制:接收端“未就绪”时的友好重试
1.1 触发时机
RC 模式下,当发送端硬件发出一个 SEND 数据包,接收端硬件首先检查自己的接收队列中是否存在可用的 Recv WR(Work Request,工作请求)。如果队列为空,意味着应用程序尚未提前张贴好接收缓冲区,硬件无法安全地写入数据。此时,接收端硬件不会丢弃数据包,而是向发送端返回一个RNR NAK(Negative Acknowledgment,否定确认)。
这个 NAK 的语义是:“我能理解你的请求,但我现在没有地方放数据,请稍后重试。”
1.2 发送端的重试策略
发送端收到 RNR NAK 后不会立刻放弃,而是根据用户设置的两个参数执行重试:
