如何在 slurm 作业期间监控资源?
How to monitor resources during slurm job?
我是 运行 我们大学集群的工作(普通用户,无管理员权限),它使用 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 }')"
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 }')"
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 使用情况、内存使用情况,甚至 disk/net 某些技术的 IO)记录到 HDF5 文件中。该文件包含跟踪的每个度量的时间序列,您可以选择时间分辨率。
您可以使用
激活它
#SBATCH --profile=<all|none|[energy[,|task[,|filesystem[,|network]]]]>
请参阅文档 here。
要检查是否安装了此插件,运行
scontrol show config | grep AcctGatherProfileType
它应该输出 AcctGatherProfileType = acct_gather_profile/hdf5
.
文件在 ProfileHDF5Dir
Slurm 配置参数(在 slurm.conf
中)引用的文件夹中创建
至于您的脚本,您可以尝试将 sstat
替换为到 运行 ps
的计算节点的 SSH 连接。假设安装了 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"
永远不会从脚本中观察到。作业完成后,脚本将被终止。
我是 运行 我们大学集群的工作(普通用户,无管理员权限),它使用 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 }')"
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 }')"
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 使用情况、内存使用情况,甚至 disk/net 某些技术的 IO)记录到 HDF5 文件中。该文件包含跟踪的每个度量的时间序列,您可以选择时间分辨率。
您可以使用
激活它#SBATCH --profile=<all|none|[energy[,|task[,|filesystem[,|network]]]]>
请参阅文档 here。
要检查是否安装了此插件,运行
scontrol show config | grep AcctGatherProfileType
它应该输出 AcctGatherProfileType = acct_gather_profile/hdf5
.
文件在 ProfileHDF5Dir
Slurm 配置参数(在 slurm.conf
中)引用的文件夹中创建
至于您的脚本,您可以尝试将 sstat
替换为到 运行 ps
的计算节点的 SSH 连接。假设安装了 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"
永远不会从脚本中观察到。作业完成后,脚本将被终止。