使用RDMA独占模式

更新时间:
复制 MD 格式

RDMA 独占模式下,每个 Pod 独占分配的物理 RDMA 网卡,互不干扰,并支持 NUMA 亲和调度。本文介绍如何开启独占模式并使用 RDMA 资源。

适用范围

  • 已创建ACK托管集群Pro版,并添加灵骏节点。请参见创建和管理灵骏节点池

  • 已安装RDMA Device Plugin组件版本v1.1.5及以上。请参见RDMA

    组件版本兼容性:社区版 nvidia-device-plugin v0.19.0 - v0.19.2 默认启用 MOFED_ENABLED并配置 NVIDIA_MOFED 环境变量。该变量会导致 nvidia-container-toolkit 向所有 GPU Pod 全量注入 /dev/infiniband 设备,与 RDMA 独占模式冲突,无法实现网卡隔离。ack-nvidia-device-plugin v0.7.0(基于社区版 v0.19.1)受此影响。使用独占模式前请升级至 v0.8.0 版本,且勿手动设置 NVIDIA_MOFED=true 环境变量。

步骤一:开启独占模式

通过节点池添加标签

  1. 登录容器服务管理控制台,在左侧导航栏选择集群列表

  2. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择节点管理 > 节点池

  3. 找到灵骏节点所在的节点池,编辑节点池配置,添加节点标签:rdma.network.alibabacloud.com/exclusive = true,并勾选同步更新存量节点的污点(Taints)及节点标签(Labels)

  4. 保存后,节点池内的节点会自动添加标签。

  5. 对于现存节点,手动重启节点上的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

预期输出(以4RDMA网卡的节点为例):

  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 自定义参数中设置 cpuManagerPolicytopologyManagerPolicy,推荐配置如下。

参数

可选值

说明

cpuManagerPolicy

none(默认)/ static

static允许Guaranteed QoS Pod独占CPU

topologyManagerPolicy

none(默认)/ best-effort / restricted / single-numa-node

控制资源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

关键配置说明:

配置项

说明

rdma/hca: 2

申请2个独占RDMA设备,kubelet分配2张物理网卡给该Pod

nvidia.com/gpu: 8

申请GPU资源(按需调整)

/dev/shm

共享内存卷,用于多进程共享数据

SYS_RESOURCE / IPC_LOCK

RDMA应用所需的Linux capabilities

切回共享模式

  1. 通过节点池移除标签rdma.network.alibabacloud.com/exclusive

  2. 重启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共享模式