更新时间:2021-03-18 GMT+08:00
分享

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命令的详细使用指导请参见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个集群。

  1. 按跨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。

分享:

    相关文档

    相关产品

close