第270篇:NVMe over RoCEv2 部署案例

关键词

NVMe over RoCEv2、无损存储网络、部署案例、性能调优、存储分离、全闪存阵列


一、部署场景概述

1.1 场景需求

场景:某互联网公司 AI 训练 + 核心数据库存储升级

现有环境: 100 台 GPU 服务器(AI 训练) 50 台数据库服务器(MySQL) 全闪存存储阵列(华为 OceanStor Dorado)

需求: 存储延迟 < 20μs AI 训练 IOPS:500 万+ 数据库 IOPS:100 万+ 存储网络与计算网络融合(统一 RoCE)

方案选择: | 方案 | 延迟 | 成本 | | --- | --- | --- | | FC-NVMe NVMe/RoCE NVMe/TCP | 10μs 10-15μs 100-200μs | 高(专用 FC) 中(统一网络) 低 |

选择:NVMe over RoCEv2(性能和成本的最佳平衡)

1.2 网络拓扑

部署拓扑:

                ┌──────────┐
                │  Spine   │
                │ × 4      │
                └────┬─────┘
                     │ 100G
                ┌────┴─────┐
                │  Leaf    │
                │ × 10     │
                └────┬─────┘
                     │
┌────┴────┐ ┌────┴────┐ ┌────┴────┐
GPU Server × 40 100G DB Server × 25 100G Storage Array × 8 100G×4

存储阵列接入: 每台存储阵列 4 个 100G 端口(双控制器 × 双端口) MPIO + NVMe 多路径 连接到 4 台不同的 Leaf

服务器接入: 每台 GPU/DB 服务器 2 个 100G 端口 连接到 2 台不同 Leaf


二、无损网络配置

2.1 华为 CE 交换机配置

# Leaf 交换机完整无损网络配置
#
dcbx enable
#
# ECN Profile
ecn
 ecn-profile ROCE_STORAGE
  color green
   ecn threshold low 100 high 400
   ecn mark-probability 100
#
# 队列调度
qos profile STORAGE_QOS
 #
 schedule wfq
 queue 0 be weight 10                         # 管理流量
 queue 3 ef priority 3                        # RoCE 存储流量(PQ)
 queue 4 af weight 30                         # AI 训练数据
 queue 5 af weight 20                         # 数据库复制
#
# 接口配置(连接服务器/存储)
interface 100GE1/0/1
 description To-GPU-Server-1
 #
 # PFC
 flow-control
 priority-flow-control enable
 priority-flow-control priority 3             # 只对 RoCE 优先级开启
 #
 # ECN
 ecn ecn-profile ROCE_STORAGE
 #
 # 信任 DSCP
 trust dscp
 qos queue 3 ef priority 3
 qos queue 0 be priority 0
#
# 接口配置(连接 Spine)
interface 100GE1/0/2
 description To-Spine-1
 #
 # PFC(Spine 间需要双向开启)
 flow-control
 priority-flow-control enable
 priority-flow-control priority 3
 #
 ecn ecn-profile ROCE_STORAGE

2.2 服务器端配置

# GPU 服务器配置(Ubuntu 22.04 + MLNX OFED)
#
# 1. 安装 Mellanox OFED 驱动
wget https://www.mellanox.com/downloads/ofed/MLNX_OFED_LINUX-5.8-x.tgz
tar xzf MLNX_OFED_LINUX-5.8-x.tgz
cd MLNX_OFED_LINUX-5.8-x
./mlnxofedinstall --upgrade-libs

# 2. 配置 RoCE 网卡
#
# 查看 RoCE 网卡
ibdev2netdev

# 配置 DSCP(优先级映射)
echo 108 > /sys/class/net/ens1np0/phys_switch/pfc/dscp/3/prio
echo 3 > /sys/class/net/ens1np0/phys_switch/pfc/prio/3/state

# 3. 设置 MTU
ip link set dev ens1np0 mtu 9000

# 4. 加载 nvme-rdma 模块
modprobe nvme-rdma
modprobe mlx5_ib

# 5. 连接存储(NVMe over RDMA)
nvme connect -t rdma -n nqn.2023-08.com.huawei:storage:array-01 \
  -a 192.168.100.1 -s 4420

# 6. 验证连接
nvme list
nvme id-ctrl /dev/nvme0n1

2.3 存储阵列配置

# 华为 OceanStor Dorado 配置 NVMe over RoCE
#
# 1. 创建 Storage Pool
create storage_pool name=NVMe_Pool disk_type=NVMe_SSD capacity=100TB

# 2. 创建 LUN
create lun name=AI_Training_Data capacity=50TB
create lun name=DB_Data capacity=20TB
create lun name=DB_Log capacity=5TB

# 3. 创建 NVMe over RoCE 端口
create nvme_roce_port ip=192.168.100.1 netmask=255.255.255.0
create nvme_roce_port ip=192.168.100.2 netmask=255.255.255.0

# 4. 创建 Host
create host name=GPU_Server1 os=linux
create host name=DB_Server1 os=linux

# 5. 映射 LUN 到 Host
create mapping_view name=AI_View
add mapping_view member=AI_View lun=AI_Training_Data
add mapping_view member=AI_View host=GPU_Server1

三、多路径配置

3.1 NVMe 多路径

# 服务器端 NVMe 多路径配置
#
# 服务器有 2 个 RoCE 端口连接到 2 台 Leaf
# 存储阵列有 4 个 RoCE 端口
# → 8 条路径

# 1. 添加所有路径
nvme connect -t rdma -n nqn.2023-08:storage:array-01 \
  -a 192.168.100.1 -s 4420                    # 路径 1
nvme connect -t rdma -n nqn.2023-08:storage:array-01 \
  -a 192.168.100.2 -s 4420                    # 路径 2
nvme connect -t rdma -n nqn.2023-08:storage:array-01 \
  -a 192.168.101.1 -s 4420                    # 路径 3
nvme connect -t rdma -n nqn.2023-08:storage:array-01 \
  -a 192.168.101.2 -s 4420                    # 路径 4

# 2. 查看多路径
nvme list-subsys /dev/nvme0

# 3. 配置原生 NVMe 多路径
echo "options nvme_core multipath=Y" > /etc/modprobe.d/nvme-multipath.conf

# 4. 重启后生效
update-initramfs -u

3.2 路径故障处理

路径故障自动切换:

正常状态:
  Path 1: Active(Leaf1 → Storage1)
  Path 2: Active(Leaf1 → Storage2)
  Path 3: Active(Leaf2 → Storage1)
  Path 4: Active(Leaf2 → Storage2)

Leaf1 故障:
  Path 1 → Dead
  Path 2 → Dead
  Path 3 → Active(自动接管)
  Path 4 → Active

  切换时间:< 100ms
  NVMe 命令自动重试(内部)
  应用层无感知

查看路径:
  nvme list-subsys
  NVMe subsystem: nqn.2023-08:storage:array-01
    Path 1: 192.168.100.1 - Active
    Path 2: 192.168.100.2 - Active
    Path 3: 192.168.101.1 - Inactive
    Path 4: 192.168.101.2 - Inactive

四、性能验证

4.1 基准测试

# FIO 基准测试
#
# 随机读测试
fio --name=randread \
    --ioengine=libaio \
    --iodepth=64 \
    --rw=randread \
    --bs=4k \
    --size=100G \
    --numjobs=8 \
    --runtime=60 \
    --time_based \
    --filename=/dev/nvme0n1

# 预期结果
  IOPS: ~120万(4K 随机读)
  延迟: ~15μs(平均)
  带宽: ~4.5GB/s

# 混合读写测试
fio --name=mixrw \
    --ioengine=libaio \
    --iodepth=64 \
    --rw=randrw \
    --rwmixread=70 \
    --bs=8k \
    --size=100G \
    --numjobs=8 \
    --runtime=60 \
    --filename=/dev/nvme0n1

# 预期结果
  IOPS: ~80万(70/30 混合)
  延迟: ~20μs

4.2 延迟验证

# 单次 IO 延迟验证
#
# 使用 SPDK perf 工具
spdk_nvme_perf -q 1 -s 512 -w randread -t 10

# 使用 nvme-cli 直接读
nvme read /dev/nvme0n1 -s 0 -c 0 -z 512

# 网络延迟验证
# 验证 RDMA 延迟
ib_write_lat -d mlx5_0 -D 10 -x 3

# 验证端到端存储延迟
# 使用 iostat 查看平均延迟
iostat -x 1
  Device     r/s     w/s     rkB/s     wkB/s  await  svctm
  nvme0n1  120000  30000  48000000  12000000  0.02   0.01

  await < 0.03ms = 30μs ✓

五、运维监控

5.1 关键监控指标

监控指标体系:

┌────────────┬─────────────┬──────────────────┐
│ 指标        │ 正常范围     │ 告警阈值          │
├────────────┼─────────────┼──────────────────┤
│ 存储延迟    │ < 20μs     │ > 50μs           │
│ IOPS        │ 按需        │ < 80% 预期       │
│ PFC 帧数    │ < 100/s    │ > 1000/s         │
│ 队列深度    │ 10-64       │ > 200            │
│ 链路利用率  │ < 60%       │ > 80%            │
│ ECN 标记率  │ < 5%        │ > 10%            │
│ 路径状态    │ 全部 Active │ 任何 Inactive    │
└────────────┴─────────────┴──────────────────┘

采集工具:
  # 华为设备
  display dcb pfc interface
  display ecn statistics
  display interface 100GE1/0/1

  # 服务器
  nvme list-subsys                           # 查看路径
  nvme smart-log /dev/nvme0n1                # 查看 SSD 健康状态
  iostat -x 1                                # IO 延迟
  rdma statistic show                        # RDMA 统计

六、总结

知识点 核心要点
部署架构 Spine-Leaf + RoCE 无损网络
PFC/ECN 配置 优先级 3 开启 PFC,ECN 阈值 Kmin=100 Kmax=400
服务器配置 MLNX OFED + NVMe-RDMA 驱动
多路径 原生 NVMe 多路径,Active-Active 4-8 路径
性能目标 延迟 < 20μs,IOPS > 100 万(4K 随机读)
故障切换 路径故障 < 100ms 切换,应用无感
监控重点 PFC 帧率、ECN 标记率、路径状态

七、思考

  1. NVMe over RoCEv2 部署中,PFC 为什么只在优先级 3 开启?如果在所有优先级开启会有什么问题?
  2. 多路径配置在 NVMe over RoCE 中如何实现?服务器和存储之间的 8 条路径是如何计算的?
  3. 如何验证 NVMe over RoCEv2 的性能是否达标?关键指标有哪些?
  4. 当一台 Leaf 交换机故障时,NVMe 多路径如何自动切换?切换时间大约是多少?
  5. 在部署案例中,DSCP 映射和 PFC 优先级的关系是什么?为什么要配置 DSCP 到优先级的映射?

下篇预告:第271篇《云计算网络基础:虚拟交换机(OVS)》——Open vSwitch 的原理、数据面与流表匹配,在云计算和容器场景的应用。