如何用SLURM命令查看账户所有成员的累计资源使用情况?
按用户累计统计Slurm账户资源使用的解决方法
方法1:用sreport直接生成汇总报告(推荐)
sreport是Slurm官方提供的资源汇总工具,专门用来生成累计统计数据,比sacct更高效。执行以下命令就能得到目标账户下所有用户的累计资源使用:
sreport cluster UserUtilizationByAccount -t Hours -A <allocation_name> --allusers format=User,TotalCPU,MaxRSS,Elapsed
参数说明:
UserUtilizationByAccount:指定按账户维度下的用户做资源汇总-t Hours:将时间单位统一为小时(可替换为Minutes/Seconds调整精度)-A <allocation_name>:锁定你要统计的目标账户--allusers:包含该账户下所有用户的数据format:自定义输出字段,这里匹配了你需要的用户、累计CPU时间、最大内存占用、累计运行时长。如果需要累计内存使用,可把MaxRSS换成TotalMem
方法2:用sacct+awk手动汇总
如果你的环境没法用sreport,可以用sacct导出原始数据后,用awk做累计计算:
sacct -A <allocation_name> --allusers --noheader --parsable2 format=User,CPUTime,MaxRSS,Elapsed | grep -v -E '(batch|extern)' | awk -F'|' ' function convert_time(t) { split(t, parts, /[-:]/) days = length(parts)>=4 ? parts[1] : 0 h = length(parts)>=3 ? parts[length(parts)-2] : 0 m = length(parts)>=2 ? parts[length(parts)-1] : 0 s = parts[length(parts)] return days*86400 + h*3600 + m*60 + s } function format_time(sec) { days=int(sec/86400); sec%=86400 h=int(sec/3600); sec%=3600 m=int(sec/60); s=sec%60 return days>0 ? sprintf("%d-%02d:%02d:%02d", days, h, m, s) : (h>0 ? sprintf("%02d:%02d:%02d", h, m, s) : sprintf("%02d:%02d", m, s)) } { user=$1 total_cpu[user] += convert_time($2) curr_rss=$3+0 if (curr_rss > max_rss[user]) max_rss[user] = curr_rss total_elapsed[user] += convert_time($4) } END { printf "%-15s %-12s %-10s %-15s\n", "User", "TotalCPUTime", "MaxRSS", "TotalElapsed" for (u in total_cpu) { printf "%-15s %-12s %-10d %-15s\n", u, format_time(total_cpu[u]), max_rss[u], format_time(total_elapsed[u]) } } '
说明:
--noheader去掉表头,--parsable2用竖线分隔字段,方便awk处理grep -v -E '(batch|extern)'过滤掉作业的子任务行,避免重复统计同一作业的资源awk里的两个函数负责时间格式转换,把Slurm的时间转成秒数累计后再转回去,同时按用户统计最大内存占用
内容的提问来源于stack exchange,提问作者Eslam Hussein
相关产品推荐
相关产品推荐

