4. 配置DCBX(数据中心桥接交换)

任务目标

在RoCEv2融合以太网环境中,DCBX(Data Center Bridging Exchange)负责在交换机和网卡之间自动协商优先级流控(PFC)与增强传输选择(ETS)参数,确保无损网络行为。本案例完成最小可复现的DCBX配置闭环:在Linux主机侧启用DCBX并验证与交换机侧的协商结果。

环境与依赖

  • Linux主机(内核≥4.20),使用支持DCBX的网卡(如Mellanox ConnectX-4/5/6系列)
  • mlx4/mlx5_core驱动已加载,并安装dcb工具(iproute2包,版本≥4.18)
  • 对端交换机已启用DCBX(CEE或IEEE 802.1Qaz模式),本案例以IEEE模式为例

关键完整代码

#!/bin/bash
# dcbx_config.sh - 启用并验证RoCEv2 DCBX协商

set -e
IFACE=${1:-eth0}   # 网卡接口名,默认eth0

# 1. 确认网卡支持DCBX
if ! ethtool -I $IFACE 2>/dev/null | grep -q "dcb"; then
    echo "错误: $IFACE 不支持DCBX" >&2
    exit 1
fi

# 2. 启用IEEE 802.1Qaz DCBX模式
dcb dcbx set dev $IFACE mode ieee

# 3. 配置PFC:启用优先级3和4的流控(RoCEv2典型配置)
dcb pfc set dev $IFACE prio-pfc 0:off 1:off 2:off 3:on 4:on 5:off 6:off 7:off

# 4. 配置ETS:为优先级3和4分配带宽(各50%)
dcb ets set dev $IFACE prio-tc 0:0 1:0 2:0 3:1 4:1 5:0 6:0 7:0
dcb ets set dev $IFACE tc-tsa 0:strict 1:ets
dcb ets set dev $IFACE tc-bw 0:0 1:100

# 5. 查询并显示当前DCBX协商状态
echo "=== DCBX模式 ==="
dcb dcbx show dev $IFACE
echo "=== PFC配置 ==="
dcb pfc show dev $IFACE
echo "=== ETS配置 ==="
dcb ets show dev $IFACE

# 6. 验证对端协商(需交换机侧配合)
echo "=== 链路层发现协议(LLDP)邻居DCBX TLVs ==="
lldptool -t -i $IFACE -n -V DCB 2>/dev/null || echo "lldptool未安装,跳过邻居验证"

运行方式

# 赋予执行权限并运行(需root权限)
chmod +x dcbx_config.sh
sudo ./dcbx_config.sh eth0

验证方法与判定标准

  • 配置生效:脚本第5步输出中,pfc显示优先级3和4为on,ets显示tc-tsa为ets且tc-bw分配正确,即本机配置成功。
  • 协商成功:在交换机侧执行show dcb(厂商命令不同)确认收到本机通告的PFC/ETS参数;或在本机安装lldptool后,第6步输出显示对端交换机的DCBX TLVs,且PFC/ETS参数与本机一致。
  • 通过条件:本机与交换机两侧的PFC使能优先级和ETS带宽分配完全匹配,且无DCBX协商超时或错误日志(检查dmesg | grep dcb)。

常见问题

  • DCBX模式不匹配:交换机若使用CEE模式,需将第2步改为dcb dcbx set dev $IFACE mode cee,但RoCEv2生产环境建议统一使用IEEE模式。
  • 网卡不支持:部分网卡需先加载mlx5_core并启用DCB内核模块参数,可通过modprobe mlx5_core dcb=1启用。
  • lldptool缺失:仅影响邻居信息查看,不影响DCBX本身功能;可通过apt install lldpd或yum install lldpad安装。