Cof*_*erd 5 memory cpu resource-monitor slurm
我正在使用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
Run Code Online (Sandbox Code Playgroud)
但是,我不太相信这种解决方案:
sstat 不幸的是没有显示当前使用了多少cpus(仅平均)
如果我尝试记录一段时间内的内存使用情况,MaxRSS也无济于事
似乎仍然有一些错误(作业完成后脚本不会停止)
有谁知道如何正确地做到这一点?甚至有top或htop代替sstat?任何帮助深表感谢。
Slurm 提供了一个插件,用于将作业的配置文件(PCU 使用情况、内存使用情况,甚至某些技术的磁盘/网络 IO)记录到 HDF5 文件中。该文件包含跟踪的每个度量的时间序列,您可以选择时间分辨率。
您可以使用以下命令激活它
#SBATCH --profile=<all|none|[energy[,|task[,|filesystem[,|network]]]]>
Run Code Online (Sandbox Code Playgroud)
请参阅此处的文档。
要检查该插件是否已安装,请运行
scontrol show config | grep AcctGatherProfileType
Run Code Online (Sandbox Code Playgroud)
它应该输出AcctGatherProfileType = acct_gather_profile/hdf5.
ProfileHDF5Dir这些文件是在Slurm 配置参数(在slurm.conf)中引用的文件夹中创建的
至于您的脚本,您可以尝试替换sstat为与计算节点的 SSH 连接以运行ps。假设安装了pdsh或clush,您可以运行如下命令:
pdsh -j $SLURM_JOB_ID ps -u $USER -o pid,state,cputime,%cpu,rssize,command --columns 100 >> usage.txt
Run Code Online (Sandbox Code Playgroud)
这将为您提供每个进程的 CPU 和内存使用情况。
最后一点,您的作业永远不会终止,因为它会在while循环终止时终止,而while循环也会在作业终止时终止..."$JobStatus" == "COMPLETED" 从脚本中永远不会观察到该条件。作业完成后,脚本将被终止。