NUMA调度

NUMA(Non-Uniform Memory Access,非一致性内存访问)是一种针对多核处理器设计的物理内存分布架构。 在这种结构下,处理器访问其专用本地内存(Local Memory)的速度比访问其他处理器管理的远程内存(Remote Memory)要快。 多GPU的主机上,GPU也是安装在不同的NUMA节点上的。

对于单节点多线程的作业,在分配CPU和GPU时,为了运行性能,有时需要所分配的CPU核以及GPU在同一个NUMA节点上。

作业在提交时,可以通过资源需求(csub -R,参考 csub)来指定作业NUMA调度的需求。

指定的资源为cpu或gpu。调度需求为偏好(prefer)或强制(force)。

使用

  1. 强制多CPU作业所分配的核在一个NUMA节点上,如果集群中找不到这样的NUMA节点,作业等待:

    csub -n 16 -R numa[cpu=force] myjob
    

    如果作业运行了,可以通过命令 cjobs -l 作业号 查询作业进程号,然后在作业运行主机上运行命令 taskset -pc 进程号 查看作业绑定的CPU核。CPU和所属的NUMA节点可以通过命令 numactl -H 或者 /opt/skyformai/sbin/cbls -t 查看。

    例如:

    查看NUMA结构:

    $ numactl -H
    available: 2 nodes (0-1)
    node 0 cpus: 0 1 2 3 4 5 6 7 8 9 10 11 24 25 26 27 28 29 30 31 32 33 34 35
    node 0 size: 64319 MB
    node 0 free: 10768 MB
    node 1 cpus: 12 13 14 15 16 17 18 19 20 21 22 23 36 37 38 39 40 41 42 43 44 45 46 47
    node 1 size: 64454 MB
    node 1 free: 132 MB
    node distances:
    node   0   1
      0:  10  21
      1:  21  10
    

    提交一个16核的作业,强制在同一NUMA节点中运行:

    $ csub -n 16 -R numa[cpu=force] sleep 1h
    Job 803 has been submitted to the default queue [medium].
    $ cjobs -l 803
    
    Job <803>, User <cadmin>, Project <default>, User Group <grp_默认组织>, Sta
                         tus <RUN>, Queue <medium>, Job Priority <50>, Command <sle
                         ep 1h>
    Fri Mar  6 22:09:36: Submitted from host <node001>, CWD <$HOME>, 16 Processors
                         Requested, Requested Resources <numa[cpu=force]>;
    Fri Mar  6 22:09:36: Started on 16 Hosts/Processors <16*node001>, Execution Hom
                         e </share/home/cadmin>, Execution CWD </share/home/cadmin>
                         ;
    Fri Mar  6 22:11:20: Total resource usage collected.
                         MEM: 1 Mbytes;  SWAP: 5 Mbytes;  NTHREAD: 1
                         PGID: 18499;  PIDs: 18499 18537 18538
    

    查看作业进程所绑定的CPU核:

    $ taskset -pc 18499
    pid 18499's current affinity list: 0-7,24-31
    
  2. 尽量调度在同一个个NUMA节点上。提交一个作业最小16个CPU,最大32个CPU,在满足这个条件的情况下,把一个作业调度在同一个NUMA节点上,如果实在满足不了,就调度成跨NUMA节点的作业:

    $ csub -n 16,32 -R numa[cpu=prefer] sleep 1h
    Job 804 has been submitted to the default queue [medium].
    $ cjobs 804
    JOBID   USER    STAT  QUEUE      FROM_HOST   EXEC_HOST   JOB_NAME   SUBMIT_TIME
    804     cadmin  RUN   medium     node001     24*node001  sleep 1h   Mar  6 22:19
    

    作业被调度到了一个NUMA节点上,这台主机的每个NUMA节点有24个CPU核。

  3. GPU与CPU核在同一个NUMA节点上:

    csub -n 24 -R rusage[gpu=1]numa[gpu=force] sleep 1h
    

    备注

    定义了numa[],作业提交时会自动加span[hosts=1],即作业只在同一台主机上。

查看主机NUMA调度情况

命令chosts -l可以显示NUMA节点的调度情况,例子:

$ chosts -l node001
HOST  node001
STATUS           CPUF  JL/U    MAX  NJOBS    RUN  SSUSP  USUSP    RSV DISPATCH_WINDOW
ok              44.00     -     48     24     24      0      0      0      -

...

NUMA  Cores    FreeCores  GPUs  FreeGPUs
----------------------------------------------------------------------
0     24       0          1     0.0
1     24       24         1     1.0

Job CPU binding is set
Member of host groups: all_hosts ubuntu_hosts dept1_dedicated opc
Member of queues: ubutun_q gpu_q cpu_q all medium

以上的例子中,主机上有2个NUMA节点,第一个节点的24个CPU核已被作业使用,NUMA节点中的GPU也被使用。

限制

  1. NUMA调度只限于单一主机运行的作业。跨机的作业由于跨机运行中的任务分发也可能通过ssh而无法控制第1台主机外任务的CPU使用。建议使用像OpenMPI这样的框架,由框架来处理任务NUMA节点的分配和使用。

  2. 基于以上的原则,作业定义了-R numa[cpu=force]会自动强制在同一台主机运行,即资源请求自动增加span[hosts=1]。如果集群中没有合适的主机,作业会等待。

  3. 作业定义了-R numa[cpu=prefer]的任务如果单台主机不能运行,会分配多台主机(跨机)。

  4. numa[]与指定跨机每台主机的任务数(span[ptile=n])不能同时使用。