
我们在湾仔 Tier III+ 数据中心新增一组 AI / 高速交易集群:核心诉求是 10 µs-100 µs 级随机读延迟、>10 M IOPS 并发、单集群 3 PB 以上扩展,而机柜早已摆满服务器,传统 FC SAN 根本跟不上。最终我选择了 NVMe-over-Fabrics (NVMe-oF),在两排共 14 个机柜之间织出一张 400 GbE RoCEv2+NVMe/TCP 混合网络,整套端到端 P99.99 延迟 0.78 ms,吞吐轻松跑满 24 × 100 GbE 上行。下面把从选型、部署到踩坑的全过程记录下来,希望能给你在香港机房落地 NVMe-oF 提供一份可照抄的剧本。
1 场景与技术指标
| 业务线 | 读写模式 | 峰值 IOPS | 带宽 | 延迟 SLA | 容量 | 可用性 |
|---|---|---|---|---|---|---|
| AI 训练 Cache | 60% 读 / 40% 写 | 5 M | 200 GB/s | P99 < 0.9 ms | 1 PB | ≥99.99% |
| 高频交易 Tick 数据 | 95% 读 | 4 M | 120 GB/s | P99.99 < 0.3 ms | 300 TB | ≥99.999% |
| 实时日志流 | Append-only | 1 M | 40 GB/s | P95 < 2 ms | 2 PB | ≥99.9% |
设计目标
- 亚毫秒延迟可靠满足三条业务线最苛刻 P99.99
- 线速打满 400 GbE × 2 Spine,上行无瓶颈
- 横向扩容至 8 PB 不换架构、不下线
2 架构总览(ASCII 拓扑)
┌───────────── Spine SW1 ─────────────┐
│ 400 GbE │
Leaf A1 │100 GbE×16 100 GbE×16│ Leaf B1
┌─────────┴──┐ ┌──┴─────────┐
│ 2U JBOF │ NVMe-oF/RDMA │ NVMe-oF/TCP │ 2U JBOF │
│ (SPDK tgt) │──────────────▶│ (Linux nvmet)│ │
└────────────┘ └─────────────┘
▲ ▲ 同机架 ▲ ▲
│ └─────┐ ┌───┘ │
│ ▼ ▼ │
┌───┴───┐ ┌───┴───┐ ┌───┴───┐ ┌───┴───┐
| GPU01 | | GPU02 | … | HFT01 | | HFT02 |
| BFD-2 | | BFD-2 | | XDP | | XDP |
└───────┘ └───────┘ └───────┘ └───────┘
双 Spine / 多 Leaf 零阻塞 CLOS;每 Leaf 单跳机架内 ≤ 3 µs
SmartNIC (Mellanox BlueField-2):卸载 NVMe-oF RDMA queue + vDPA
Target 侧 两种实现并存:
- 低延迟盘采用 SPDK nvme-rdma target(user-space + polling)
- Bulk 存储走 Linux 6.8 nvmet + NVMe/TCP,节省 CPU
3 硬件 BOM
| 设备 | 规格 (关键参数) | 数量 | 单价 (HKD) | 备注 |
|---|---|---|---|---|
| JBOF 2U | 24× E3.S Gen4 15.36 TB | 12 | $258 k | PCIe Gen4 x16 upstream |
| Switch Spine | Broadcom Trident4-CX 32× 400 GbE | 2 | $670 k | PFC、ECN、RoCEv2 |
| Switch Leaf | Marvell Teralynx 5 48× 100 GbE | 6 | $320 k | |
| DPU | NVIDIA BlueField-2 DPDK-2×100 GbE | 48 | $25 k | 32 GB DDR4 |
| Host SSD | Samsung PM1743 7.68 TB | 96 | $5 k | 系统盘 |
| 光模块 | 400 G DR4/FR4 + 100 G DR | – | – | 选用亿源光 |
总 CAPEX ≈ HK$ 21.4 M,相同性能若走传统 AFA + FC SAN > HK$ 28 M。
4 交换网络设计与 RDMA 调优
4.1 DCB 配置片段(Spine/Leaf 共用)
# PFC for lossless class 3
dcb pfc 3 enable
dcb pfc 0 1 2 4 5 6 7 disable
# ETS: strict priority for class 3 (NVMe-oF)
dcb ets pg 3 70
dcb ets pg 0 15
dcb ets pg 1 15
# ECN: Kmax 17, Kmin 10 (≈200 KB)
ecn enable ports all
ecn threshold 10 17
- PFC 仅开一条队列,避免 Head-of-Line 阻塞
- ECN 标记 + DCTCP 保证高并发时队列稳定在 200–300 KB
- SR-4 光链路延迟实测 ≈ 0.42 µs/50 m
4.2 SmartNIC FW & sysctl
# BlueField-2
mlxconfig -d bf2 set PFCCtrl=1 RDMAMaxT=65535
# Host
sysctl -w net.core.rmem_max=1073741824
sysctl -w net.core.wmem_max=1073741824
sysctl -w net.ipv4.tcp_congestion_control=dctcp
5 NVMe-oF Target 端部署
5.1 SPDK nvme-rdma
git clone https://github.com/spdk/spdk.git && cd spdk
git submodule update --init
meson setup build -Dexamples=true -Dliburing=true
ninja -C build
sudo ./build/bin/nvmf_tgt -m 0xF0 ## CPU core mask
# JSON RPC to create subsystem
scripts/rpc.py nvmf_create_transport -t RDMA -u 131072 -p 4
scripts/rpc.py nvmf_create_subsystem nqn.2014-08.org.nvmexpress:cache1
scripts/rpc.py bdev_nvme_attach_controller -b nvme0 -a 0000:b3:00.0 -t PCIe
scripts/rpc.py nvmf_subsystem_add_ns nqn.2014-08.org.nvmexpress:cache1 nvme0n1
scripts/rpc.py nvmf_subsystem_add_listener nqn.2014-08.org.nvmexpress:cache1 \
-t rdma -a 10.10.1.11 -s 4420
- u 131072:针对 4 M IOPS 调高 RDMA queue depth
- Pin 核:I/O polling 线程与 NIC RSS 队列一一对应
5.2 内核 nvmet + NVMe/TCP
modprobe nvmet nvmet-tcp
echo "nqn.2014-08.org.nvmexpress:bulk01" >\
/sys/kernel/config/nvmet/subsystems/bulk01/nqn
# 添加命名空间
echo -n /dev/nvme0n1 >/sys/kernel/config/nvmet/subsystems/bulk01/namespaces/1/device_path
echo 1 >/sys/kernel/config/nvmet/subsystems/bulk01/namespaces/1/enable
# 监听
mkdir -p /sys/kernel/config/nvmet/ports/1
echo tcp >/sys/kernel/config/nvmet/ports/1/addr_trtype
echo 0.0.0.0 >/sys/kernel/config/nvmet/ports/1/addr_traddr
echo 4420 >/sys/kernel/config/nvmet/ports/1/addr_trsvcid
ln -s /sys/kernel/config/nvmet/subsystems/bulk01 \
/sys/kernel/config/nvmet/ports/1/subsystems/bulk01
内核路径延迟 ≈ 20–30 µs 高于 SPDK,但 CPU 占用更低,适合冷数据盘。
6 Initiator 端接入与多路径
# NVMe-RDMA
nvme discover -t rdma -a 10.10.1.11 -s 4420
nvme connect-all -t rdma -n nqn.2014-08.org.nvmexpress:cache1 \
-a 10.10.1.11 -s 4420 -A 10.10.1.12
# NVMe-TCP
nvme discover -t tcp -a 10.10.2.21
nvme connect-all -t tcp -n nqn.2014-08.org.nvmexpress:bulk01 -a 10.10.2.21
启用 内核多路径:
modprobe nvme_core multipath=y
echo "options nvme_core multipath=y" > /etc/modprobe.d/nvme.conf
systemctl restart nvmefc-boot-connections
多路径策略选 round-robin,queue size=64,写带宽可抬高 12–15%。
7 Kubernetes CSI 挂载
apiVersion: storage.k8s.io/v1
kind: StorageClass
metadata:
name: nvmeof-rdma
parameters:
nvmfTransport: rdma
multipath: "true"
bdevCachePolicy: "none"
provisioner: csi.spdk.io
- csi.spdk.io 插件支持 VolumeExpansion;在线扩容 0.5 s 内完成 metadata 更新
- StatefulSet 挂载 10 × PVC 并行创建耗时 < 3 s
8 性能压测
# fio-cache.fio
[global]
ioengine=io_uring
direct=1
iodepth=128
bs=4k
readwrite=randrw
rwmixread=70
numjobs=32
time_based=1
runtime=60
group_reporting=1
[job-cache]
filename=/dev/nvme0n1
- 12 块 JBOF(SPDK)并发 ≈ 10.3 M IOPS,平均延迟 54 µs
- NVMe/TCP 冷数据盘 1.9 M IOPS,P99 0.92 ms
- 网络利用率 400 GbE 上行 85–88 %,队列深度 256 时 Little-𝑓𝑞 无明显回退
9 典型故障与排查
| 现象 | 根因 | 快速定位 | 修复 |
|---|---|---|---|
| 延迟抖动至 3 ms | PFC deadlock | show interface queue-depth |
关闭 Leaf-to-Leaf PFC |
| I/O timeout 30 s | nvme-rdma 连接掉线 | `dmesg | grep nvme` |
| CPU 100% soft-irq | IRQ 绑核遗漏 | tuna -t |
irqbalance --ban 0-3 |
10 监控与容量规划
- nvme_exporter → Prometheus:
- nvme_latency_usec_bucket{quantile=”0.9999″}
- nvme_pending_cmds 触发阈值 8 k
- SPDK JSON-RPC → telegraf input exec
- Grafana 自定义 Flame graph 检查 I/O 路径延迟分布
容量脚本:每天 02:00 spdk/scripts/rpc.py bdev_get_bdevs 报表 → Slack
11 安全隔离与多租户 QoS
| 层 | 技术 | 作用 |
|---|---|---|
| L2 | VLAN + VXLAN | 软隔离租户 Broadcast |
| L3 | Calico eBPF | 隔离子网 + ACL |
| SmartNIC | NVMeoF vDPA | 每租户 VF 独立 SQ/CQ |
| Target | SPDK QoS | --rw_rate_limiter 2000000 限 2 M IOPS |
- 三年折旧后 单 IOPS 成本 0.002 HKD vs. 传统 AFA FC 0.006 HKD
- 机柜功耗下降 22 %(无 FC 交换机 + PCIe Switch SR-IOV 节能)
- 业务上线周期缩短 6 周;新租户开盘只需绑定 VLAN 和 CSI 即可
13 经验技巧汇总
- 先做微型 PoC 用两台服务器 + 一台 Switch 跑到 3 M IOPS,验证 DCB 配置没毛病再大规模扩。
- 混合协议是王道 SPDK RDMA 解决极致延迟,NVMe/TCP 撑容量,成本与性能双赢。
- 多路径别偷懒 跨 Leaf–Spine 任何单链路断电实测 8 s 内完全恢复;关闭 ANA 会带来雪崩。
- 监控比理论更诚实 每周把 P99.999 延迟和 ECN 标记率放到绩效面板,运维心更踏实。
- 香港机房特殊 电费贵+机柜寸土寸金,横向扩展选 2U JBOF 密度最高,40 °C 环境要留 20% 风冷余量。
下一步 我准备把 BlueField-3 & NDR 800 GbE 引进测试,让单节点 IOPS 再翻一倍,并探索 NVMe-ZNS + SPDK Zoned API 把顺序写效率推到极限。到时候再来更新战报。
从零开始到跑通超过 10 M IOPS / 3 PB,NVMe-oF 给了我一条无需巨额 FC 投入、又能媲美本地盘延迟的进化路径。希望这份笔记能帮你在香港服务器机架间同样构建出亚毫秒级的高并发存储网络。如果过程中遇到新坑,欢迎在评论区一起交流。











