如何通过SLURM生成指定日期后按账户统计CPU、内存、磁盘使用的报告?
解决方案:用
sacct+文本工具实现按账户的多维度资源统计 我之前在管理SLURM集群时也遇到过一模一样的需求——要按账户统计指定日期后完成作业的CPU、内存和磁盘使用情况,sreport确实不够灵活,而sacct其实能输出所有需要的数据,只是需要结合一点文本处理来聚合结果。下面是我一直在用的可行方案:
第一步:用sacct提取全量原始数据
sacct支持直接输出CPU、内存、磁盘的关键指标,只要指定对应的字段和过滤条件即可。比如要统计2024年1月1日之后完成的作业,执行以下命令:
sacct --starttime=2024-01-01 --state=COMPLETED --format=Account,JobID,CPUTime,MaxRSS,MaxDiskRead,MaxDiskWrite --parsable2
参数说明:
--starttime:指定统计的起始日期,格式支持YYYY-MM-DD或YYYY-MM-DDTHH:MM:SS--state=COMPLETED:仅筛选已完成的作业,避免包含排队/运行中的任务--format:指定需要的字段:Account:作业所属账户CPUTime:作业累计使用的CPU时间MaxRSS:作业运行期间使用的最大内存(单个节点的峰值)MaxDiskRead/MaxDiskWrite:作业的磁盘读写总量(需集群开启磁盘统计)
--parsable2:用竖线|分隔字段,方便后续脚本处理
第二步:用awk按账户聚合统计
sacct的输出会包含每个作业(甚至数组作业的子任务)的单独记录,我们需要用awk按账户维度累加数据,并统一单位。把下面的命令和第一步的sacct结合,就能直接得到聚合后的报告:
sacct --starttime=2024-01-01 --state=COMPLETED --format=Account,JobID,CPUTime,MaxRSS,MaxDiskRead,MaxDiskWrite --parsable2 | awk -F'|' ' BEGIN { print "Account\tTotal_CPU_Time\tTotal_Max_RSS_GB\tTotal_Disk_Read_GB\tTotal_Disk_Write_GB" } # 跳过表头和.batch子任务(避免重复统计作业资源) $2 !~ /\.batch/ && NR > 1 { account = $1 # 转换CPU时间为秒,方便累加 split($3, time_parts, ":") cpu_sec = time_parts[1]*3600 + time_parts[2]*60 + time_parts[3] cpu_total[account] += cpu_sec # 转换MaxRSS为GB(处理K/M/G单位) if ($4 ~ /G$/) { rss_gb = substr($4, 1, length($4)-1) } else if ($4 ~ /M$/) { rss_gb = substr($4, 1, length($4)-1)/1024 } else if ($4 ~ /K$/) { rss_gb = substr($4, 1, length($4)-1)/(1024*1024) } else { rss_gb = 0 } rss_total[account] += rss_gb # 转换磁盘读写为GB(SLURM默认输出字节) disk_read_gb = $5/(1024*1024*1024) disk_write_gb = $6/(1024*1024*1024) disk_read_total[account] += disk_read_gb disk_write_total[account] += disk_write_gb } END { # 格式化输出结果,把CPU秒转回HH:MM:SS格式 for (acc in cpu_total) { cpu_h = int(cpu_total[acc]/3600) cpu_m = int((cpu_total[acc]%3600)/60) cpu_s = cpu_total[acc]%60 printf "%s\t%02d:%02d:%02d\t%.2f\t%.2f\t%.2f\n", acc, cpu_h, cpu_m, cpu_s, rss_total[acc], disk_read_total[acc], disk_write_total[acc] } }'
关键注意事项
- 磁盘统计前提:确保集群的
slurm.conf中开启了磁盘会计,需要设置AccountingStorageFlags=JobDiskUsage,否则MaxDiskRead/MaxDiskWrite字段会为空。 - 数组作业处理:如果要按数组作业整体统计而非子任务,可以在
awk中添加判断$2 !~ /\[/,只统计数组作业的主记录。 - 内存统计调整:如果需要平均内存而非峰值内存,可以把
MaxRSS换成AvgRSS字段,并调整awk中的处理逻辑。
内容的提问来源于stack exchange,提问作者jorgehumberto
相关产品推荐
相关产品推荐

