一、Ceph RDMA 配置:从网卡到 Ceph 的全链路打通
RDMA 在 Ceph 中的核心价值是让数据绕开 CPU 和内核协议栈,直接从网卡 DMA 到内存。但要真正跑起来,需要从硬件、驱动、系统到 Ceph 配置层层打通。
1.1 硬件选型
网卡 :推荐使用 Mellanox ConnectX-5 及以上 (如 ConnectX-6 Dx)的 RDMA 网卡。100台 GPU 节点的规模下,建议后端存储网络采用 25Gbps 以上的 RoCE(RDMA over Converged Ethernet)或 InfiniBand 网络。
交换机 :若采用 RoCEv2,交换机必须支持无损以太网------即启用 PFC(优先级流控制)和 ECN(显式拥塞通知)。RoCE 对丢包极其敏感,一个丢包就可能导致整个 RDMA 连接性能崩溃。
1.2 驱动与系统配置
安装 Mellanox OFED 驱动(以 Ubuntu 为例):
bash
# 下载并安装 MLNX_OFED
wget https://www.mellanox.com/downloads/ofed/MLNX_OFED-5.9-0.5.6.0/MLNX_OFED_LINUX-5.9-0.5.6.0-ubuntu20.04-x86_64.tgz
tar -xzf MLNX_OFED_LINUX-5.9-0.5.6.0-ubuntu20.04-x86_64.tgz
cd MLNX_OFED_LINUX-5.9-0.5.6.0-ubuntu20.04-x86_64
sudo ./mlnxofedinstall --auto-add-kernel-support --without-fw-update --force
# 重启驱动
sudo /etc/init.d/openibd restart
# 安装用户态工具
sudo apt install infiniband-diags ibutils ibverbs-utils rdma-core
验证 RDMA 设备:
bash
ibv_devinfo
# 应显示端口状态为 PORT_ACTIVE
配置 IPoIB 接口(如使用 InfiniBand):
bash
# /etc/network/interfaces
auto ib0
iface ib0 inet static
address 172.16.1.10/24
mtu 65520
解锁内存锁定限制------RDMA 需要将内存页锁定在物理内存中:
bash
# /etc/security/limits.conf
root soft memlock unlimited
root hard memlock unlimited
ceph soft memlock unlimited
ceph hard memlock unlimited
systemd 服务配置(ceph-osd@.service 等):
ini
LimitMEMLOCK=infinity
LimitCORE=infinity
PrivateDevices=no
1.3 Ceph 配置文件核心参数
Ceph 通过 Async Messenger 支持 RDMA 传输。ms_type=async+rdma 是开启 RDMA 的核心开关。
基础配置 (/etc/ceph/ceph.conf):
ini
[global]
# 前端网络(客户端访问)保持 TCP
ms_public_type = async+posix
# 后端集群网络(OSD 间复制、心跳)启用 RDMA
ms_cluster_type = async+rdma
# RDMA 设备名称
ms_async_rdma_device_name = mlx5_0
# 轮询间隔(微秒),0 表示使用中断模式
ms_async_rdma_polling_us = 0
# RoCE 版本:1 为 RoCEv1,2 为 RoCEv2
ms_async_rdma_roce_ver = 2
# GID 索引(需根据实际查询)
ms_async_rdma_gid_idx = 3
关键参数详解:
| 参数 | 含义 | 推荐值 |
|---|---|---|
ms_public_type |
前端网络传输类型 | async+posix(TCP) |
ms_cluster_type |
后端集群网络传输类型 | async+rdma(RDMA) |
ms_async_rdma_device_name |
RDMA 设备名 | ib0 或 mlx5_0 |
ms_async_rdma_roce_ver |
RoCE 版本 | 2(RoCEv2 更通用) |
ms_async_rdma_gid_idx |
GID 索引 | 通过 show_gids 查询 |
ms_async_rdma_local_gid |
本地 GID(可选) | 可通过脚本自动注入 |
获取 GID 的自动化方式:
bash
# 在 ansible 或部署脚本中
GID=$(cat /sys/class/infiniband/mlx5_0/ports/1/gids/3)
sed -i "s/GIDGOESHERE/$GID/g" /etc/ceph/ceph.conf
UCX 方案(部分场景可选):
ini
ms_type = async+ucx
ms_public_type = async+ucx
ms_cluster_type = async+ucx
ms_async_ucx_device = mlx5_0:1,mlx5_1:1
注意 :
async+rdma和async+ucx是两种不同的 RDMA 传输实现。前者是 Ceph 原生 RDMA 支持,后者基于 UCX 框架。原生async+rdma在生产环境中更常见。
1.4 验证 RDMA 是否生效
方法一:检查 Ceph 日志
bash
grep -i rdma /var/log/ceph/ceph-osd.*.log
# 应看到 RDMA 连接建立的相关日志
方法二:监控 RDMA 流量
使用 netdata 或 ibmonitor 监控 RDMA 网卡流量:
bash
ibmonitor
# 观察 RDMA 读写计数器是否增长
方法三:性能压测
对比 RDMA 开启前后的 Ceph 集群性能:
bash
rados bench -p test_pool 60 write -t 16
rados bench -p test_pool 60 seq -t 16
二、GPUDirect 支持:让数据直达 GPU 显存
GPUDirect 在 Ceph 中的支持目前沿着两条技术路线演进。
2.1 GPUDirect Storage(GDS)
GPUDirect Storage(GDS) 是 NVIDIA 提供的官方技术,允许 GPU 直接从存储设备(包括通过网络挂载的存储)读取数据,绕过 CPU 内存,实现真正的"零拷贝"。
技术原理 :GDS 通过 cuFile API 实现 GPU 内存与存储之间的直接 DMA 传输。数据路径为:NVMe SSD / NVMe-oF 存储 → 网卡 → PCIe Switch → GPU 显存,全程无需 CPU 介入。
Ceph 集成 GDS 的路径:
目前 Ceph 对 GDS 的官方支持主要通过 NFS-Ganesha 网关实现------CephFS 命名空间通过 NFS-Ganesha 导出为 NFS 协议,而 NFS 客户端侧可通过 GDS 驱动实现 GPU 到 NFS 存储的直接数据通路。
Ceph 社区正在推进更原生的集成。NVIDIA 的官方文档描述了"S3 网关指示特定数据节点通过 RDMA(RDMA_WRITE)直接将数据推送到客户端 GPU 或系统内存"的参考架构。
2.2 S3-over-RDMA + GPUDirect(社区前沿)
这是 Ceph 社区最值得关注的前沿进展。Ceph PR #71209 提出了一种S3-over-RDMA 方案,数据直接从 OSD 通过 RDMA 写入客户端内存------包括通过 GPUDirect 写入 GPU 内存。
核心机制:
- RGW(RADOS Gateway)将客户端的 RDMA token 转发给 OSD
- OSD 构建感知对象的放置计划
- OSD 通过 RDMA_WRITE 将数据直接推送到客户端注册的内存窗口
- 若客户端注册的是 GPU 内存,数据通过 GPUDirect 直接落入 GPU 显存
与传统架构的对比:
| 维度 | 传统 RGW 网关模式 | S3-over-RDMA 直接模式 |
|---|---|---|
| 数据路径 | OSD → RGW 内存 → 客户端 | OSD → RDMA → 客户端 GPU/系统内存 |
| 网络跳数 | 2 跳 | 1 跳 |
| 网关负担 | 全量数据经过网关 | 网关仅处理控制面 |
| 聚合带宽 | 受网关数量限制 | 随 OSD 数量线性扩展 |
| 延迟 | 高(多次拷贝) | 低(零拷贝直通) |
该方案还支持纠删码(EC)直读------每个分片 OSD 将其约 16KB 的块通过 RDMA 直接散布到客户端缓冲区的逻辑位置,客户端侧的重新组装工作"消失在了网卡的地址运算中"。
当前状态 :该 PR 为 Draft 状态,尚未合入主干。对于生产环境,建议通过 NFS-Ganesha + GDS 的成熟路径实现 GPUDirect 支持,同时持续关注社区进展。

三、效果呈现:RDMA + GPUDirect 能带来什么

3.1 实测性能数据
| 指标 | TCP/IP 基线 | RDMA 优化后 | 提升幅度 |
|---|---|---|---|
| 集群恢复速度 | 基准 | --- | 提升 3 倍 |
| CPU 占用率 | 100% | --- | 降低 70%(智能网卡协同) |
| 数据恢复速度 | 基准 | --- | 提升 4.84 倍(异构计算加速) |
| IOPS | 基准 | --- | 裸金属较虚拟化 提升 25%-40% |
3.2 对 AI 训练场景的具体价值
-
Checkpoint 读写加速:大模型训练中频繁读写 Checkpoint(动辄数十 GB),RDMA + GPUDirect 可将 Checkpoint 的保存和加载时间从分钟级降至秒级
-
数据加载流水线优化:训练数据从 Ceph 直接流入 GPU 显存,CPU 从数据搬运中解放出来,专注于数据预处理和模型计算
-
多任务混合部署:RDMA 的低延迟特性让 Ceph 能够同时支撑在线推理(低延迟要求)和离线训练(高吞吐要求)
四、生产环境部署 Checklist
| 阶段 | 检查项 | 验证方法 |
|---|---|---|
| 硬件 | RDMA 网卡(ConnectX-5+)、无损交换机 | ibv_devinfo 显示 PORT_ACTIVE |
| 驱动 | MLNX_OFED 安装、openibd 服务运行 | /etc/init.d/openibd status |
| 系统 | ulimit -l 无限制、systemd LimitMEMLOCK=infinity |
`ulimit -a |
| 网络 | IPoIB 接口配置、MTU 正确(65520 或 9000) | iperf3 测试带宽接近线速 |
| Ceph | ms_cluster_type=async+rdma、GID 配置正确 |
日志中无 RDMA 连接错误 |
| 监控 | netdata/ibmonitor 部署 | 确认 RDMA 计数器有流量 |
| GDS | NVIDIA GDS 驱动、NFS-Ganesha 配置 | cuFile API 调用成功 |
关键提醒 :RDMA 配置中最常见的坑是 GID 配置错误 ------不同网卡、不同 RoCE 版本对应的 GID 索引不同。务必通过
show_gids确认正确索引后配置ms_async_rdma_gid_idx。另外,RBD(块设备)目前对 RDMA 的支持有限,建议将 CephFS(文件存储)和 RGW(对象存储) 作为 RDMA 优化的首要目标。