找出slurm作业的CPU时间和内存使用情况

use*_*545 33 slurm

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

小智 40

你是对的,你正在寻找sacct命令.--format开关是另一个关键元素.如果您运行此命令:

sacct -e
Run Code Online (Sandbox Code Playgroud)

您将获得可用于--format开关的不同字段的打印输出.每个字段的详细信息在手册页的"作业帐户字段"部分中进行了描述.对于CPU时间和内存,CPUTime和MaxRSS可能正是您所需要的.如果您想要以秒为单位的数字,也可以使用cputimeraw,而不是通常的Slurm时间格式.

sacct --format="CPUTime,MaxRSS"
Run Code Online (Sandbox Code Playgroud)

  • 只是为那些在这里寻找实时的人们提供的便条...使用`Elapsed`代替(+1). (7认同)
  • "CPUTime"返回的值始终是"NCPUS"*"Elapsed"的值.要获得有关实际CPU使用率的统计信息,您需要查看`SystemCPU`和`UserCPU`,但文档警告它只测量父进程的CPU时间而不是子进程的CPU时间. (5认同)
  • MaxRSS 对于运行任务似乎总是空的(至少对我而言)。是否有其他选择/其他方式来估计正在运行的任务的内存。 (4认同)
  • 是什么决定了作业是否仍显示在 sacct 中。好像没有显示旧作业的数据? (2认同)

spi*_*nup 35

另一个回答输出的所有详细格式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
Run Code Online (Sandbox Code Playgroud)

请注意,关键 CPU 指标 CPU Utilized对应于 中的TotalCPU字段sacct,而 Memory Utilized对应于MaxRSS

  • 我如何/在哪里可以安装`seff`? (7认同)
  • seff 是 slurm 托管集群的标准吗?它没有为我找到该命令。 (3认同)

dam*_*ois 16

sacct确实是用于完成工作的命令.对于正在运行的作业,您可以查看该sstat命令.

  • 实际上,您可以使用带有状态标志的`sacct`监视正在运行的作业,例如`sacct -sr` (2认同)

duh*_*ime 7

@ 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
Run Code Online (Sandbox Code Playgroud)

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

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


Shi*_*ang 6

您可以导出并每次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+ 
Run Code Online (Sandbox Code Playgroud)

参考: https: //docs.ycrc.yale.edu/clusters-at-yale/job-scheduling/resource-usage/


Xu *_*Hui 5

尽管已经存在出色的解决方案,但我有另一个观点。

这种方法可以对很多节点进行实时监控。

我们可以编写一个脚本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
Run Code Online (Sandbox Code Playgroud)

然后编写您的作业脚本sbatch_input.sh,它可以被 sbatch 调用。

#! /bin/sh
#SBATCH -N 2
#SBATCH -p cnall
srun hostname
srun ./monitor.sh
Run Code Online (Sandbox Code Playgroud)

调用脚本

sbatch ./sbatch_input.sh
Run Code Online (Sandbox Code Playgroud)

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