使用Kunpeng TAP
Kunpeng TAP允许在部署Pod时指定CPU资源需求,系统将自动按NUMA亲和性分配资源。通过编写YAML文件并指定节点选择器,可以将Pod部署到特定节点上。成功部署插件后,只需在部署其他Pod时指定CPU资源的request和limit值,系统将自动按照NUMA亲和性原则进行资源分配。
以下为部署一个单容器Pod的YAML文件示例,供用户参考。该Pod请求的CPU资源最小值为4核,最大值为8核,内存固定为4Gi,容器使用busybox作为镜像。
- 创建YAML文件,例如example.yaml,并在YAML文件中写入以下配置。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
apiVersion: v1 kind: Pod metadata: name: tap-test annotations: spec: containers: - name: tap-example image: busybox:latest imagePullPolicy: IfNotPresent command: ["/bin/sh"] args: ["-c", "while true; do echo `date`; sleep 5; done"] resources: requests: cpu: "4" memory: "4Gi" limits: cpu: "8" memory: "4Gi"
- 以指定Pod在compute01节点上运行为例,需要在YAML文件中的spec部分加入以下内容。
在多个工作节点的K8s集群中,Pod可能会被调度到不同节点的NUMA内。如果希望Pod在指定的节点上运行,只需在YAML文件的spec部分加入nodeSelector字段,并指定kubernetes.io/hostname为目标节点的名称。
1 2
nodeSelector: kubernetes.io/hostname: compute01
- 在管理节点应用YAML文件,完成Pod部署。
kubectl apply -f example.yaml
- 判断Kunpeng TAP是否生效。
- 以Docker运行时为例,进入步骤二中nodeSelector所指定的集群节点compute01后,通过docker命令查询容器的CpusetCpus参数,判断容器是否与NUMA成功亲和。
- 通过docker ps查询集群节点运行的容器任务,在NAMES列中找到步骤一中“spec.containers.name”指定的nri-1容器。
# docker ps | grep nri-1 CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
- 依据CONTAINER ID查询目标容器的部署参数CpusetCpus,该参数表示容器的可调度CPU范围。
# docker inspect bf32de0d09fe | grep "CpusetCpus" "CpusetCpus": "0-23",
如果启用了内存绑定功能,可以通过如下命令查看,注意其取值表示节点的编号:
# docker inspect bf32de0d09fe | grep "CpusetMems" "CpusetMems": "0",
在不同的机器上查看时, 绑定的NUMA节点不固定,CpusetCpus数字可能不一致。
Containerd运行时可以运行如下命令查看容器的可调度CPU范围。# crictl inspect bf32de0d09fe | grep "cpuset_cpus" "cpuset_cpus": "0-23",
如果NUMA节点亲和失败,则可能无法查找到cpuset_cpus输出。
- 查询系统的NUMA信息,与上述的容器可调度CPU范围进行对比,一致则表示亲和于对应NUMA节点。
# lscpu ... NUMA node0 CPU(s): 0-23 NUMA node1 CPU(s): 24-47 NUMA node2 CPU(s): 48-71 NUMA node3 CPU(s): 72-95 ...
“node0”表示编号为“0”的NUMA节点,“0-23”表示NUMA节点内的CPU编号。
- 此外,对于系统中GPU的NUMA分布,可以运行如下命令查看,其中“0200”为网卡设备号。
lspci -vvv -d :0200 | grep NUMA
回显如下所示:
NUMA node: 0 NUMA node: 0 NUMA node: 0 NUMA node: 0 NUMA node: 0 NUMA node: 2 NUMA node: 2 NUMA node: 2 NUMA node: 2 NUMA node: 2