打造高颜值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 scale1; 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管理的进程。