了解一个 Slurm 作业的 CPU 时间和内存使用情况

我认为这是一个非常微不足道的问题,但不管怎样,我正在寻找(sacct,我猜测)命令,它将显示一个 slurm 作业 ID 所使用的 CPU 时间和内存。

85727 次浏览

如果您的工作已经完成,那么 sacct命令就是您要寻找的。否则,查看 sstat。对于 sacct,—— format 开关是另一个关键元素。如果运行以下命令:

sacct -e

您将获得可用于—— format 开关的不同字段的打印输出。每个字段的详细信息在手册页的“作业帐户字段”部分中描述。对于 CPU 时间和内存,CPUTime 和 MaxRSS 可能就是您要寻找的。Cputimeraw 也可以用于如果你想要的数字在秒,而不是通常的 Slurm 时间格式。

sacct --format="CPUTime,MaxRSS"

sacct确实是用于完成作业的命令。

@ aaron.kizmiller 是对的,sacct是命令使用。

可以通过将以下所有字段传递给 saact --format="field,field"来获取它们

字段 :

Account           AdminComment      AllocCPUS         AllocGRES
AllocNodes        AllocTRES         AssocID           AveCPU
AveCPUFreq        AveDiskRead       AveDiskWrite      AvePages
AveRSS            AveVMSize         BlockID           Cluster
Comment           ConsumedEnergy    ConsumedEnergyRaw CPUTime
CPUTimeRAW        DerivedExitCode   Elapsed           ElapsedRaw
Eligible          End               ExitCode          GID
Group             JobID             JobIDRaw          JobName
Layout            MaxDiskRead       MaxDiskReadNode   MaxDiskReadTask
MaxDiskWrite      MaxDiskWriteNode  MaxDiskWriteTask  MaxPages
MaxPagesNode      MaxPagesTask      MaxRSS            MaxRSSNode
MaxRSSTask        MaxVMSize         MaxVMSizeNode     MaxVMSizeTask
McsLabel          MinCPU            MinCPUNode        MinCPUTask
NCPUS             NNodes            NodeList          NTasks
Priority          Partition         QOS               QOSRAW
ReqCPUFreq        ReqCPUFreqMin     ReqCPUFreqMax     ReqCPUFreqGov
ReqCPUS           ReqGRES           ReqMem            ReqNodes
ReqTRES           Reservation       ReservationId     Reserved
ResvCPU           ResvCPURAW        Start             State
Submit            Suspended         SystemCPU         Timelimit
TotalCPU          UID               User              UserCPU
WCKey             WCKeyID           WorkDir

例如,要列出所有作业 ID、运行时间和最大 VM 大小,可以运行:

sacct --format='JobID,Elapsed,MaxVMSize'

另一个解决了 sacct输出的所有细节格式,这对于查看聚合在一个表中的多个作业非常有用。

但是,有时候您希望更详细地查看一个特定的作业,这样您就可以判断您的作业是否有效地使用了所分配的资源。因此,seff非常有用。语法很简单,就是 seff <Jobid>。例如,这是我最近的一份工作(失败了) :

$ seff 15780625


Job ID: 15780625
Cluster: mycluster
User/Group: myuser/mygroup
State: OUT_OF_MEMORY (exit code 0)
Nodes: 1
Cores per node: 16
CPU Utilized: 12:06:01
CPU Efficiency: 85.35% of 14:10:40 core-walltime
Job Wall-clock time: 00:53:10
Memory Utilized: 1.41 GB
Memory Efficiency: 70.47% of 2.00 GB

请注意,关键的 CPU 度量,CPU 利用率,对应于来自 sacct总处理器字段,而内存利用率对应于 MaxRSS

尽管已经有了很好的解决方案,我还是分享了另一个观点。

该方法可以实现对大量节点的实时监控。

我们可以编写一个脚本 monitor.sh来获取统计信息(例如内存) ,然后将其记录到文件中。

#! /bin/sh
if [ -f "./free.log_"`hostname` ];then
echo "file existed , now deleting it !"
rm ./free.log_`hostname`
fi
echo "start recording!"


while true
do
echo "******["`date +%Y-%m-%d_%H:%M:%S`"]******" >> free.log_`hostname`
free -s 1 -c 2 -h|sed -n 1,2p >> free.log_`hostname`
done

然后编写作业脚本 sbatch_input.sh,它可以通过 satch 调用。

#! /bin/sh
#SBATCH -N 2
#SBATCH -p cnall
srun hostname
srun ./monitor.sh

给剧本打电话

sbatch ./sbatch_input.sh

我们可以看到一些日志生成。

您可以导出 SACCT_FORMAT,每次只需键入 sacct

$ export SACCT_FORMAT="JobID%20,JobName,User,Partition,NodeList,Elapsed,CPUTime,State,AllocTRES%32"
$ sacct
JobID    JobName      User  Partition        NodeList    Elapsed    CPUTime      State                        AllocTRES
-------------------- ---------- --------- ---------- --------------- ---------- ---------- ---------- --------------------------------
249527_4   xgb_tune    zhaoqi         cn            cn12   00:26:50 1-11:46:40    RUNNING billing=80,cpu=80,mem=100G,node+
249527_1   xgb_tune    zhaoqi         cn            cn09   00:26:50 1-11:46:40    RUNNING billing=80,cpu=80,mem=100G,node+
249527_2   xgb_tune    zhaoqi         cn            cn10   00:26:50 1-11:46:40    RUNNING billing=80,cpu=80,mem=100G,node+
249527_3   xgb_tune    zhaoqi         cn            cn11   00:26:50 1-11:46:40    RUNNING billing=80,cpu=80,mem=100G,node+

档号: https://docs.ycrc.yale.edu/clusters-at-yale/job-scheduling/resource-usage/

sacct -a -j <job_id> --format=user%10,jobname%10,node%10,start%10,end%10,elapsed%10,MaxRS

使用命令 sacct访问完成的贫民窟作业历史

对于 <job_id>来说,它指的是 Slurm 的工作 ID 然后,这个 --format=提到不同的细节显示,以哪种格式:

  • user: 用户运行作业
  • jobname: 作业或进程名称
  • node: 这表示在哪台机器上完成了工作
  • startend依次指示作业的开始和结束日期
  • 对于 elapsed,它是关于作业或进程的运行时,
  • MaxRS的最大 CPU 用来完成工作
  • 对于 %,它用于确定打印给定信息需要专用多少字符(例如 Jobname% 25: Jobname 将以25个字符显示)