3. 流控机制概述
在 InfiniBand(IB)网络中,数据从发送端到接收端需要经过多个层次和节点。流控机制是保证数据可靠传输、避免缓冲区溢出和链路拥塞的“交通警察”。IB 规范定义了两种互补的流控机制:链路层流控(Link Layer Flow Control)和端到端流控(End-to-End Flow Control)。理解两者的区别与协作关系,是进行流控调优的前提。
3.1 核心原理:两种流控的分工与协作
链路层流控工作在物理链路的两端(即相邻的两个端口之间),其核心目标是防止接收端缓冲区溢出。它采用基于信用(Credit)的机制:每个接收端口会通告自己可用的接收缓冲区数量(以64字节为单位的信用),发送端口只有在收到足够信用后才能发送数据包。这种机制是逐跳(Hop-by-Hop)的,覆盖了网络中每一段物理链路。
端到端流控则工作在从源节点到目的节点的整个路径上,其核心目标是防止目的节点(或目的端口的队列)溢出,并管理端到端的拥塞。它同样基于信用机制,但信用由最终接收端(目的节点)通告,中间交换机只负责转发信用信息而不消耗信用。端到端流控主要针对可靠传输服务(如 RC,可靠连接),确保数据包不会因为目的端缓冲区不足而被丢弃。
关键区别速览:
- 作用范围:链路层流控覆盖每一段物理链路;端到端流控覆盖整个端到端路径。
- 信用来源:链路层信用来自直接相连的接收端口;端到端信用来自最终目的节点。
- 主要目的:链路层防止单段链路缓冲区溢出;端到端防止目的端队列溢出并管理端到端拥塞。
- 适用服务:链路层适用于所有传输服务;端到端主要适用于可靠服务(RC)。
3.2 链路层流控的工作机制
链路层流控是 IB 网络中最底层的保护机制,它确保任何一段物理链路都不会因为发送速率超过接收能力而丢失数据。其核心组件包括:
- 接收缓冲区(Receive Buffer):每个端口都有固定大小的接收缓冲区,用于暂存收到的数据包。
- 信用通告(Credit Advertisement):接收端口定期(或每次消费数据后)向对端发送信用更新,告知当前可用的缓冲区空间。
- 信用消耗(Credit Consumption):发送端口每发送一个数据包,就消耗相应数量的信用;当信用不足时,发送端口必须暂停发送。
这种机制的关键优势在于零丢包——只要链路层流控正常工作,数据包就不会因为缓冲区溢出而被丢弃。这也意味着,如果出现链路层丢包,往往说明链路本身存在物理问题(如信号完整性、线缆故障)或配置错误(如 MTU 不匹配)。
3.3 端到端流控的工作机制
端到端流控在链路层之上工作,它解决的是“目的节点是否来得及处理”的问题。即使每一段链路都完好无损,如果目的节点的处理速度跟不上,或者多个发送端同时向同一目的端发送数据,仍然可能导致目的端缓冲区溢出。
端到端流控的信用机制与链路层类似,但信用由目的节点的 QP(Queue Pair)接收队列通告。发送端在发送可靠服务(RC)数据包时,必须确保目的端有足够的信用。如果信用不足,发送端会暂停发送并等待信用更新。此外,端到端流控还涉及重传机制——如果数据包在传输过程中丢失(例如因为链路故障),发送端需要在一定超时时间后重传。
调优提示:在实际系统中,链路层流控通常由硬件自动管理,无需软件干预。而端到端流控的参数(如重传超时、信用大小)可以通过 ibv_modify_qp 或 perftest 等工具进行调整,是调优的主要切入点。
3.4 案例:多对一通信中的流控协作
考虑一个典型的 HPC 场景:多个计算节点同时向一个存储节点写入数据。假设有 4 个发送端,每个以 100 Gbps 的速率发送,而存储节点的 HCA 接收能力也是 100 Gbps。此时:
- 链路层流控确保每个发送端到交换机、交换机到存储节点的每一段链路都不会因为缓冲区溢出而丢包。但交换机到存储节点的链路会成为瓶颈,因为 4 个发送端的总流量(400 Gbps)超过了链路容量(100 Gbps)。
- 交换机内部的缓冲会开始积压数据包。当交换机到存储节点的链路层信用不足时,交换机会暂停向存储节点发送,但其他发送端仍在向交换机发送数据。
- 端到端流控此时发挥作用:存储节点的 QP 接收队列信用逐渐耗尽,它会向各发送端通告信用不足。发送端收到信用不足的通知后,会降低发送速率或暂停发送,从而避免数据在交换机中过度积压。
这个案例清晰地展示了两种流控的协作关系:链路层流控保护每一段物理链路,而端到端流控则协调整个端到端的流量,防止拥塞蔓延。
3.5 常见误区与调优方向
误区 1:认为链路层丢包可以通过增大缓冲区解决。实际上,链路层流控设计为“零丢包”,如果出现丢包,增大缓冲区往往只能掩盖问题,真正的根因可能是物理层故障或配置错误。
误区 2:混淆链路层信用与端到端信用。链路层信用由硬件自动管理,通常不需要调优;而端到端信用与 QP 配置相关,是软件可调的。
误区 3:忽略端到端流控的重传超时设置。如果超时设置过短,正常的网络延迟波动会导致不必要的重传;如果设置过长,则丢包恢复时间过长,影响性能。
在实际调优中,建议先通过 ibstat 检查链路层状态(如 CRC 错误计数),再通过 perftest 或 ib_write_bw 等工具测试端到端吞吐量,最后根据测试结果调整端到端流控参数。下表总结了常见的调优检查点:
| 检查项 | 工具/命令 | 关注指标 | 异常处理 |
|---|---|---|---|
| 链路层健康状态 | ibstat |
LinkUp、CRC 错误计数 | 检查线缆、光模块、端口配置 |
| 端口缓冲区使用 | ibv_devinfo |
rx_buffer 大小 | 确认 MTU 与缓冲区匹配 |
| QP 信用状态 | ibv_rc_pingpong |
重传次数、超时值 | 调整 timeout 和 retry_cnt |
| 端到端吞吐量 | ib_write_bw |
带宽、延迟、丢包率 | 对比不同 QP 配置下的性能差异 |