面向存储的无损以太网:DCB、PFC、ECN
以太网在拥塞时会丢帧;而为光纤通道(Fibre Channel)或 RDMA 设计的存储协议则假定永远不会丢包。数据中心桥接(DCB)通过按优先级的流量控制和带宽分配弥补了这一差距,RoCE 在此基础上再加入拥塞信令。整个体系的无损程度取决于其中最差的那条链路:一个每百万帧丢一帧的临界光模块就足以酿成存储故障。本页说明这些机制,并将其转化为物理层要求。
DCB 工具集
| 标准 | 名称 | 作用 |
|---|---|---|
| IEEE 802.1Qbb | PFC——基于优先级的流量控制 | 按流量类别(0–7)发送暂停帧:拥塞的接收端可以只暂停某一类流量,而不用暂停整个端口 |
| IEEE 802.1Qaz | ETS——增强型传输选择 | 为各类别保证带宽份额(例如存储占 50%,局域网占 50%) |
| IEEE 802.1Qaz | DCBX——DCB 交换协议 | 基于 LLDP,在交换机与 NIC 之间协商 PFC/ETS 设置 |
| IEEE 802.1Qau | CN——拥塞通知 | 很少部署 |
| RFC 3168 + DCQCN | ECN 标记 + 速率控制 | 队列积压时交换机对报文打标;RoCE NIC 据此降速,从而在触发 PFC 之前化解拥塞 |
RoCE 如何保持无损
- 存储/RDMA 流量通过 DSCP 或 802.1p 打上专用优先级标记(通常是 3 或 4)。
- 路径上每个端口都只为该优先级启用 PFC,缓冲区的余量(headroom)根据链路速率和线缆长度(在途字节数)来配置。
- ECN 阈值提前对报文打标;NIC 运行 DCQCN 来降低发送速率,使 PFC 只在万不得已时才触发。
- ETS 在局域网负载下仍为存储类别保证其带宽。
- DCBX 保持 NIC 与交换机设置一致;一旦不匹配,无损性就会在不知不觉中被破坏。
FC 和 InfiniBand 默认就在每条链路上通过信用(credit)机制实现同样的效果;以太网则需要人工配置、验证和监测(FC 协议基础、 InfiniBand 传输)。
可能出现的问题
| 问题 | 影响 | 检测 |
|---|---|---|
| 某一跳未启用 PFC / 优先级配置错误 | 负载下丢包;RDMA 重传;时延突增 | 本该非零的暂停帧计数为零;该类别出现丢包 |
| PFC 风暴 | 卡死的接收端无限期暂停上游;拥塞蔓延至整个网络 | 暂停帧泛滥;看门狗计数器 |
| PFC 死锁 | Clos 网络中出现循环缓冲依赖;该类别所有流量停止 | 需要死锁检测/看门狗机制来打破 |
| 余量对长线缆/光模块来说不够 | 即使启用 PFC 仍丢包 | 暂停帧计数在增长的同时仍有丢包 |
| ECN 阈值设置错误 | 过早:吞吐量下降;过晚:PFC 泛滥 | ECN 标记计数器、NIC 上的 CNP 计数器 |
| 链路上的物理层错误(CRC、FEC 不可纠正) | 帧丢失,任何流量控制都无法挽回 | 端口错误计数器、FEC 计数器——VDM 与 FEC 指标 |
不使用 DCB 的 iSCSI
iSCSI 运行于 TCP 之上,能够承受丢包,但代价是时延和重传。无论是否使用 DCB,以下都是最佳实践:
- 每个网络使用专用 VLAN/子网,双网络冗余,主机侧启用 MPIO;
- 端到端启用巨型帧(MTU 9000);
- 发起端与目标端之间不超订;25G/100G 上联链路按存储阵列的需求配置容量;
- 每条 25G 以上链路都启用 FEC;CRC 计数器保持为零;
- 可选地为 iSCSI 类别启用 PFC 以平滑微突发流量(许多存储阵列厂商建议这样做)。
物理层要求
| 要求 | 原因 | 做法 |
|---|---|---|
| 每条 25G 以上链路都启用并匹配 FEC | RoCE 无法容忍未加保护的 25G/50G 通道的原始误码率 | FEC 与链路训练 |
| CRC 与不可纠正 FEC 计数为 0 | 每丢失一帧都会阻塞一个队列 | 一旦计数增加立即告警 |
| 接收功率处于窗口内且留有余量 | 临界光模块在温度变化下会突发错误 | Rx 功率与链路预算 |
| 速率/双工/自动协商一致 | DAC 需要两端都启用自动协商 + 链路训练 | 铜缆与 DAC |
| 线缆长度符合余量假设 | 余量是按在途字节数计算的 | 机柜内优先用 DAC,列间用 SR/AOC,机房间用 DR/LR |
| 身份信息被 NIC 和交换机接受 | 被拒绝的光模块会导致无链路或降速运行 | 厂商锁定 |
监测清单
- 每端口:按优先级统计的暂停帧收发数、ECN 标记数、各类别丢包数、CRC、FEC 可纠正/ 不可纠正计数、链路抖动次数。
- 每 NIC:CNP 收发数、重传数、乱序数、超时数。
- 每个光模块:接收/发射功率与温度趋势(监测)。
- 将存储尾部时延突增与上述指标进行关联分析——出问题的往往是物理层,而不是存储阵列本身。
在 CodingBox 中
无损网络是由普通光模块构建的,只是对其要求更高。在实验室进行的进厂检验——身份信息、校验和、将实时 DDM 与典型值对比、保存基线数据——正是将临界模块挡在网络之外的方法,因为在这样的网络中,一条坏链路就足以让应用的时延 SLA 失守(Check transceiver、 DDM)。
PFC 和 ECN 在其他转发机制中的位置,以及物理层错误如何在其中显现: 转发基础。