什么是 QoS,为什么要指定
和分区不同,QoS 表示服务质量,它更多刻画了作业的属性而非节点的属性。不同任务
的特性不同,指定 QoS 可以使得资源更好分配。例如,用户若只是想简单调试自己的
程序,而非大规模地运行,那么这样的作业的特点是“短时间”,“用户对结果的需求
很迫切”。为这样的作业设计 QoS 是非常有必要的。
目前我们设计了两种 QoS,用户可根据需求自行选择。若不加指定,normal 为所有用户
的默认 QoS。
QoS 名称
最大运行时间
最大作业数
最大提交数
normal
每个用户 144 CPU 核心,2 块 GPU 卡
debug
每个用户 48 CPU 核心,1 块 GPU 卡
注意:QoS 和 Partition 同时指定最大运行时间时,以二者限制最严格的为准。例如,
使用 debug QoS 并提交到 cpu 分区中,则最长运行时间为 3 小时。使用 normal QoS
并提交到 cpu 分区中,则最长运行时间为 7 天。
可以看到 debug 的 QoS 优先级高,但对每个用户的可用资源也相应变少。
SLURM 提供了丰富的追踪任务的命令,例如
scontrol
,
sacct
等。这些
命令有助于查看正在运行或已完成的任务状态。当用户认为任务异常时,可使用这些
工具来追踪任务的信息。
对于正在运行或排队的任务,可以使用
$ scontrol show job JOBID
其中 JOBID 是正在运行的作业 ID,如果忘记 ID 可以使用
squeue -u USERNAME
来
查看目前处于运行中的作业。
[liuhy@admin playground]$ squeue
JOBID PARTITION NAME USER ST TIME NODES NODELIST(REASON)
140 cpu test liuhy R 0:01 1 comput1
[liuhy@admin playground]$ scontrol show job 140
JobId=140 JobName=test
UserId=liuhy(502) GroupId=users(100) MCS_label=N/A
Priority=283 Nice=0 Account=root QOS=normal
... (more information) ...
scontrol
命令输出的信息非常多,在这里不一一列举。
作业完成后,需要用
sacct
命令来查看历史作业。默认情况下,用户仅能查看属于
自己的历史作业。直接使用
sacct
命令会输出从当天 00:00:00 起到现在的全部作业
[liuhy@admin playground]$ sacct
JobID JobName Partition Account AllocCPUS State ExitCode
------------ ---------- ---------- ---------- ---------- ---------- --------
104 bash gpu root 1 COMPLETED 0:0
104.extern extern root 1 COMPLETED 0:0
105 bash cpu root 1 COMPLETED 0:0
105.extern extern root 1 COMPLETED 0:0
108 bash cpu root 48 COMPLETED 0:0
108.extern extern root 48 COMPLETED 0:0
126 bash cpu root 4 COMPLETED 0:0
126.extern extern root 4 COMPLETED 0:0
140 test cpu root 12 COMPLETED 0:0
140.batch batch root 12 COMPLETED 0:0
140.extern extern root 12 COMPLETED 0:0
141 test cpu root 12 CANCELLED+ 0:0
141.batch batch root 12 CANCELLED 0:15
141.extern extern root 12 COMPLETED 0:0
142 lllll cpu root 1 FAILED 2:0
142.extern extern root 1 COMPLETED 0:0
142.0 lllll root 1 FAILED 2:0
$ sacct -S MMDD
则会输出从 MM 月 DD 日起的所有历史作业。
默认情况会输出作业 ID,作业名,分区,账户,分配的 CPU,任务结束状态,返回码。
当然我们还可以使用
--format
参数来指定到底要输出那些指标。
[liuhy@admin playground]$ sacct --format=jobid,user,alloccpu,allocgres,state%15,exitcode
JobID User AllocCPUS AllocGRES State ExitCode
------------ --------- ---------- ------------ --------------- --------
104 liuhy 1 gpu:1 COMPLETED 0:0
104.extern 1 gpu:1 COMPLETED 0:0
105 liuhy 1 COMPLETED 0:0
105.extern 1 COMPLETED 0:0
108 liuhy 48 COMPLETED 0:0
108.extern 48 COMPLETED 0:0
126 liuhy 4 COMPLETED 0:0
126.extern 4 COMPLETED 0:0
140 liuhy 12 COMPLETED 0:0
140.batch 12 COMPLETED 0:0
140.extern 12 COMPLETED 0:0
141 liuhy 12 CANCELLED by 0 0:0
141.batch 12 CANCELLED 0:15
141.extern 12 COMPLETED 0:0
142 liuhy 1 FAILED 2:0
142.extern 1 COMPLETED 0:0
142.0 1 FAILED 2:0
在这里我们详细显示了作业 ID,用户,申请的 CPU,申请的 GPU,任务结束状态,
返回码,其中我们比较感兴趣的是任务结束状态。在这里我们看到,JOBID 为 141 的
作业的状态是 CANCELLED by 0,这里 0 表示系统的 root 用户。这条信息表示:我们
的任务被集群的超级管理员强制取消了!这就需要询问管理员具体的原因了。另外,
JOBID 为 142 作业的状态是 FAILED,它的含义是我们的作业脚本中有命令异常退出,
这时候就需要检查我们的 SLURM 脚本的命令部分或者是查看运行环境了。
有时我们很早就提交了任务,但是在任务开始前却发现作业的属性写错了(例如提交错
了分区,忘记申请 GPU 个数),取消了重新排队似乎很不划算。如果作业恰好没在运行
我们是可以通过
scontrol
命令来修改作业的属性。
使用以下命令可以修改 JOBID 任务的部分属性
scontrol update jobid=JOBID ...
由于可修改的属性非常多,我们可以借助 SLURM 自动补全功能来查看可修改的内容。
这只需要我们在输入完 JOBID 后空一格并敲两下
<TAB>
键。
[liuhy@admin ~]$ scontrol update jobid=938 <TAB><TAB>
account=<account> mintmpdisknode=<megabytes> reqnodelist=<nodes>
conn-type=<type> name> reqsockets=<count>
contiguous=<yes|no> name=<name> reqthreads=<count>
dependency=<dependency_list> nice[=delta] requeue=<0|1>
eligibletime=yyyy-mm-dd nodelist=<nodes> reservationname=<name>
excnodelist=<nodes> numcpus=<min_count[-max_count] rotate=<yes|no>
features=<features> numnodes=<min_count[-max_count]> shared=<yes|no>
geometry=<geo> numtasks=<count> starttime=yyyy-mm-dd
gres=<list> or switches=<count>[@<max-time-to-wait>]
licenses=<name> partition=<name> timelimit=[d-]h:m:s
mincpusnode=<count> priority=<number> userid=<UID
minmemorycpu=<megabytes> qos=<name> wckey=<key>
minmemorynode=<megabytes> reqcores=<count>
例如我要更改当前的分区到 gpu,并且申请 1 块卡,可以输入
scontrol update jobid=938 partition=gpu gres=gpu:1
注意变更的时候仍然不能超过系统规定的上限。变更成功后,作业的优先级可能需要重新
当任务已经开始运行时,一般不可以再变更申请资源,分区等参数。特别地,如果发现
自己低估了任务运行时间,
用户不能使用 scontrol 命令延长任务最大时间
。但是可以
根据需求减少任务的最大时间。若确实有延长任务时间的急切需求请联系管理员。