NUMA亲和性
默认情况下,每个容器对主机的CPU周期的访问不受限制。大多数用户使用并配置默认CFS调度器。在服务器上运行多个容器,由于每个容器的业务不同,为了避免相邻容器的资源抢占,我们可以通过CPU绑核和配置NUMA亲和性来使容器在某种特定场景下性能最优。
CPU 1:1绑核,内存访问同die
绑核时可以按P绑核、按NUMA绑核,这里需要注意避免Docker容器内存访问跨die和跨片(内存访问不要跨die和跨片,避免性能下降)。默认情况下,不同容器的vCPU可能运行在相同物理CPU核上,会造成CPU资源竞争,也会导致VMID频繁切换造成L1 TLB频繁flush,从而推高TLB miss rate,最终造成性能下降。
- 查询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和跨片,避免性能下降。
- 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命令的详细使用指导请参见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”。
1
|
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命令详细使用指导请参见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。