第346篇:数据中心 PFC 死锁导致 RoCE 业务中断
关键词:PFC、RoCEv2、死锁、DCBN、ECN、华为CloudEngine
一、案例背景
某AI计算中心部署了RoCEv2(RDMA over Converged Ethernet)网络承载GPU训练集群的东西向通信。在一次模型训练任务中,整个集群突然出现大规模丢包,训练任务停滞超过30分钟。经排查,根因为PFC(Priority Flow Control)死锁。
网络架构: - Leaf层:8台CE6865(支持RoCEv2、PFC、ECN) - Spine层:4台CE6865 - GPU服务器:64台(每台8卡A800,双网卡RoCE) - 网络速率:200Gbps(Leaf-Spine) - 协议栈:RoCEv2 over Ethernet
故障现象: 1. 64台GPU服务器中的40台同时出现RDMA通信中断 2. 故障发生时无明显流量高峰 3. 重启相关交换机端口后恢复正常 4. 故障在后续训练任务中重复出现
二、需求分析与方案设计
2.1 PFC死锁原理
PFC(Priority Flow Control)是IEEE 802.1Qbb标准定义的基于优先级的流控机制,用于在无损网络上实现RoCEv2。PFC死锁是RoCE网络中最严重的故障之一。

PFC死锁产生的条件: 1. 多个交换机之间形成环形PFC依赖 2. 每个交换机的队列都被上游的PFC Pause帧阻塞 3. 没有任何一个交换机能够自主清空队列
2.1.1 PFC死锁的四种类型
| 类型 | 描述 | 产生场景 | 恢复难度 |
|---|---|---|---|
| 单交换机队列死锁 | 同一交换机内不同优先级队列互相依赖 | 优先级组(PG)配置不当 | 低(Flush队列) |
| 头阻塞死锁 | 大数据包阻塞小包,PFC持续Pause | MTU不匹配、jumbo frame | 中 |
| 环形死锁 | 多台交换机形成PFC Pause环路 | Fat-Tree拓扑流量突发 | 高(需自动恢复) |
| 多优先级死锁 | 不同优先级的PFC域交叉产生依赖 | 多业务共享链路 | 高 |
2.1.2 DCQCN(Data Center Quantized Congestion Notification)机制
DCQCN是RoCEv2的拥塞控制算法,由PFC(接收端流控)+ ECN(拥塞通知)+ CNP(拥塞通知报文)组成闭环反馈。

DCQCN关键参数:
| 参数 | 默认值 | 调优范围 | 影响 |
|---|---|---|---|
| ECN Low Threshold | 50% | 40%-60% | 过低→频繁标记,过高→标记不及时 |
| ECN High Threshold | 75% | 65%-85% | 决定拥塞标记的激进程度 |
| AI (Additive Increase) | 1 MSS/RTT | 0.5-2 MSS/RTT | 速率恢复速度 |
| MDP (Multiplicative Decrease) | 0.5 | 0.3-0.7 | 拥塞时速率缩减比例 |
| CNP Rate Limit | 1000 pkt/s | 500-5000 pkt/s | CNP报文频率,过高增加开销 |
2.2 RoCE网络可靠性保障机制
| 机制 | 功能 | 死锁防护 |
|---|---|---|
| PFC | 基于优先级的流控 | 可能产生死锁 |
| ECN | 显式拥塞通知 | 预防性,不产生死锁 |
| DCBX | 数据中心桥协商 | 协商PFC/ECN参数 |
| PG(Priority Group) | 优先级组调度 | 调度优化 |
| DSCP标记 | 差异化服务 | 流量分类 |
2.3 排错流程

三、技术细节与实施过程
3.1 PFC状态检查
# 检查PFC统计
<CE6865-Leaf-01> display qos pfc statistics
PFC Statistics:
Interface Priority Pause Sent Pause Received Deadlock
100GE1/0/1 3 15,234 45,678 2 <-- 死锁2次
100GE1/0/2 3 12,345 38,901 1
100GE1/0/3 3 8,765 25,432 0
100GE1/0/4 3 6,543 18,765 0
# 检查PFC配置
<CE6865-Leaf-01> display qos pfc configuration
PFC Configuration:
Interface Priority Enable Xon Threshold Xoff Threshold
100GE1/0/1 3 Yes 10000 20000
100GE1/0/2 3 Yes 10000 20000
100GE1/0/3 3 Yes 10000 20000
100GE1/0/4 3 Yes 10000 20000
3.2 死锁检测与分析
# 查看PFC死锁详情
<CE6865-Leaf-01> display qos pfc deadlock
PFC Deadlock Information:
Total Deadlocks: 2
Latest Deadlock:
Time: 2024-03-15 14:23:45
Interface: 100GE1/0/1
Priority: 3
Duration: 120 seconds
Recovery: Auto-recover triggered
Deadlock Ring:
100GE1/0/1 → CE6865-Leaf-02 100GE1/0/3
100GE1/0/3 → CE6865-Leaf-03 100GE1/0/1
100GE1/0/1 → CE6865-Leaf-04 100GE1/0/2
100GE1/0/2 → CE6865-Leaf-01 100GE1/0/1
死锁环分析:Leaf-01→Leaf-02→Leaf-03→Leaf-04→Leaf-01形成环形PFC依赖。
3.3 根因分析
根因: 1. 4台Leaf交换机通过Spine层互联,当某台Leaf的上行队列拥塞时发送PFC Pause 2. 上游Leaf收到Pause后停止发送,导致其下游队列也拥塞并发送Pause 3. 形成环路后,所有涉及的交换机都在等待对方清空队列,无人能动
触发条件:某GPU节点突发大流量(梯度同步),导致单一优先级队列拥塞。
四、实战配置/案例分析
4.1 PFC死锁恢复配置
# 启用PFC死锁自动恢复
<CE6865-Leaf-01> system-view
[CE6865-Leaf-01] qos
[CE6865-Leaf-01-qos] pfc
[CE6865-Leaf-01-qos-pfc] deadlock-detection enable
[CE6865-Leaf-01-qos-pfc] deadlock-recovery enable
[CE6865-Leaf-01-qos-pfc] deadlock-recovery method flush # 死锁恢复方式:冲刷队列
[CE6865-Leaf-01-qos-pfc] deadlock-detection interval 5 # 检测间隔5秒
[CE6865-Leaf-01-qos-pfc] quit
[CE6865-Leaf-01-qos] quit
4.2 ECN优化(预防PFC死锁)
# 配置ECN参数
[CE6865-Leaf-01] qos
[CE6865-Leaf-01-qos] ecn
[CE6865-Leaf-01-qos-ecn] ecn-threshold low 60 high 80 # ECN阈值60%-80%
[CE6865-Leaf-01-qos-ecn] ecn-mode dynamic # 动态ECN
[CE6865-Leaf-01-qos-ecn] quit
[CE6865-Leaf-01-qos] quit
# 在接口上应用ECN
[CE6865-Leaf-01] interface 100GE 1/0/1
[CE6865-Leaf-01-100GE1/0/1] qos queue 3 wred enable # 启用WRED
[CE6865-Leaf-01-100GE1/0/1] qos queue 3 wred ecn enable # 启用ECN
[CE6865-Leaf-01-100GE1/0/1] quit
4.3 PFC阈值调优
# 调整PFC Xon/Xoff阈值
[CE6865-Leaf-01] interface 100GE 1/0/1
[CE6865-Leaf-01-100GE1/0/1] qos pfc priority 3
[CE6865-Leaf-01-100GE1/0/1-qos-pfc-3] xon-threshold 15000 # Xon阈值(队列水位下降到15000byte恢复发送)
[CE6865-Leaf-01-100GE1/0/1-qos-pfc-3] xoff-threshold 25000 # Xoff阈值(队列水位上升到25000byte发送Pause)
[CE6865-Leaf-01-100GE1/0/1-qos-pfc-3] quit
[CE6865-Leaf-01-100GE1/0/1] quit
4.3.1 PFC/ECN/DCQCN完整配置模板(华为CloudEngine)
以下为CloudEngine交换机RoCE无损网络的完整配置模板,涵盖全局QoS、PFC、ECN、DCQCN和接口级配置。
# =====================================================
# 华为 CloudEngine RoCEv2 无损网络完整配置模板
# 适用: CE6865/CE8860 等支持RoCEv2的交换机
# =====================================================
# ---- 1. 全局QoS模式 ----
qos queue mode per-queue
# ---- 2. DSCP到Priority映射 ----
qos
dscp-to-exp-map 0x22 3 # CS3 → Priority 3 (RoCE数据)
dscp-to-exp-map 0x2E 6 # CS6 → Priority 6 (CNP控制报文)
quit
# ---- 3. PFC全局配置(死锁检测+自动恢复) ----
qos
pfc
deadlock-detection enable
deadlock-recovery enable
deadlock-recovery method flush
deadlock-detection interval 5
deadlock-recovery threshold 3
quit
quit
# ---- 4. ECN全局配置 ----
qos
ecn
ecn-mode dynamic
ecn-threshold low 60 high 80
ecn-mark-probability 10
quit
quit
# ---- 5. 接口级PFC+ECN(上行+Leaf间) ----
interface Range 100GE 1/0/1 to 100GE 1/0/8
qos pfc priority 3
xon-threshold 15000
xoff-threshold 25000
quit
qos queue 3 wred enable
qos queue 3 wred ecn enable
qos dscp-transmit queue 6 dscp 0x2E
quit
# ---- 6. 服务器侧接口 ----
interface Range 100GE 1/0/9 to 100GE 1/0/40
qos pfc priority 3
xon-threshold 10000
xoff-threshold 20000
quit
qos queue 3 wred enable
qos queue 3 wred ecn enable
quit
# ---- 7. DCBX自动协商 ----
dcbbx enable
interface Range 100GE 1/0/1 to 100GE 1/0/40
dcbbx pfc role initiator
dcbbx app-priority 0x22 3
dcbbx app-priority 0x2E 6
dcbbx will-age role controller
quit
# ---- 8. 队列调度权重 ----
qos
scheduler
queue 3 weight 800 # P3权重最高(RoCE)
queue 6 weight 200 # P6较高(CNP)
queue 0 weight 100
queue 1 weight 100
queue 2 weight 100
queue 4 weight 100
queue 5 weight 100
queue 7 weight 100
quit
quit
4.3.2 RoCE网络性能监控脚本
#!/usr/bin/env python3
"""
roce_monitor.py — RoCE网络性能监控(采集PFC/ECN、检测死锁、生成报告)
依赖: pip install netmiko pandas
"""
import argparse
import csv
import re
import os
from datetime import datetime
from pathlib import Path
from netmiko import ConnectHandler
import pandas as pd
class RoceMonitor:
"""RoCE网络性能监控器"""
def __init__(self, device: dict):
self.device = device
self.conn = None
self.hostname = ""
def connect(self):
self.conn = ConnectHandler(**self.device)
self.hostname = self.conn.find_prompt().replace(">", "").replace("#", "")
def collect_pfc_stats(self) -> list[dict]:
"""采集PFC暂停帧统计"""
output = self.conn.send_command("display qos pfc statistics")
records = []
for line in output.strip().split("\n")[2:]:
parts = line.split()
if len(parts) >= 5:
records.append({
"hostname": self.hostname,
"interface": parts[0],
"priority": parts[1],
"pause_sent": int(parts[2].replace(",", "")),
"pause_received": int(parts[3].replace(",", "")),
"deadlock_count": int(parts[4]),
"timestamp": datetime.now().isoformat()
})
return records
def collect_ecn_stats(self) -> dict:
"""采集ECN统计"""
output = self.conn.send_command("display qos ecn statistics")
marked = re.findall(r"ECN Marked:\s*(\d+)", output)
total = re.findall(r"Total Packets:\s*(\d+)", output)
ecn_marked = int(marked[0]) if marked else 0
total_pkts = int(total[0]) if total else 0
return {
"hostname": self.hostname,
"ecn_marked": ecn_marked,
"total_packets": total_pkts,
"ecn_mark_rate": ecn_marked / total_pkts * 100 if total_pkts > 0 else 0
}
def collect_deadlock_info(self) -> list[dict]:
"""采集死锁信息"""
output = self.conn.send_command("display qos pfc deadlock")
deadlocks = []
for block in output.split("Deadlock")[1:]:
time_m = re.search(r"Time:\s*(.+)", block)
iface_m = re.search(r"Interface:\s*(.+)", block)
dur_m = re.search(r"Duration:\s*(\d+)", block)
deadlocks.append({
"hostname": self.hostname,
"time": time_m.group(1).strip() if time_m else "N/A",
"interface": iface_m.group(1).strip() if iface_m else "N/A",
"duration_sec": int(dur_m.group(1)) if dur_m else 0
})
return deadlocks
def collect_all(self) -> dict:
"""采集所有监控数据"""
self.connect()
data = {
"pfc_stats": self.collect_pfc_stats(),
"ecn_stats": self.collect_ecn_stats(),
"deadlock_info": self.collect_deadlock_info()
}
self.conn.disconnect()
return data
@staticmethod
def detect_anomalies(all_data: list[dict]) -> list[dict]:
"""检测异常"""
anomalies = []
for data in all_data:
hostname = data["pfc_stats"][0]["hostname"] if data["pfc_stats"] else "?"
for stat in data["pfc_stats"]:
if stat["pause_received"] > 10000:
anomalies.append({
"type": "PFC_HIGH_PAUSE", "severity": "WARNING",
"hostname": stat["hostname"], "interface": stat["interface"],
"detail": f"PFC暂停帧: {stat['pause_received']}"
})
if stat["deadlock_count"] > 0:
anomalies.append({
"type": "PFC_DEADLOCK", "severity": "CRITICAL",
"hostname": stat["hostname"], "interface": stat["interface"],
"detail": f"死锁次数: {stat['deadlock_count']}"
})
ecn = data["ecn_stats"]
if ecn.get("ecn_mark_rate", 0) > 5:
anomalies.append({
"type": "ECN_HIGH_RATE", "severity": "WARNING",
"hostname": hostname,
"detail": f"ECN标记率: {ecn['ecn_mark_rate']:.2f}%"
})
for dl in data["deadlock_info"]:
anomalies.append({
"type": "DEADLOCK_HISTORY", "severity": "CRITICAL",
"hostname": dl["hostname"],
"detail": f"死锁 {dl['time']}, 持续{dl['duration_sec']}s"
})
return anomalies
@staticmethod
def generate_report(all_data, anomalies, output_dir):
"""生成监控报告"""
Path(output_dir).mkdir(parents=True, exist_ok=True)
ts = datetime.now().strftime("%Y%m%d_%H%M%S")
# 导出CSV
pfc_rows = [s for d in all_data for s in d["pfc_stats"]]
if pfc_rows:
pd.DataFrame(pfc_rows).to_csv(f"{output_dir}/pfc_stats_{ts}.csv", index=False)
# 异常报告
with open(f"{output_dir}/anomalies_{ts}.txt", "w") as f:
f.write(f"RoCE Monitor Report - {datetime.now()}\n{'='*60}\n")
f.write(f"Total anomalies: {len(anomalies)}\n\n")
for a in anomalies:
sev = "CRITICAL" if a["severity"] == "CRITICAL" else "WARNING"
f.write(f"[{sev}] {a['type']} @ {a['hostname']}\n")
if "interface" in a:
f.write(f" Interface: {a['interface']}\n")
f.write(f" {a['detail']}\n\n")
def main():
parser = argparse.ArgumentParser(description="RoCE网络性能监控")
parser.add_argument("--hosts", required=True)
parser.add_argument("--output", default="roce_reports")
args = parser.parse_args()
devices = []
with open(args.hosts) as f:
for row in csv.DictReader(f):
devices.append({
"device_type": row["device_type"], "host": row["ip"],
"username": row["username"], "password": row["password"]
})
all_data = []
for dev in devices:
m = RoceMonitor(dev)
try:
data = m.collect_all()
all_data.append(data)
print(f"[OK] {m.hostname}")
except Exception as e:
print(f"[FAIL] {dev['host']}: {e}")
anomalies = RoceMonitor.detect_anomalies(all_data)
RoceMonitor.generate_report(all_data, anomalies, args.output)
print(f"\n报告: {args.output}/ 异常: {len(anomalies)}")
if __name__ == "__main__":
main()
监控频率与告警阈值:
| 监控项 | 采集频率 | 告警阈值 | 响应级别 |
|---|---|---|---|
| PFC暂停帧数 | 1分钟 | >10000/min | Warning |
| PFC死锁 | 实时 | 任何死锁 | Critical |
| ECN标记率 | 5分钟 | >5% | Warning |
| 队列水位 | 1分钟 | >85% | Warning |
| RoCE重传率 | 5分钟 | >0.01% | Critical |
4.4 DCBX自动协商配置
DCBX(Data Center Bridge eXchange)协议自动协商PFC/ECN/PG参数,避免手动配置的误差。
# 启用DCBX
[CE6865-Leaf-01] dcbbx enable
[CE6865-Leaf-01] interface 100GE 1/0/1
[CE6865-Leaf-01-100GE1/0/1] dcbbx pfc role initiator # 主动协商PFC参数
[CE6865-Leaf-01-100GE1/0/1] dcbbx app-priority 0x22 3 # DSCP 0x22映射到Priority 3
[CE6865-Leaf-01-100GE1/0/1] dcbbx app-priority 0x23 3 # DSCP 0x23映射到Priority 3
[CE6865-Leaf-01-100GE1/0/1] dcbbx will-age role controller # 控制老化时间
[CE6865-Leaf-01-100GE1/0/1] quit
# 验证DCBX协商结果
<CE6865-Leaf-01> display dcbbx interface 100GE 1/0/1
DCBX Information:
Interface: 100GE1/0/1
Role: Initiator
PFC Priority: 3
PFC Xon/Xoff: 15000/25000
App Priority Table:
DSCP 0x22 → Priority 3
DSCP 0x23 → Priority 3
4.5 死锁恢复方式对比
| 恢复方式 | 原理 | 影响范围 | 恢复时间 | 推荐场景 |
|---|---|---|---|---|
| Flush队列 | 强制清空死锁优先级队列 | 仅丢弃死锁队列报文 | <1s | 默认推荐 |
| Port Disable | 暂时关闭死锁端口再恢复 | 端口下所有业务中断 | 2-3s | Flush无效时使用 |
| PFC Pause刷新 | 向环路内发送Resume帧 | 仅中断PFC域流量 | <500ms | 交换机支持时使用 |
| 手动重启端口 | 手动shutdown/no shutdown | 端口下所有业务中断 | 5-10s | 无自动恢复能力时 |
4.6 RoCEv2 vs InfiniBand 对比
| 对比项 | RoCEv2 (Ethernet) | InfiniBand |
|---|---|---|
| 无损机制 | PFC + ECN (DCQCN) | 内置流控(RC模式) |
| 死锁风险 | 有,需额外防护 | 低(硬件保证) |
| 网络成熟度 | 高(以太网生态) | 中(专用生态) |
| 成本 | 低(通用网卡/交换机) | 高(专用IB网卡/交换机) |
| 互通性 | 好(基于标准以太网) | 差(封闭协议) |
| 性能 | RDMA延迟 ~0.5μs | RDMA延迟 ~0.4μs |
| AI训练适配 | 好(RoCEv2+GPU Direct) | 优秀(原生IB+GPU Direct) |
| 推荐场景 | 大规模AI集群、成本敏感 | 超算、极致性能要求 |
4.7 PFC排错实战清单
| 步骤 | 检查项 | 命令 | 预期结果 |
|---|---|---|---|
| 1 | PFC统计 | display qos pfc statistics |
Pause帧数在正常范围 |
| 2 | PFC配置 | display qos pfc configuration |
Xon/Xoff阈值合理 |
| 3 | 死锁检测 | display qos pfc deadlock |
无死锁记录或已恢复 |
| 4 | ECN状态 | display qos ecn statistics |
ECN标记比例<5% |
| 5 | 队列水位 | display qos queue statistics |
各优先级队列水位正常 |
| 6 | DCBX协商 | display dcbbx interface |
协商参数一致 |
| 7 | 接口错误 | display interface |
无CRC/巨帧错误 |
| 8 | RoCE丢包 | display roce statistics |
RDMA重传率<0.01% |
| 9 | 抓包验证 | packet-capture + Wireshark |
PFC Pause时序正常 |
| 10 | 压力测试 | 使用RoCE基准测试工具 | 无死锁、丢包率为0 |
4.9 优化效果
| 指标 | 优化前 | 优化后 |
|---|---|---|
| PFC死锁次数 | 2次/周 | 0次/周 |
| RoCE丢包率 | 0.5% | 0% |
| 训练任务中断 | 30分钟/次 | 0 |
| PFC Pause帧数 | 45,678 | 12,345(↓73%) |
| 队列拥塞事件 | 15次/天 | 3次/天 |
4.10 RoCEv2无损网络设计最佳实践
| 序号 | 最佳实践 | 说明 | 违反后果 |
|---|---|---|---|
| 1 | Fat-Tree拓扑 | Leaf-Spine两层架构,避免PFC域形成环路 | 环形PFC依赖导致死锁 |
| 2 | PFC+ECN必须同时启用 | PFC做最后一道防线,ECN做预防性拥塞通知 | 仅PFC→频繁Pause,仅ECN→极端情况丢包 |
| 3 | ECN阈值合理配置 | Low=60%、High=80%为推荐起点,根据实际调优 | 阈值过低→频繁标记降速;过高→来不及反应 |
| 4 | PFC死锁检测+自动恢复必须启用 | 检测间隔≤5秒,恢复方式优先Flush | 无自动恢复→人工干预,业务中断时间长 |
| 5 | MTU全局统一为Jumbo Frame(9000) | 从NIC到交换机所有节点一致 | MTU不匹配→分片→性能下降甚至不通 |
| 6 | DCBX自动协商 | 交换机与NIC自动协商PFC/ECN/PG参数 | 手动配置不一致→PFC/Priority映射错误 |
| 7 | RoCE流量独立优先级 | RoCE数据固定映射到单一优先级(P3) | 多优先级交叉→PFC域扩大、死锁概率增加 |
| 8 | CNP报文独立高优先级 | CNP控制报文映射到P6,调度权重高于普通数据 | CNP延迟→拥塞响应不及时→丢包 |
| 9 | 流量整形避免突发 | GPU训练流量使用速率限制或分批发送 | 突发大流量→队列瞬间拥塞→PFC Pause风暴 |
| 10 | 全链路RoCE能力核查 | 交换机、NIC、交换机OS均支持RoCEv2+DCQCN | 单点不支持→降级为TCP→性能下降90% |
| 11 | 部署前压力测试 | 使用iperf3-RoCE/nccl-test满负载测试≥1小时 | 无压力测试→生产环境首次爆发即故障 |
| 12 | Telemetry秒级监控 | PFC暂停帧、ECN标记率、队列水位实时监控 | 无监控→死锁发生后才发现,无法追溯 |
4.11 PFC死锁排查Mermaid流程图

五、经验总结
| 序号 | 经验类别 | 经验内容 | 适用场景 |
|---|---|---|---|
| 1 | PFC配置 | PFC必须配合ECN使用,ECN是预防性机制 | RoCE网络 |
| 2 | 死锁检测 | PFC死锁检测必须启用,且设置合理的检测间隔 | 故障防护 |
| 3 | 阈值调优 | PFC Xon/Xoff阈值需要根据实际流量调整 | 性能优化 |
| 4 | 恢复机制 | 死锁恢复推荐使用Flush方式,比Port Disable更温和 | 故障恢复 |
| 5 | 流量工程 | GPU训练流量应做流量整形,避免突发大流量 | 流量管理 |
| 6 | 监控告警 | PFC统计必须纳入实时监控 | 运维监控 |
| 7 | 拓扑设计 | 避免PFC域形成环形拓扑,使用Tree或Fat-Tree结构 | 架构设计 |
| 8 | DCBX | DCBX必须启用,自动协商PFC/ECN参数 | 自动化 |
| 9 | 测试验证 | 部署后必须使用压力测试验证PFC行为 | 验收测试 |
| 10 | 文档记录 | PFC/ECN参数配置必须文档化 | 文档管理 |
附录:RoCEv2网络部署检查清单
在实际部署RoCEv2网络时,按照此清单逐项检查,可大幅降低故障率。
| 阶段 | 检查项 | 命令/方法 | 状态 |
|---|---|---|---|
| 规划阶段 | |||
| 1 | 拓扑设计为Fat-Tree(无环PFC域) | 架构评审 | □ |
| 2 | 交换机支持PFC+ECN+DCBX | 产品规格书 | □ |
| 3 | 网卡支持RoCEv2+DCQCN | 产品规格书 | □ |
| 4 | MTU统一配置为Jumbo Frame(9000) | 配置核查 | □ |
| 部署阶段 | |||
| 5 | PFC优先级映射(RoCE→Priority 3) | DCBX配置 | □ |
| 6 | ECN阈值配置(Low/High) | 接口配置 | □ |
| 7 | PFC死锁检测+自动恢复 | 全局配置 | □ |
| 8 | DSCP标记(CS3/EF→Priority 3) | QoS策略 | □ |
| 验证阶段 | |||
| 9 | PFC Pause统计正常 | display qos pfc statistics |
□ |
| 10 | ECN标记比例<5% | display qos ecn statistics |
□ |
| 11 | 无死锁记录 | display qos pfc deadlock |
□ |
| 12 | RDMA ping测试通过 | rdma ping |
□ |
| 13 | iPerf3-RoCE带宽达标 | iperf3 --rdma |
□ |
| 14 | 压力测试无死锁(持续1小时) | 自定义脚本 | □ |
思考
- PFC和ECN可以同时启用吗?两者如何协作避免丢包?
- 如果RoCE网络中某些交换机不支持PFC死锁检测,如何设计网络架构避免死锁?
- RoCEv2和InfiniBand在无损传输机制上有何本质区别?在AI训练场景下如何选择?
下篇预告:第347篇:Telemetry 发现现网隐藏拥塞点