InfiniBand (IB) 与 UCX 知识汇总
整理自有道云笔记,结合专业知识补充完善。
目录
- [InfiniBand 基础概念](#InfiniBand 基础概念)
- [UCX (Unified Communication X) 框架](#UCX (Unified Communication X) 框架)
- [UCX 传输层 (Transport Layer)](#UCX 传输层 (Transport Layer))
- [UCX 关键环境变量](#UCX 关键环境变量)
- [MPI 与 IB/UCX 的集成](#MPI 与 IB/UCX 的集成)
- [SLURM + PMIx 配置 IB/UCX](#SLURM + PMIx 配置 IB/UCX)
- [IB 网卡管理与维护](#IB 网卡管理与维护)
- [RDMA 连通性测试](#RDMA 连通性测试)
- [IB 性能测试工具](#IB 性能测试工具)
- [IB 性能调优](#IB 性能调优)
- [RoCE 网络](#RoCE 网络)
- IPoIB (IP over InfiniBand)
- [NUMA 绑定与进程亲和性](#NUMA 绑定与进程亲和性)
- 常见问题排查
1. InfiniBand 基础概念
1.1 什么是 InfiniBand
InfiniBand (IB) 是一种高性能、低延迟的串行通信标准,广泛用于 HPC(高性能计算)和 AI 训练集群。它提供了:
- 高带宽:HDR(200 Gbps)、NDR(400 Gbps)、XDR(800 Gbps)
- 低延迟:亚微秒级端到端延迟
- RDMA 支持:远程直接内存访问,零拷贝传输
- 硬件卸载:协议处理由 HCA(Host Channel Adapter)完成,减少 CPU 开销
发展历程与行业背景:
InfiniBand 技术起源于 1999 年由 Compaq、Intel、Microsoft 等公司发起的 InfiniBand Trade Association (IBTA)。最初目标是替代 PCI 总线,后来演变为高性能互连标准。关键里程碑:
| 时间 | 里程碑 |
|---|---|
| 2001 | IBTA 发布 1.0 规范,SDR 10 Gbps |
| 2003 | Top500 榜单首次出现 IB 互联的超级计算机 |
| 2005 | Mellanox 推出首个商用 InfiniHost HCA |
| 2010 | QDR (40 Gbps) 成为 HPC 主流 |
| 2014 | FDR (56 Gbps) 广泛部署 |
| 2016 | EDR (100 Gbps) 进入市场 |
| 2019 | HDR (200 Gbps) 随 DGX-2 等 AI 系统普及 |
| 2021 | NDR (400 Gbps) 发布,NVIDIA 收购 Mellanox 后加速整合 |
| 2024 | XDR (800 Gbps) 规格确定,面向下一代 AI 集群 |
为什么 IB 在 AI 时代重新崛起:
随着大模型训练对通信带宽的需求呈指数级增长,InfiniBand 凭借其原生 RDMA 支持、亚微秒级延迟和硬件级拥塞控制,成为 AI 训练集群的首选互联方案。NVIDIA DGX SuperPOD、Microsoft Azure ND 系列等顶级 AI 基础设施均采用 IB 作为骨干网络。据 Top500 统计,2024 年 11 月榜单中超过 50% 的超级计算机使用 InfiniBand 互联,在百亿亿次(Exascale)系统中占比更高。
1.2 IB 网络拓扑
| 组件 | 说明 |
|---|---|
| HCA (Host Channel Adapter) | IB 网卡,安装在计算节点上 |
| Switch | IB 交换机,常见厂商 Mellanox/NVIDIA |
| SM (Subnet Manager) | 子网管理器,负责 LID 分配和路由表 |
| Cable | 铜缆(短距离)或光缆(长距离),如 QSFP56/QSFP-DD |
1.3 IB 速率演进
| 速率等级 | 单端口带宽 | 信号编码 |
|---|---|---|
| SDR | 10 Gbps | 8B/10B |
| DDR | 20 Gbps | 8B/10B |
| QDR | 40 Gbps | 8B/10B |
| FDR | 56 Gbps | 64B/66B |
| EDR | 100 Gbps | 64B/66B |
| HDR | 200 Gbps | PAM4 |
| NDR | 400 Gbps | PAM4 |
| XDR | 800 Gbps | PAM4 |
1.4 IB 协议栈
┌─────────────────────────────────┐
│ 应用层 (MPI/NCCL) │
├─────────────────────────────────┤
│ UCP (UCX Protocol) │ ← 高级通信协议
├─────────────────────────────────┤
│ UCT (UCX Transport) │ ← 传输层抽象
├──────────────┬──────────────────┤
│ RC/UD/DC │ TCP/SHM/... │ ← 传输层实现
├──────────────┴──────────────────┤
│ Verbs API (libibverbs) │ ← 内核/用户态接口
├─────────────────────────────────┤
│ HCA Hardware (mlx5) │ ← 网卡硬件
└─────────────────────────────────┘
2. UCX (Unified Communication X) 框架
2.1 什么是 UCX
UCX 是一个开源的通信框架,由 Mellanox(现 NVIDIA)主导开发,旨在为 HPC、AI、存储等场景提供统一的高性能通信接口。
- GitHub: https://github.com/openucx/ucx
- 官网: https://openucx.org
2.2 UCX 架构
UCX 分为三层:
| 层次 | 全称 | 功能 |
|---|---|---|
| UCS | Unified Communication Services | 基础服务层(内存管理、线程池、数据结构) |
| UCT | Unified Communication Transport | 传输层抽象,屏蔽底层网络差异 |
| UCP | Unified Communication Protocol | 高层通信协议(tag match、RMA、AM、stream) |
2.3 UCX 通信模型
应用层 (MPI / NCCL / UCC)
│
▼
UCP ──── 高级 API:ucp_tag_send, ucp_rma_put, ucp_am_send
│
▼
UCT ──── 传输抽象:uct_ep_put, uct_ep_am_short, uct_ep_get
│
┌────┴────┬────────┬────────┐
▼ ▼ ▼ ▼
RC UD DC TCP/SHM/...
(可靠连接) (无连接) (动态连接) (TCP/共享内存)
2.4 UCX 安装与编译
bash
# 从源码编译
git clone https://github.com/openucx/ucx.git
cd ucx
./autogen.sh
./configure --prefix=/opt/ucx \
--with-cuda=/usr/local/cuda \
--with-verbs \
--with-rdmacm \
--enable-mt
make -j$(nproc)
make install
# 验证安装
ucx_info -v
3. UCX 传输层 (Transport Layer)
3.1 传输层对照表
| 传输层 | 全称 | 特点 | 适用场景 | UCX 实现 |
|---|---|---|---|---|
| rc | Reliable Connection | 面向连接、可靠传输、基于 RDMA CM | 需要高可靠性和数据完整性的大消息传输 | rc_verbs / rc_mlx5 |
| ud | Unreliable Datagram | 无连接、不可靠、基于 Datagram | 对可靠性要求不高,追求低延迟和高吞吐(如控制消息、小消息广播) | ud_verbs / ud_mlx5 |
| dc | Dynamic Connection | 动态连接管理,按需建立/断开连接 | 大规模集群(数千节点),减少连接数开销 | dc_mlx5 |
| tcp | TCP | 基于 TCP/IP 的传输 | IB/RoCE 不可用时的回退方案 | tcp |
| sm/shm | Shared Memory | 同节点进程间共享内存通信 | 同一物理节点内的 MPI 进程通信 | posix / sysv / xpmem / knem / cma |
| self | Self | 同进程内通信 | 同一进程内的线程通信 | self |
3.2 传输层选择建议
bash
# 推荐:IB 网络下最常用的组合
export UCX_TLS=self,sm,rc
# self: 同进程通信
# sm: 同节点共享内存
# rc: 跨节点 RDMA 可靠连接
# 大规模集群(>1000 节点)推荐
export UCX_TLS=self,sm,dc
# dc 可以减少连接数,避免 QP 资源耗尽
# 混合模式(兼容 RoCE 和 IB)
export UCX_TLS=self,sm,rc,ud
# 强制仅使用 IB
export UCX_TLS=ib
3.3 rc vs dc vs ud 对比
| 特性 | rc (Reliable Connection) | dc (Dynamic Connection) | ud (Unreliable Datagram) |
|---|---|---|---|
| 连接方式 | 静态预建立 | 按需动态建立 | 无连接 |
| 可靠性 | 保证有序可靠交付 | 保证有序可靠交付 | 不保证交付 |
| QP 资源消耗 | 高(每对一QP) | 低(共享 QP) | 低(单个 QP) |
| 延迟 | 低 | 略高(需建连) | 最低 |
| 可扩展性 | 差(N² QP) | 好 | 好 |
| 消息大小限制 | 无 | 无 | 受 MTU 限制 |
| 典型使用 | 默认首选 | 大规模集群 | 控制消息/心跳 |
4. UCX 关键环境变量
4.1 传输层控制
| 变量 | 说明 | 示例 |
|---|---|---|
UCX_TLS |
指定使用的传输层 | export UCX_TLS=self,sm,rc |
UCX_NET_DEVICES |
指定使用的网络设备 | export UCX_NET_DEVICES=mlx5_0:1,mlx5_2:1 |
UCX_IB_GID_INDEX |
指定 IB GID 索引(RoCE v2 通常设为 3) | export UCX_IB_GID_INDEX=3 |
UCX_IB_SL |
指定 Service Level(0-15) | export UCX_IB_SL=0 |
UCX_IB_TC |
指定 Traffic Class | export UCX_IB_TC=8 |
4.2 性能调优参数
| 变量 | 说明 | 推荐值 |
|---|---|---|
UCX_IB_INLINE |
内联发送的小消息大小(字节) | 8 (HDR) / 16 (NDR) |
UCX_IB_RC_FC_ENABLE |
启用流控 | y(默认开启) |
UCX_IB_RETRY_COUNT |
重试次数 | 13(默认) |
UCX_IB_TIMEOUT |
超时值(log2) | 20(约 4 秒) |
UCX_IB_ROCE_DSCP |
RoCE DSCP 优先级 | 46 (EF) |
UCX_MAX_EAGER_LANES |
多轨道急切发送 | 2(多 HCA 时) |
UCX_MAX_RNDV_LANES |
多轨道 Rendezvous | 2(多 HCA 时) |
UCX_RNDV_THRESH |
切换 eager/rendezvous 的阈值 | 8192(默认) |
4.3 调试参数
bash
# 启用 UCX 日志
export UCX_LOG_LEVEL=debug # 可选: trace, debug, info, warn, error
export UCX_LOG_LEVEL=data # 数据层面日志
export UCX_LOG_FILE=/tmp/ucx_%p.log # 日志文件(%p = PID)
# 启用 IB 统计
export UCX_IB_STATS=1
# 打印 UCX 配置
ucx_info -c
5. MPI 与 IB/UCX 的集成
5.1 HPC-X MPI(Mellanox 优化版)
bash
# 基础使用:指定 IB 设备和传输层
mpirun -np 128 --hostfile xaa --allow-run-as-root \
-x UCX_NET_DEVICES=mlx5_0:1 \
-x UCX_TLS=ib \
hostname
# 查看 IB 网卡挂载的 NUMA 节点
hwloc-ls
# 绑定 NUMA 节点运行
mpirun -np 2 --allow-run-as-root \
-H compute3:1,compute4:1 \
numactl --cpunodebind=2 --membind=2 ./osu_bibw
mpirun -np 4 --allow-run-as-root \
--hostfile nodelist \
numactl --cpunodebind=2 --membind=2 ./osu_alltoall
hostfile 示例:
compute1:1
compute2:1
compute3:1
compute4:1
5.2 Intel MPI
bash
# 使用 OFI 传输 + UCX
mpirun -np 64 \
-genv I_MPI_FABRICS ofi \
-genv UCX_TLS rc \
-machinefile xaf \
hostname
# Intel MPI 绑定核心
mpirun -np 16 -host node1 numactl -N 0,1 ./program : \
-np 16 -host node2 numactl -N 0,1 ./program : \
-np 16 -host node3 numactl -N 0,1 ./program : \
-np 16 -host node4 numactl -N 0,1 ./program
5.3 mpirun 进程绑定
bash
# 关键参数说明
--map-by ppr:18:node # 每个节点启动 18 个进程
--map-by socket:pe=4 # 每个 socket 分配 4 个核心
--report-bindings # 打印进程绑定的详细信息
--bind-to core # 绑定到核心(默认)
--bind-to numa # 绑定到 NUMA 节点
--rank-by slot # 按 slot 排序 rank
# 完整示例
mpirun -np 18 \
--map-by ppr:18:node \
--report-bindings \
/public/software/benchmarks_for_test/osu_hpcx_v2.4.0/libexec/osu-micro-benchmarks/mpi/collective/osu_alltoall \
-m 2:200000000
5.4 Intel MPI 绑核脚本(按节点名动态绑定)
bash
#!/bin/bash
# 获取当前节点名称
node=$(hostname -s)
# 根据节点名称设置 numactl 参数
if [[ $node == "node1" ]]; then
numactl -N 0,1 "$@"
elif [[ $node == "node2" ]]; then
numactl -N 0,1 "$@"
else
numactl -N 0,1 "$@"
fi
6. SLURM + PMIx 配置 IB/UCX
6.1 PMIx 直接连接配置
bash
# 启用 PMIx 直接连接(绕过 PMIx 服务器的中转)
export SLURM_PMIX_DIRECT_CONN="true"
# 指示 SLURM 组件使用直接连接的方式建立 MPI 进程之间的通信
# 启用 UCX 直接连接
export SLURM_PMIX_DIRECT_CONN_UCX="true"
# 指示 PMIx 在可能的情况下使用 UCX,走 IB 网络直接连接
# 启用早期直接连接
export SLURM_PMIX_DIRECT_CONN_EARLY="true"
# 指示 MPI 作业在启动早期就尝试建立直接连接
# 指定 UCX 传输层
export UCX_TLS=self,dc
# self: 优先同一节点内进程/线程数据传输
# dc: 直接连接或动态链接
# 指定网络设备
export UCX_NET_DEVICES=mlx5_0:1
6.2 srun 指定 IB/UCX
bash
# srun 运行 MPI 作业
srun -N 4 -n 128 \
--mpi=pmix_v3 \
-x UCX_TLS=self,sm,rc \
-x UCX_NET_DEVICES=mlx5_0:1 \
./my_mpi_program
6.3 SLURM 作业脚本示例
bash
#!/bin/bash
#SBATCH -J ib_test
#SBATCH -N 4
#SBATCH -n 128
#SBATCH --gres=gpu:8
#SBATCH -p compute
# IB/UCX 环境变量
export UCX_TLS=self,sm,rc
export UCX_NET_DEVICES=mlx5_0:1,mlx5_2:1
export UCX_IB_GID_INDEX=3
# PMIx 直接连接
export SLURM_PMIX_DIRECT_CONN="true"
export SLURM_PMIX_DIRECT_CONN_UCX="true"
# 运行
srun --mpi=pmix_v3 ./my_application
7. IB 网卡管理与维护
7.1 IB 服务管理
bash
# 启动/重启 IB 驱动
/etc/init.d/openibd restart
# 或
systemctl restart openibd
# 检查子网管理器状态
systemctl status opensm
# 查看 IB 设备列表
ibstat
ibv_devices
ibv_devinfo
7.2 查看 IB 网口信息
bash
# 查看 IB 网口与以太网口的映射关系
ibdev2netdev
# 输出示例:mlx5_0 port 1 ==> enp193s0f0np0 (Up)
# 查看 IB 设备详细信息
ibstat mlx5_0
# 查看端口状态、速率、LID、GID 等
# 查看 IB 端口 GID 表
show_gids
# 或
ibv_devinfo -d mlx5_0 -v | grep GID
7.3 刷写 IB 固件
bash
# 使用 flint 工具刷固件
flint -d mlx5_0 -y -i /root/firmware.bin b
# 查看当前固件版本
flint -d mlx5_0 q
# 刷写完成后重置 IB 卡
mlxfwreset -d mlx5_0 -y reset
7.4 IB 网卡配置
bash
# 关闭 IB 网卡宽松排序(提升小消息性能)
mlxconfig -d mlx5_0 -y s PCI_WR_ORDERING=0
# 查看所有 IB 网卡配置
mlxconfig -d mlx5_0 q
# 设置 IB 端口速率模式
mlxconfig -d mlx5_0 -y s LINK_TYPE_P1=1 # 1=IB, 2=ETH
# 重启后生效
mlxfwreset -d mlx5_0 -y reset
7.5 强制关机(紧急情况)
bash
# 紧急强制重启(慎用!)
echo b > /proc/sysrq-trigger
8. RDMA 连通性测试
8.1 udaddy --- 测试 RDMA 基本连通性
基于 C/S 模式,测试同一组内不同交换机下的两个 RoCE 端口 RDMA 网络互通性。
bash
# 服务端(监听)
udaddy -b 11.11.11.3
# 客户端(连接)
udaddy -s 11.11.11.3 -f 11.11.11.5
8.2 rping --- 测试跨交换机 RDMA 连通性
基于 C/S 模式,测试跨组交换机的两个 RoCE 端口网络互通性(类似 ICMP ping 的 RDMA 版本)。
bash
# 服务端
rping -s -C 10 -v -a 11.11.11.3
# 客户端
rping -c -a 11.11.11.3 -I 11.11.11.5 -C 10 -v
参数说明:
-s:服务端模式-c:客户端模式-C <count>:发送次数-v:详细输出-a <addr>:服务端地址-I <addr>:客户端源地址
8.3 ibping --- IB 层 ping
bash
# 服务端
ibping -S
# 客户端
ibping -G <dest_GID>
# 或
ibping -L <dest_LID>
9. IB 性能测试工具
9.1 ib_write_bw --- IB 带宽测试
测试多机之间网卡传输速率。
bash
# 服务端(主节点)
ib_write_bw --ib-dev=mlx5_1 --connection=RC --qp=32
# 客户端(工作节点)
ib_write_bw --ib-dev=mlx5_1 <server_ip> \
--CPU-freq \
--report_gbits \
--duration=10 \
--connection=RC \
--mtu=4096 \
--qp=32 \
--size=65536
常用参数:
| 参数 | 说明 |
|---|---|
--ib-dev=<dev> |
指定 IB 设备 |
--connection=<type> |
连接类型:RC, UC, UD, XRC, DCINI, DCT |
--qp=<num> |
QP 数量 |
--size=<bytes> |
消息大小 |
--mtu=<bytes> |
MTU 大小:256, 512, 1024, 2048, 4096 |
--duration=<sec> |
测试持续时间 |
--report_gbits |
以 Gbit/s 报告带宽 |
--CPU-freq |
打印 CPU 频率 |
其他 ib_* 测试工具:
bash
ib_write_lat # 写延迟测试
ib_read_bw # 读带宽测试
ib_read_lat # 读延迟测试
ib_send_bw # 发送带宽测试
ib_send_lat # 发送延迟测试
ib_atomic_bw # 原子操作带宽测试
ib_atomic_lat # 原子操作延迟测试
9.2 ucx_perftest --- UCX 层性能测试
bash
# 单节点启动服务端
ucx_perftest -t tag_bw -d mlx5_0
# 另一节点启动客户端连接
ucx_perftest -t tag_bw -d mlx5_0 <server_ip>
| 选项 | 说明 |
|---|---|
-t <test> |
测试类型:tag_bw, tag_lat, ucp_am_bw, ucp_am_lat, uct_am_short, allreduce 等 |
-s <size> |
消息大小(字节) |
-n <iterations> |
迭代次数 |
-D <duration> |
测试持续时间(秒) |
-x <warmup> |
预热次数(默认 10) |
-b <buffer> |
缓冲区大小(字节) |
-d <device> |
网络设备(如 mlx5_0:1) |
-c <mode> |
通信模式(active / passive) |
-T <threads> |
线程数 |
9.3 OSU Micro-Benchmarks
bash
# 点对点带宽
mpirun -np 2 --hostfile hosts numactl --cpunodebind=2 --membind=2 ./osu_bw
# 点对点延迟
mpirun -np 2 --hostfile hosts numactl --cpunodebind=2 --membind=2 ./osu_latency
# 双向带宽
mpirun -np 2 --hostfile hosts numactl --cpunodebind=2 --membind=2 ./osu_bibw
# 集合通信
mpirun -np 128 --hostfile hosts ./osu_alltoall
mpirun -np 128 --hostfile hosts ./osu_allreduce
9.4 mlnx_perf --- Mellanox 性能监控
bash
# 查看 IB 网口流量
mlnx_perf -i enp193s0f0np0 | grep -i rdma
# 查看 IB 端口统计
mlnx_perf -i ib1
# 查看所有端口
mlnx_perf -a
10. IB 性能调优
10.1 系统级调优
bash
# 关闭 CPU 节能模式
echo performance > /sys/devices/system/cpu/cpu*/cpufreq/scaling_governor
# 关闭中断均衡
systemctl stop irqbalance
# 设置 hugepage(大页内存)
echo 32768 > /proc/sys/vm/nr_hugepages
mount -t hugetlbfs hugetlbfs /dev/hugepages
# 关闭 IOMMU(测试环境)
# 在 /etc/default/grub 中添加 intel_iommu=off
# 关闭 SELinux
setenforce 0
# 关闭防火墙
systemctl stop firewalld
systemctl disable firewalld
10.2 IB 网络调优
bash
# 启用 Adaptive Routing(自适应路由)
mlxconfig -d mlx5_0 -y s ADAPTIVE_ROUTING=1
# 设置拥塞控制算法(DCQCN)
# 在交换机端口和 HCA 上都需要配置
cma_roce_mode -d mlx5_0 -m 2 # RoCE v2
# 调整 QP 超时
export UCX_IB_TIMEOUT=22
# 调整重试次数
export UCX_IB_RETRY_COUNT=7
# 启用 GPUDirect RDMA(GPU 集群)
export UCX_IB_GPU_DIRECT_RDMA=y
10.3 多轨道 IB(多 HCA)
bash
# 使用多个 IB 设备
export UCX_NET_DEVICES=mlx5_0:1,mlx5_2:1
export UCX_IB_PCI_BW=mlx5_0:100Gbs,mlx5_2:100Gbs
# 多轨道传输
export UCX_MAX_EAGER_LANES=2
export UCX_MAX_RNDV_LANES=2
10.4 NUMA 感知调优
bash
# 查看 NUMA 拓扑
numactl -H
hwloc-ls
lstopo
# 查看 IB 网卡的 NUMA 节点
cat /sys/class/infiniband/mlx5_0/device/numa_node
# 绑定到 IB 网卡所在的 NUMA 节点
numactl -N <numa_node> -m <numa_node> ./my_program
11. RoCE 网络
11.1 什么是 RoCE
RoCE (RDMA over Converged Ethernet) 是在以太网上运行 RDMA 的协议:
| 版本 | 说明 | 特点 |
|---|---|---|
| RoCE v1 | 基于以太网二层 | 不可路由,限同一 VLAN |
| RoCE v2 | 基于 UDP/IP | 可路由,跨子网,主流方案 |
11.2 RoCE 与 InfiniBand 对比
| 特性 | InfiniBand | RoCE v2 |
|---|---|---|
| 网络类型 | IB 专用网络 | 以太网 |
| 协议栈 | IB 协议 | UDP/IP + RDMA |
| 交换机组网 | IB 交换机 | 以太网交换机(需 PFC/ECN) |
| 可扩展性 | 强(SM 管理) | 中等 |
| 成本 | 高(专用硬件) | 较低(复用以太网) |
| GID_INDEX | 不适用 | 需要配置(通常为 3) |
11.3 RoCE 配置要点
bash
# 设置 RoCE 模式为 v2
cma_roce_mode -d mlx5_0 -m 2
# 配置 GID INDEX
export UCX_IB_GID_INDEX=3
# 配置 DSCP 优先级(DCQCN 拥塞控制)
export UCX_IB_ROCE_DSCP=46
export UCX_IB_TC=8
# 交换机端需要配置
# 1. PFC (Priority Flow Control) - 无损以太网
# 2. ECN (Explicit Congestion Notification) - 拥塞通知
# 3. DCQCN - 数据中心量化拥塞通知
11.4 RoCE 连通性检查
bash
# 检查 RDMA 设备
ibv_devices
ibv_devinfo
# 检查 RoCE 模式
cma_roce_mode -d mlx5_0
# 检查 GID 表
show_gids
# RoCE v2 的 GID 格式类似 IPv4 地址
# 测试 RDMA 连通
udaddy -b <local_ip> # 服务端
udaddy -s <server_ip> -f <local_ip> # 客户端
rping -s -C 10 -v -a <local_ip> # 服务端
rping -c -a <server_ip> -I <local_ip> -C 10 -v # 客户端
12. IPoIB (IP over InfiniBand)
12.1 什么是 IPoIB
IPoIB 是在 InfiniBand 网络上封装 IP 数据包的协议,让传统的 TCP/IP 应用可以直接在 IB 网络上运行。
优点:
- 兼容性好,无需修改应用
- 部署简单
缺点:
- 性能远低于 RDMA(有内核协议栈开销)
- 延迟高(需要经过 Linux 网络栈)
12.2 IPoIB 模式
| 模式 | 说明 | 性能 |
|---|---|---|
| datagram | 无连接,每个包独立处理 | 较低延迟,适合小消息 |
| connected | 面向连接,建立可靠通道 | 较高带宽,适合大消息 |
bash
# 切换 IPoIB 模式
echo datagram > /sys/class/net/ib0/mode
# 或
echo connected > /sys/class/net/ib0/mode
# 查看当前模式
cat /sys/class/net/ib0/mode
# 配置 IPoIB 接口
ip addr add 192.168.1.100/24 dev ib0
ip link set ib0 up
12.3 RDMA vs IPoIB 性能对比
| 场景 | RDMA (原生) | IPoIB |
|---|---|---|
| 延迟 | ~1 μs | ~10-30 μs |
| 带宽 | 接近线速 | 约为线速的 50-70% |
| CPU 占用 | 极低(硬件卸载) | 较高(内核栈处理) |
| 适用场景 | MPI、NCCL、存储 | SSH、NFS、管理网络 |
13. NUMA 绑定与进程亲和性
13.1 为什么 NUMA 绑定重要
在多路服务器上,CPU 和内存分为多个 NUMA 节点。如果 MPI 进程运行在离 IB 网卡较远的 NUMA 节点上,数据需要经过 QPI/UPI 互联总线,增加延迟。
13.2 NUMA 拓扑查看
bash
# 查看 NUMA 拓扑
numactl -H
# 输出示例:
# available: 4 nodes (0-3)
# node 0 cpus: 0 1 2 ... 23
# node 0 size: 192000 MB
# node distances:
# node 0 1 2 3
# 0: 10 21 31 31
# 1: 21 10 31 31
# 查看 IB 网卡挂载位置
cat /sys/class/infiniband/mlx5_0/device/numa_node
# 图形化查看
hwloc-ls
lstopo
13.3 绑定策略
bash
# 方式一:numactl 绑定
numactl --cpunodebind=2 --membind=2 ./my_program
# 方式二:taskset 绑定到特定核心
taskset -c 48-71 ./my_program
# 方式三:mpirun 绑定
mpirun -np 24 --map-by numa --report-bindings ./my_program
# 方式四:按节点脚本绑定
#!/bin/bash
node=$(hostname -s)
if [[ $node == "node1" ]]; then
numactl -N 0,1 "$@"
elif [[ $node == "node2" ]]; then
numactl -N 0,1 "$@"
fi
14. 常见问题排查
14.1 IB 端口状态异常
bash
# 检查端口状态
ibstat mlx5_0
# 正常状态:State: Active, Physical state: LinkUp
# 如果端口 Down
/etc/init.d/openibd restart
systemctl restart opensm
# 检查线缆
ibdiagnet # Mellanox 网络诊断工具
14.2 UCX 传输层选择失败
bash
# 查看 UCX 可用传输层
ucx_info -d
# 查看 UCX 选择的传输层
export UCX_LOG_LEVEL=info
# 运行程序后查看日志
# 强制指定传输层
export UCX_TLS=self,sm,rc
14.3 MPI 进程无法建立连接
bash
# 检查防火墙
systemctl status firewalld
iptables -L
# 检查 SSH 免密
ssh compute2 hostname
# 检查 hostfile
cat hostfile
# 使用 verbose 模式
mpirun -np 2 --hostfile hosts -x UCX_LOG_LEVEL=debug ./program
14.4 带宽不达标
排查清单:
- 确认 IB 速率协商正确:
ibstat检查 rate - 确认 NUMA 绑定:进程要跑在 IB 网卡所在 NUMA 节点
- 确认 MTU:
ib_write_bw --mtu=4096 - 检查交换机端口速率
- 检查线缆质量
- 关闭节能模式
- 使用
ib_write_bw/ucx_perftest隔离网络层问题
14.5 常用诊断命令速查
| 命令 | 用途 |
|---|---|
ibstat |
IB 端口状态 |
ibv_devices |
IB 设备列表 |
ibv_devinfo |
IB 设备详细信息 |
ibdev2netdev |
IB 到以太网映射 |
show_gids |
GID 表 |
hwloc-ls / lstopo |
NUMA 拓扑 |
numactl -H |
NUMA 节点信息 |
mlnx_perf |
Mellanox 性能计数器 |
ucx_info -v |
UCX 版本和配置 |
ucx_info -d |
UCX 可用传输层 |
flint |
IB 固件管理 |
mlxconfig |
IB 网卡配置 |
mlxfwreset |
IB 网卡重置 |
ibdiagnet |
网络诊断 |
cma_roce_mode |
RoCE 模式设置 |