RDMA 独占模式下,每个 Pod 独占分配的物理 RDMA 网卡,互不干扰,并支持 NUMA 亲和调度。本文介绍如何开启独占模式并使用 RDMA 资源。
适用范围
已创建ACK托管集群Pro版,并添加灵骏节点。请参见创建和管理灵骏节点池。
已安装RDMA Device Plugin组件版本v1.1.5及以上。请参见RDMA。
组件版本兼容性:社区版
nvidia-device-pluginv0.19.0 - v0.19.2 默认启用MOFED_ENABLED并配置NVIDIA_MOFED环境变量。该变量会导致nvidia-container-toolkit向所有 GPU Pod 全量注入/dev/infiniband设备,与 RDMA 独占模式冲突,无法实现网卡隔离。ack-nvidia-device-pluginv0.7.0(基于社区版 v0.19.1)受此影响。使用独占模式前请升级至 v0.8.0 版本,且勿手动设置NVIDIA_MOFED=true环境变量。
步骤一:开启独占模式
通过节点池添加标签
登录容器服务管理控制台,在左侧导航栏选择集群列表。
在集群列表页面,单击目标集群名称,然后在左侧导航栏,选择。
找到灵骏节点所在的节点池,编辑节点池配置,添加节点标签:
rdma.network.alibabacloud.com/exclusive = true,并勾选同步更新存量节点的污点(Taints)及节点标签(Labels)。保存后,节点池内的节点会自动添加标签。
对于现存节点,手动重启节点上的RDMA Device Plugin Pod使其重新加载标签:
kubectl delete pod -n kube-system -l app=ack-rdma-device-plugin --field-selector spec.nodeName=<node-name>
验证独占模式
检查节点RDMA资源数量(独占模式显示真实设备数,不再显示1k):
kubectl describe node <node-name> | grep rdma/hca预期输出(以4张RDMA网卡的节点为例):
rdma/hca: 4查看Device Plugin日志确认进入独占模式:
kubectl logs -n kube-system -l app=ack-rdma-device-plugin --tail=20预期输出:
node <node-name> has exclusive label, enabling exclusive mode
hca-exclusive mode
discovered RDMA device: mlx5_bond_0 (PCI=0000:7f:00.0, NUMA=0, uverbs=uverbs0, pcieRoot=pci0000:7b)
discovered RDMA device: mlx5_bond_1 (PCI=0000:c7:00.0, NUMA=0, uverbs=uverbs1, pcieRoot=pci0000:c3)
discovered RDMA device: mlx5_bond_2 (PCI=0001:08:00.0, NUMA=1, uverbs=uverbs2, pcieRoot=pci0001:05)
discovered RDMA device: mlx5_bond_3 (PCI=0001:a2:00.0, NUMA=1, uverbs=uverbs3, pcieRoot=pci0001:9f)
Registered device plugin with Kubelet步骤二:配置NUMA亲和(可选)
独占模式下,RDMA Device Plugin 在注册设备时携带 NUMA 节点信息,kubelet 的 Topology Manager 可据此实现 CPU 与 RDMA 设备的 NUMA 亲和调度。
配置方法:在节点池的 Kubelet 自定义参数中设置 cpuManagerPolicy 与 topologyManagerPolicy,推荐配置如下。
参数 | 可选值 | 说明 |
cpuManagerPolicy |
|
|
topologyManagerPolicy |
| 控制资源NUMA对齐策略 |
推荐使用 static + best-effort,在不影响调度的前提下尽量实现 NUMA 亲和,使 GPU 和 RDMA 分配在同一个 NUMA 下。更多参数说明请参见自定义节点池kubelet配置。
步骤三:使用RDMA资源
独占模式下使用rdma/hca资源,与共享模式YAML格式相同。kubelet会从可用的RDMA设备中分配指定数量的物理网卡给该Pod。
apiVersion: batch/v1
kind: Job
metadata:
name: rdma-exclusive-test
spec:
parallelism: 1
template:
spec:
tolerations:
- operator: Exists
containers:
- name: rdma-test
image: "<image>"
command:
- sh
- -c
- |
python /workspace/benchmark.py
resources:
limits:
nvidia.com/gpu: 8
rdma/hca: 2
workingDir: /root
volumeMounts:
- name: shm
mountPath: /dev/shm
securityContext:
capabilities:
add:
- SYS_RESOURCE
- IPC_LOCK
restartPolicy: Never
volumes:
- name: shm
emptyDir:
medium: Memory
sizeLimit: 8Gi关键配置说明:
配置项 | 说明 |
| 申请2个独占RDMA设备,kubelet分配2张物理网卡给该Pod |
| 申请GPU资源(按需调整) |
| 共享内存卷,用于多进程共享数据 |
| RDMA应用所需的Linux capabilities |
切回共享模式
通过节点池移除标签
rdma.network.alibabacloud.com/exclusive。重启Device Plugin Pod:
kubectl delete pod -n kube-system -l app=ack-rdma-device-plugin --field-selector spec.nodeName=<node-name>重启后,
rdma/hca资源恢复为1k(共享模式)。重要切换模式前,请确保该节点上没有正在使用
rdma/hca资源的Pod,否则已有Pod的设备分配会失效。
相关文档
如需使用共享模式,请参见使用RDMA共享模式。