打造高颜值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}') # 其他字段类似处理... done3. 状态可视化:颜色编码与表格布局
人类视觉对颜色异常敏感,我们可以用颜色编码快速区分节点状态:
# 定义颜色常量 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" done6. 高级技巧与优化方向
基础版本已经能满足日常监控需求,但还可以进一步优化:
内存使用率计算:
mem_usage=$(echo "scale=1; 100*($memsize-$freemem)/$memsize" | bc) printf "%s%%" $mem_usageGPU资源解析:
# 解析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管理的进程。