---
title: NUMA亲和性
description: "默认情况下，每个容器对主机的CPU周期的访问不受限制。大多数用户使用并配置默认CFS调度器。在服务器上运行多个容器，由于每个容器的业务不同，为了避免相邻容器的资源抢占，我们可以通过CPU绑核和配置NUMA亲和性来使容器在某种特定场景下性能最优。"
url: https://www.hikunpeng.com/document/detail/zh/kunpengcpfs/ecosystemEnable/Docker/kunpengdocker_05_0006.html
sourcePath: /source/zh/kunpengcpfs/ecosystemEnable/Docker/kunpengdocker_05_0006.html
indexId: d92187259bcae813dfe07ad95297be95c714a7420528f6604f8beccd180a6c3f72
---
# NUMA亲和性

默认情况下，每个容器对主机的CPU周期的访问不受限制。大多数用户使用并配置默认CFS调度器。在服务器上运行多个容器，由于每个容器的业务不同，为了避免相邻容器的资源抢占，我们可以通过CPU绑核和配置NUMA亲和性来使容器在某种特定场景下性能最优。

#### CPU 1:1绑核，内存访问同die

绑核时可以按P绑核、按NUMA绑核，这里需要注意避免Docker容器内存访问跨die和跨片（内存访问不要跨die和跨片，避免性能下降）。默认情况下，不同容器的vCPU可能运行在相同物理CPU核上，会造成CPU资源竞争，也会导致VMID频繁切换造成L1 TLB频繁flush，从而推高TLB miss rate，最终造成性能下降。

1. 查询NUMA信息。
  1 numactl -H

  以鲲鹏920 5250处理器为例，cpu 0-23在NUMA 0节点，cpu 24-47在NUMA 1节点，cpu 48-71在NUMA 2节点，cpu 72-95在NUMA 3节点。Docker容器在绑核时，内存访问建议不要跨die和跨片，避免性能下降。

2. 1:1绑核，内存访问同NUMA。
  以鲲鹏920 5250处理器为例，创建容器，容器名称4u8g_01，然后分配4核，绑核4-7，NUMA0节点，内存8G，然后创建容器的镜像是centos:latest，挂载本地volume卷，将本机“/home”映射到容器“/home”。

  1 docker run -d -it --cpus=4 --cpuset-cpus=4-7 --cpuset-mems=0 -m 8192m --name 4u8g_01 -v /home:/home centos:latest

  docker run命令的详细使用指导请参见docker container run(https://docs.docker.com/engine/reference/commandline/run/)。 命令格式：docker run [OPTIONS] IMAGE [COMMAND] [ARG...] 命令参数说明如下： -d：表示后台运行容器，打印容器ID。 -i：即使没有attach，也保持STDIN打开。 -t：分配一个pseudo-TTY。 --cpus：分配核数。 --cpuset-cpus：指定绑核，允许执行的CPU。 --cpuset-mems：指定NUMA节点。 -m：分配内存大小。 --name：设置Docker容器名称。 -v：绑定挂载volume卷。 centos：latest为本地镜像，REPOSITORY为centos，TAG为latest。


#### 跨CPU集群绑核，内存访问同die

鲲鹏920系列处理器包含2个Super CPU Cluster（简称SCCL），每个SCCL包含6~8个CPU Cluster，每个CPU Cluster包含4个CPU Core。在Docker容器环境下对容器进行CPU绑核时，建议尽量分布到多个CPU Cluster中，可以减少同一个CPU Cluster内多个Core竞争导致L3 Cache出现内存带宽瓶颈问题，从而整体提升Docker容器性能。

Docker容器的vCPU跨CPU Cluster绑核的好处：

- 负载低的情况下可以最大的利用内存带宽。
- CPU绑核尽量分布到多个CPU Cluster上，其L3 Cache Tag上的竞争会明显减小，内存带宽和CPU计算性能可以相应提升。

如果Cluster的数量大于拟创建的容器的核数N，那么可以任意选择N个集群。


按跨CPU Cluster绑核，内存访问同NUMA。

以鲲鹏920 5250处理器为例，创建容器，容器名称8u16g_02，然后分配8核，绑核3,4,8,9,12,16,20,21，NUMA0节点，内存16G，然后创建容器的镜像是centos:latest，挂载本地volume卷，将本机“/home”映射到容器“/home”。

```
docker run -d -it --cpus=8 --cpuset-cpus=3,4,8,9,12,16,20,21 --cpuset-mems=0 -m 16384m --name 8u16g_02 -v /home:/home centos:latest
```

docker run命令详细使用指导请参见docker container run(https://docs.docker.com/engine/reference/commandline/run/)。

命令格式：docker run [OPTIONS] IMAGE [COMMAND] [ARG...]

命令参数说明：

- -d：表示后台运行容器，打印容器ID。
- -i：即使没有attach，也保持STDIN打开。
- -t：分配一个pseudo-TTY。
- --cpus：分配核数。
- --cpuset-cpus：指定绑核，允许执行的CPU。
- --cpuset-mems：指定NUMA节点。
- -m：分配内存大小。
- --name：设置Docker容器名称。
- -v：绑定挂载volume卷。
- centos：latest为本地镜像，REPOSITORY为centos，TAG为latest。
