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条输出的影响。
验证方法
- 先单独执行sacct命令,确认运行中作业的内存格式:
sacct -S $(date +%Y-%m-%dT00:00:00) -o State,AllocCPUs,ReqMem --noheader | grep RUNNING
- 单独测试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
相关产品推荐
相关产品推荐

