4、NVMe over RDMA 部署环境准备:硬件选型、操作系统配置与驱动验证
各位同学,大家好。这一章我们聊聊部署前的准备工作。说白了,NVMe over RDMA 能不能跑得稳,一半看硬件选型,一半看驱动配置。我在项目里见过不少翻车案例,都是因为前期准备没做到位。今天我把这些经验掰开揉碎了讲给你听。
4.1 硬件选型:网卡、交换机、服务器
硬件选型这块,我个人的习惯是「先定协议,再定设备」。NVMe over RDMA 目前主流是 RoCE v2 和 InfiniBand 两条路。你想想看,如果选错了网卡,后面性能调优会非常痛苦。
4.1.1 网卡选型
网卡是整个链路的核心。我建议重点关注以下几点:
- 支持 RDMA 协议:必须明确支持 RoCE v2 或 InfiniBand。普通以太网卡不行。
- 带宽与端口:至少 25GbE 起步,推荐 100GbE。端口数根据拓扑决定。
- 厂商选择:Mellanox(现 NVIDIA)是主流,Intel 也有支持 RoCE 的卡。我个人更倾向 Mellanox,驱动生态成熟。
- 固件版本:新卡到手第一件事,升级固件。我曾经遇到过老固件导致连接数受限的坑。
重要提醒:不要只看标称带宽。实际吞吐受 PCIe 通道数、NUMA 亲和性影响很大。建议用双端口 100GbE 卡,插在 CPU 直连的 PCIe 插槽上。
4.1.2 交换机选型
交换机这块,很多人容易忽略。RoCE v2 需要交换机支持 PFC(优先级流控制)和 ECN(显式拥塞通知)。没有这些,丢包率一高,性能直接腰斩。
| 特性 | 要求 | 说明 |
|---|---|---|
| PFC | 必须支持 | 防止 RoCE 流量丢包 |
| ECN | 强烈建议 | 降低延迟抖动 |
| 缓冲区 | 越大越好 | 至少 8MB 以上 |
| 端口速率 | 与网卡匹配 | 25/100/200GbE |
嗯,这里要注意。如果你用 InfiniBand,交换机必须选对应的 IB 交换机,不能混用。RoCE v2 的好处是可以用标准以太网交换机,但配置 PFC 和 ECN 需要额外花心思。
4.1.3 服务器选型
服务器选型,核心看 CPU 和内存带宽。NVMe over RDMA 是 IO 密集型,CPU 要够快,内存通道要够多。
- CPU:建议 Intel Xeon 或 AMD EPYC,核心数 16 以上。我测试过,AMD EPYC 的 PCIe 通道数更多,适合多卡场景。
- 内存:至少 64GB,推荐 128GB 以上。RDMA 注册内存需要预留空间。
- PCIe 插槽:必须 CPU 直连,不要走 PCH。否则延迟会高 1-2 微秒。
- NVMe 盘:建议用企业级 SSD,比如 Intel P5800X 或 Samsung PM9A3。消费级盘扛不住持续写入。
个人经验:我在一个项目中用了消费级 SSD,跑了 3 天就出现 IO 延迟抖动。换成企业级盘后,问题消失。别在这上面省钱。
4.2 操作系统配置
操作系统我推荐 CentOS 7.9 或 Rocky Linux 8.x。Ubuntu 20.04 也可以,但内核需要手动升级。我个人习惯用 Rocky Linux,稳定且兼容性好。
4.2.1 内核参数调优
操作系统配置的核心是内核参数。以下是我常用的配置:
# 调整内存注册限制
echo "options mlx4_core log_num_mtt=30 log_mtts_per_seg=4" >> /etc/modprobe.d/mlx4.conf
# 调整网络缓冲区
sysctl -w net.core.rmem_max=134217728
sysctl -w net.core.wmem_max=134217728
# 调整 RDMA 相关参数
sysctl -w net.ipv4.tcp_rmem="4096 87380 134217728"
sysctl -w net.ipv4.tcp_wmem="4096 65536 134217728"
# 关闭大页透明合并
echo never > /sys/kernel/mm/transparent_hugepage/enabled
为什么会这样配置?内存注册限制是为了让 RDMA 能注册更大的内存区域。网络缓冲区调大是为了应对突发流量。透明大页合并必须关,否则会导致内存分配延迟。
4.2.2 NUMA 绑定
NUMA 绑定是性能关键。我建议把网卡和 NVMe 盘绑定到同一个 NUMA 节点上。怎么查?用 lstopo 命令看拓扑。
# 查看 NUMA 拓扑
lstopo --of png > topology.png
# 绑定网卡中断到指定 CPU
echo "00000001" > /proc/irq/xxx/smp_affinity
警告:如果不做 NUMA 绑定,跨节点访问会导致延迟增加 30% 以上。我曾经踩过这个坑,排查了整整两天才发现是 NUMA 问题。
4.3 RDMA 驱动安装与验证
驱动安装是最后一步,也是最容易出问题的一步。我建议用官方驱动,不要用系统自带的。
4.3.1 驱动安装步骤
以 Mellanox ConnectX-5 为例:
- 下载驱动:从 NVIDIA 官网下载 MLNX_OFED 驱动包。
- 安装依赖:
yum install -y gcc kernel-devel - 运行安装脚本:
./mlnxofedinstall --force - 重启网络服务:
/etc/init.d/openibd restart - 验证驱动:
ibstat查看状态
# 安装示例
./mlnxofedinstall --force --without-fw-update
/etc/init.d/openibd restart
ibstat
# 输出示例
CA 'mlx5_0'
CA type: MT4123
Number of ports: 1
Firmware version: 16.32.1010
Node GUID: 0x248a070300a1b2c3
System image GUID: 0x248a070300a1b2c3
Port 1:
State: Active
Physical state: LinkUp
Rate: 100 Gb/sec (4X EDR)
4.3.2 驱动验证
驱动装好后,必须做功能验证。我一般用以下工具:
- ibping:测试 RDMA 连通性
- ib_write_bw:测试写带宽
- ib_read_lat:测试读延迟
# 服务端
ib_write_bw -d mlx5_0 -p 18515
# 客户端
ib_write_bw -d mlx5_0 -p 18515 192.168.1.100
# 输出示例
# 带宽:98.5 Gb/sec
# 延迟:1.2 us
关键指标:带宽应达到线速的 95% 以上,延迟在 1-2 微秒。如果带宽低于 80%,检查 PFC 配置或 PCIe 链路。
4.3.3 常见问题排查
驱动安装后,如果 ibstat 显示 State: Down,别慌。先检查物理连接,再检查固件版本。我曾经遇到过固件不匹配导致端口起不来的情况,升级固件后解决。
避坑指南:我曾经在 CentOS 7.6 上装 MLNX_OFED 4.9,结果内核模块编译失败。后来换成 5.0 版本就好了。建议用最新 LTS 版本。
4.4 本章知识体系
下面这张图总结了本章的核心逻辑。你可以看到,硬件选型是基础,操作系统配置是桥梁,驱动安装是最后一步。每一步都环环相扣。
好了,这一章的内容就到这里。硬件选型、操作系统配置、驱动安装,这三步走完,你的环境就准备好了。下一章我们开始实战部署,到时候会用到今天配置的所有东西。