如何从SLURM获取详细的作业运行信息(例如,类似于LSF生成的“标准输出”)?

16

当使用 LSF 的 bsub 命令时,-o 选项会提供许多详细信息,例如作业的开始和结束时间以及作业所使用的内存和 CPU 时间。但是,在使用 SLURM 时,我只能获得与没有使用 LSF 运行脚本时相同的标准输出。

例如,假设有以下 Perl 6 脚本:

warn  "standard error stream";
say  "standard output stream";

如此提交:

sbatch -o test.o%j -e test.e%j -J test_warn --wrap 'perl6 test.p6'

导致文件 test.o34380 生成:

Testing standard output

和文件test.e34380

Testing standard Error  in block <unit> at test.p6:2
使用 LSF,我可以在标准输出文件中获取各种细节,类似于:
Sender: LSF System <lsfadmin@my_node>
Subject: Job 347511: <test> Done

Job <test> was submitted from host <my_cluster> by user <username> in cluster <my_cluster_act>.
Job was executed on host(s) <my_node>, in queue <normal>, as user <username> in cluster <my_cluster_act>.
</home/username> was used as the home directory.
</path/to/working/directory> was used as the working directory.
Started at Mon Mar 16 13:10:23 2015
Results reported at Mon Mar 16 13:10:29 2015

Your job looked like:

------------------------------------------------------------
# LSBATCH: User input
perl6 test.p6

------------------------------------------------------------

Successfully completed.

Resource usage summary:

    CPU time   :    0.19 sec.
    Max Memory :    0.10 MB
    Max Swap   :    0.10 MB

    Max Processes  :         2
    Max Threads    :         3

The output (if any) follows:

standard output stream

PS:

Read file <test.e_347511> for stderr output of this job.

更新:

sbatch命令中的一个或多个-v标志可以提供更多初步信息,但不会更改标准输出。

更新2:

使用seff JOBID获取所需信息(其中JOBID是实际编号)。请注意,它每分钟收集一次数据,因此即使您的作业由于使用超过请求的4GB内存而被终止,它可能仍然显示您的最大内存使用量为2.2GB。


假设您的SLURM版本足够新,只需使用seff即可。 - Christopher Bottoms
2个回答

15

更新的答案:

在我最初的回答之后,一个朋友向我指出了seff,这是迄今为止获取此信息的最佳方式:

seff JOBID

请注意,内存消耗并没有持续监控,所以如果您的作业因为使用过多内存而被终止,那么即使 seff 报告较少的情况,也要知道它确实超过了您的请求。

原始答案:
对于最近的作业,请尝试

sacct -l

在输出中,查看“作业计费字段”部分的描述,了解每个约三十多列的含义。只需作业ID、最大RAM使用量、最大虚拟内存大小、开始时间、结束时间、CPU时间(以秒为单位)以及作业运行的节点列表。默认情况下,仅提供当天运行的作业信息(有关其他日期的作业信息,请参阅--starttime或--endtime选项)。
sacct --format=jobid,MaxRSS,MaxVMSize,start,end,CPUTimeRAW,NodeList

这将给你输出如下:
       JobID  MaxRSS  MaxVMSize               Start                 End CPUTimeRAW NodeList
------------ ------- ---------- ------------------- ------------------- ---------- --------
36511                           2015-04-29T11:34:37 2015-04-29T11:34:37          0  c50b-20
36511.batch     660K    181988K 2015-04-29T11:34:37 2015-04-29T11:34:37          0  c50b-20
36514                           2015-04-29T12:18:46 2015-04-29T12:18:46          0  c50b-20
36514.batch     656K    181988K 2015-04-29T12:18:46 2015-04-29T12:18:46          0  c50b-20

使用--state COMPLETED来检查先前完成的作业。当检查状态不是RUNNING时,您必须提供开始时间或结束时间。
sacct --starttime 08/01/15 --state COMPLETED --format=jobid,MaxRSS,MaxVMSize,start,end,CPUTImeRaw,NodeList,ReqCPUS,ReqMem,Elapsed,Timelimit

你还可以使用scontrol获取有关工作目录的信息。
scontrol show job 36514

这将给你输出结果,例如:
JobId=36537 JobName=sbatch
UserId=username(123456) GroupId=my_group(678)
......
WorkDir=/path/to/work/dir

然而,默认情况下,scontrol只能在作业完成后的大约五分钟内访问该信息,之后它将从内存中清除。

1
请注意,如果在slurm.conf中配置了JobMinAge参数(默认为300秒),则scontrol提供的信息将消失。请查看elasticsearch插件https://github.com/asanchez1987/jobcomp-elasticsearch(尚未在稳定版本的slurm中提供,但已合并到主分支中),该插件存储了scontrol提供的几乎所有信息以及一些sacct除性能数据外的信息。使用此插件将允许查询过去作业的工作目录以及作业脚本。 - Carles Fenoy
1
@CarlesFenoy 谢谢!我更新了我的答案,以表明捕获该信息的机会可能是多么短暂。 - Christopher Bottoms
1
你可以“始终”使用sacct,因为它查询会计数据库,而scontrol查询slurmctld内存。 - Carles Fenoy
@CarlesFenoy 我猜您指的是“一直”指的是直到特定作业ID被回收(在达到 MaxJobId 后,下一个作业ID将从 FirstJobId 开始重新启动)? - Christopher Bottoms
1
会计系统可以存储具有相同工作ID的多个工作。这些工作可以从数据库中清除(定期或手动),但它们不会自动清除。 - Carles Fenoy

7

在每个作业结束时,我通常会插入以下代码:

sstat -j $SLURM_JOB_ID.batch --format=JobID,MaxVMSize

以将RAM使用情况添加到标准输出中。


2
作业 ID 后面的 .batch 代表什么?我还注意到有时会出现 .extern,你知道那是什么吗? - colelemonz
1
@colelemonz 请查看 https://dev59.com/H1QK5IYBdhLWcg3wHcSi#63470885 - Christopher Bottoms

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接