第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 标记率、路径状态 |
七、思考
- NVMe over RoCEv2 部署中,PFC 为什么只在优先级 3 开启?如果在所有优先级开启会有什么问题?
- 多路径配置在 NVMe over RoCE 中如何实现?服务器和存储之间的 8 条路径是如何计算的?
- 如何验证 NVMe over RoCEv2 的性能是否达标?关键指标有哪些?
- 当一台 Leaf 交换机故障时,NVMe 多路径如何自动切换?切换时间大约是多少?
- 在部署案例中,DSCP 映射和 PFC 优先级的关系是什么?为什么要配置 DSCP 到优先级的映射?
下篇预告:第271篇《云计算网络基础:虚拟交换机(OVS)》——Open vSwitch 的原理、数据面与流表匹配,在云计算和容器场景的应用。