告别sinfo的‘简陋’输出:手把手教你写一个Slurm集群状态监控脚本(附完整代码)
2026/6/1 10:07:04 网站建设 项目流程

打造高颜值Slurm集群监控面板:从基础命令到可视化实战

每次盯着黑底白字的sinfo输出,是不是感觉在破解摩斯密码?作为Slurm集群管理员,我们经常需要快速掌握节点状态、资源使用情况和作业分布。但默认命令的输出就像一份未经整理的原始数据报表——信息都在那里,却需要反复交叉比对才能理解。本文将带你从零构建一个带颜色标记、多维度整合的集群监控脚本,让节点状态一目了然。

1. 为什么需要自定义监控脚本

Slurm自带的sinfo和squeue命令是管理集群的瑞士军刀,但默认输出存在几个明显痛点:

  • 信息分散:节点状态、资源使用、作业列表分散在不同命令中
  • 可读性差:关键数据淹没在大量文本中,没有视觉焦点
  • 缺乏整合:CPU、内存、GPU使用情况需要手动关联
  • 无状态提示:所有节点平等显示,无法快速识别异常状态

想象一下这样的场景:凌晨三点收到报警,你需要快速判断是某个节点故障还是资源耗尽。此时如果面对的是下面这样的可视化面板:

Hostname Partition Node/State Num_CPU CPUload Memsize(MB) Freemem(MB) GRES/Node Joblist compute-01 gpu-part idle 32 0.12 128000 112000 gpu:2 compute-02 cpu-part mix 64 58.3 256000 48000 - 1234(user1) 5678(user2) compute-03 highmem down* 48 - 512000 - gpu:4(tesla)

比起原始输出,这种颜色标记+表格化的展示能让你在5秒内锁定问题节点。接下来我们就拆解如何实现这样的效果。

2. 基础信息提取:改造sinfo输出

sinfo命令是获取节点信息的核心工具,通过格式化输出选项可以提取关键指标:

# 获取节点基础信息模板 sinfo -o "%N %P %T %C %O %m %e %G" -h

这个命令会输出以下字段:

  • %N: 节点名称
  • %P: 所属分区
  • %T: 节点状态
  • %C: CPU核心数
  • %O: CPU负载
  • %m: 总内存(MB)
  • %e: 可用内存(MB)
  • %G: GRES(通用资源,如GPU)

提示:Slurm的-o选项支持自定义输出格式,完整的格式说明符可通过man sinfo查看

将这些原始数据转换为易读表格的关键在于awk处理:

nodes=$(sinfo -o "%N %P %T %C %O %m %e %G" -h) echo "$nodes" | while read node; do hostname=$(echo $node | awk '{print $1}') partition=$(echo $node | awk '{print $2}') state=$(echo $node | awk '{print $3}') # 其他字段类似处理... done

3. 状态可视化:颜色编码与表格布局

人类视觉对颜色异常敏感,我们可以用颜色编码快速区分节点状态:

# 定义颜色常量 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' NC='\033[0m' # 重置颜色 # 根据状态设置颜色 if [[ $state == "idle" ]]; then state_color=$GREEN elif [[ $state == "mix" ]]; then state_color=$YELLOW else state_color=$RED fi

表格布局使用printf进行格式化输出:

printf "%-15s %-12s ${state_color}%-11s${NC} %-15s %-8s %-12s %-12s %-15s %-s\n" \ $hostname $partition $state $num_cpu $cpuload $memsize $freemem $gres "$joblist"

这里的%-15s表示左对齐且固定宽度为15字符的字符串,确保各列对齐。

4. 增强功能:关联作业列表

单纯的节点信息还不够,我们还需要知道哪些作业正在占用资源。通过squeue命令获取作业信息:

joblist=$(squeue -h -o "%i %u %b" -w $hostname | awk -v ORS=' ' '{print $1, $2, $3}')

这个命令会输出指定节点上所有作业的:

  • 作业ID
  • 所属用户
  • 申请的额外资源(如GPU类型)

注意:-w参数指定节点名称,-h省略表头,-o定义输出格式

5. 完整脚本实现

将上述组件整合,得到完整监控脚本:

#!/bin/bash # 定义颜色 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[1;33m' BLUE='\033[0;34m' NC='\033[0m' # 打印表头 printf "${BLUE}%-15s %-12s %-11s %-15s %-8s %-12s %-12s %-15s %-s${NC}\n" \ "Hostname" "Partition" "Node/State" "Num_CPU" "CPUload" "Memsize(MB)" "Freemem(MB)" "GRES/Node" "Joblist" # 获取并处理节点信息 sinfo -o "%N %P %T %C %O %m %e %G" -h | while read node; do hostname=$(echo $node | awk '{print $1}') partition=$(echo $node | awk '{print $2}') state=$(echo $node | awk '{print $3}') num_cpu=$(echo $node | awk '{print $4}') cpuload=$(echo $node | awk '{print $5}') memsize=$(echo $node | awk '{print $6}') freemem=$(echo $node | awk '{print $7}') gres=$(echo $node | awk '{print $8}') # 获取作业列表 joblist=$(squeue -h -o "%i %u %b" -w $hostname | awk -v ORS=' ' '{print $1, $2, $3}') # 设置状态颜色 case $state in "idle") state_color=$GREEN ;; "mix") state_color=$YELLOW ;; "alloc") state_color=$YELLOW ;; *) state_color=$RED ;; esac # 打印节点信息 printf "%-15s %-12s ${state_color}%-11s${NC} %-15s %-8s %-12s %-12s %-15s %-s\n" \ $hostname $partition $state $num_cpu $cpuload $memsize $freemem $gres "$joblist" done

6. 高级技巧与优化方向

基础版本已经能满足日常监控需求,但还可以进一步优化:

内存使用率计算

mem_usage=$(echo "scale=1; 100*($memsize-$freemem)/$memsize" | bc) printf "%s%%" $mem_usage

GPU资源解析

# 解析GPU类型和数量 gpu_type=$(echo $gres | grep -oP 'gpu:\K\w+') gpu_count=$(echo $gres | grep -oP 'gpu:\d+:\K\d+')

定期自动刷新

watch -n 10 -c ./cluster_monitor.sh

历史数据分析

# 记录历史数据到CSV echo "$(date),$hostname,$cpuload,$mem_usage" >> cluster_stats.csv

在实际生产环境中,这个脚本帮我快速诊断过多次资源争用问题。有一次某个节点显示高负载但无关联作业,最终发现是用户直接登录节点运行了非Slurm管理的进程。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询