You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 10:20:32