我正在我们的大学集群上运行工作(普通用户,没有管理员权限),它使用SLURM调度系统,我有兴趣绘制CPU和内存使用情况,即在作业运行时.我知道sacct和sstat,我想在我的提交脚本中包含这些命令,例如一些东西
#!/bin/bash
#SBATCH <options>
# Running the actual job in background
srun my_program input.in output.out &
# While loop that records resources
JobStatus="$(sacct -j $SLURM_JOB_ID | awk 'FNR == 3 {print $6}')"
FIRST=0
#sleep time in seconds
STIME=15
while [ "$JobStatus" != "COMPLETED" ]; do
#update job status
JobStatus="$(sacct -j $SLURM_JOB_ID | awk 'FNR == 3 {print $6}')"
if [ "$JobStatus" == "RUNNING" ]; then
if [ $FIRST -eq 0 ]; then
sstat --format=AveCPU,AveRSS,MaxRSS -P -j ${SLURM_JOB_ID} >> usage.txt
FIRST=1
else
sstat --format=AveCPU,AveRSS,MaxRSS -P --noheader -j ${SLURM_JOB_ID} >> usage.txt
fi
sleep $STIME
elif [ "$JobStatus" == "PENDING" ]; then
sleep $STIME
else
sacct -j ${SLURM_JOB_ID} --format=AllocCPUS,ReqMem,MaxRSS,AveRSS,AveDiskRead,AveDiskWrite,ReqCPUS,AllocCPUs,NTasks,Elapsed,State >> usage.txt
JobStatus="COMPLETED"
break
fi
done
但是,我并不是真的相信这个解决方案:
> sstat遗憾的是没有显示使用了多少cpus
时刻(只有平均值)
>如果我尝试记录内存使用情况,MaxRSS也没有帮助
>似乎仍有一些错误(脚本在作业完成后不会停止)
有没有人知道如何正确地做到这一点?甚至可以使用top或htop代替sstat?任何帮助深表感谢.
最佳答案 Slurm提供了一个插件,用于将作业的配置文件(PCU使用情况,内存使用情况,甚至某些技术的磁盘/网络IO)记录到HDF5文件中.该文件包含每个跟踪度量的时间序列,您可以选择时间分辨率.
你可以激活它
#SBATCH --profile=<all|none|[energy[,|task[,|filesystem[,|network]]]]>
请参阅文档here.
要检查是否已安装此插件,请运行
scontrol show config | grep AcctGatherProfileType
它应该输出AcctGatherProfileType = acct_gather_profile / hdf5.
至于您的脚本,您可以尝试使用SSH连接替换sstat到计算节点以运行ps.假设安装了pdsh或clush,您可以执行以下操作:
pdsh -j $SLURM_JOB_ID ps -u $USER -o pid,state,cputime,%cpu,rssize,command --columns 100 >> usage.txt
这将为您提供每个进程的CPU和内存使用量.
作为最后一点,你的工作永远不会因为它会在while循环终止时终止而终止,而while循环将在作业终止时终止……条件“$JobStatus”==“COMPLETED”将永远不会从内部被观察到剧本.作业完成后,脚本将被终止.