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

Slurm集群用awk统计CPU内存:区分8G与8Gc的脚本问题排查

问题排查与修正方案

核心问题分析

你的脚本中第一个if语句逻辑错误,大概率是对内存规格的匹配判断不准确,导致即使没有Gc后缀的内存值也被误判进入该分支。比如误用了精确相等判断(==)而非正则匹配,或者匹配规则写得过于宽泛(比如只匹配G),都会触发这个问题。

修正后的脚本实现

结合sacct的输出特性(每个作业对应3条记录),以及内存规格的两种格式,以下是修正后的get_cpu_mem_count函数:

get_cpu_mem_count() {
    sacct -S $(date +%Y-%m-%dT00:00:00) -o State,AllocCPUs,ReqMem --noheader | awk '
        BEGIN { cpu_total=0; mem_total=0; job_count=0 }
        $1 == "RUNNING" {
            cpu_total += $2
            # 精准匹配以Gc结尾的每核内存规格
            if ($3 ~ /Gc$/) {
                # 提取数字部分,乘以核数得到总内存
                mem = substr($3, 1, length($3)-2)
                mem_total += mem * $2
            } else {
                # 提取数字部分,直接累加总内存
                mem = substr($3, 1, length($3)-1)
                mem_total += mem
            }
            job_count++
        }
        END {
            # 每个作业对应3条记录,CPU总数除以3
            cpu_total = cpu_total / 3
            printf "Total CPUs in use: %.0f\nTotal Memory in use: %.0fG\n", cpu_total, mem_total
        }
    '
}

关键修正点说明

  • 精准匹配内存格式:使用$3 ~ /Gc$/正则匹配,仅对以Gc结尾的内存值执行核数乘法计算,避免误触发分支。
  • 内存值提取逻辑:通过substr函数去除后缀,分别处理两种内存规格:
    • 带Gc后缀:提取数字后乘以分配的核数$2,得到作业总内存需求
    • 带G后缀:直接提取数字累加
  • CPU统计修正:仅统计RUNNING状态的作业记录,最后将CPU总数除以3,抵消每个作业对应3条输出的影响。

验证方法

  1. 先单独执行sacct命令,确认运行中作业的内存格式:
sacct -S $(date +%Y-%m-%dT00:00:00) -o State,AllocCPUs,ReqMem --noheader | grep RUNNING
  1. 单独测试awk的匹配逻辑,确认分支判断正确:
echo "RUNNING 4 8Gc" | awk '{if ($3 ~ /Gc$/) print "每核内存"; else print "总内存"}'
echo "RUNNING 4 8G" | awk '{if ($3 ~ /Gc$/) print "每核内存"; else print "总内存"}'

内容的提问来源于stack exchange,提问作者Qant123

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.21 12:37:20