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)。
使用¶
强制多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
尽量调度在同一个个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核。
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也被使用。
限制¶
NUMA调度只限于单一主机运行的作业。跨机的作业由于跨机运行中的任务分发也可能通过ssh而无法控制第1台主机外任务的CPU使用。建议使用像OpenMPI这样的框架,由框架来处理任务NUMA节点的分配和使用。
基于以上的原则,作业定义了-R numa[cpu=force]会自动强制在同一台主机运行,即资源请求自动增加span[hosts=1]。如果集群中没有合适的主机,作业会等待。
作业定义了-R numa[cpu=prefer]的任务如果单台主机不能运行,会分配多台主机(跨机)。
numa[]与指定跨机每台主机的任务数(span[ptile=n])不能同时使用。