当前位置: 首页 > news >正文

告别sinfo的‘简陋’输出:手把手教你用Bash脚本打造Slurm集群状态监控面板

告别sinfo的‘简陋’输出:手把手教你用Bash脚本打造Slurm集群状态监控面板

在Slurm集群的日常运维中,管理员和高级用户经常需要快速掌握集群的整体状态。原生的sinfosqueue命令虽然功能强大,但默认输出往往信息分散、格式杂乱,特别是在处理大规模集群时,用户需要花费大量时间在原始数据中寻找关键信息。本文将带你从零开始构建一个功能完善的Slurm集群监控面板,通过精心设计的Bash脚本,将分散的节点状态、资源使用情况和作业信息整合成一个直观的可视化界面。

1. 为什么需要自定义监控面板

Slurm作为高性能计算领域最常用的作业调度系统,其命令行工具提供了丰富的集群管理功能。但默认输出存在几个明显痛点:

  • 信息分散:节点状态、资源使用和作业列表分散在不同命令的输出中
  • 可读性差:关键数据淹没在大量文本中,缺乏视觉焦点
  • 缺乏上下文:资源使用情况与运行作业无法直观关联
  • 定制困难:默认输出格式固定,难以满足不同场景的监控需求

一个设计良好的监控面板应该具备以下特征:

# 理想监控面板的示例输出 Hostname Partition Node/State Num_CPU CPUload Memsize(MB) Freemem(MB) GRES/Node Joblist node01 gpu-part idle 32 0.12 128000 112000 gpu:2 - node02 cpu-part allocated 64 1.85 256000 48000 - 12345(user1)

2. 构建监控面板的核心组件

2.1 基础信息采集

监控面板的核心是从Slurm获取原始数据并进行加工处理。我们需要组合使用多个Slurm命令:

# 获取节点基础信息 nodes=$(sinfo -o "%N %P %T %C %O %m %e %G" -h) # 获取作业列表 jobs=$(squeue -h -o "%i %u %b %N")

关键字段说明:

字段说明来源命令
%N节点名sinfo
%P分区名sinfo
%T节点状态sinfo
%CCPU数量sinfo
%OCPU负载sinfo
%m内存总量sinfo
%e可用内存sinfo
%G通用资源sinfo
%i作业IDsqueue
%u用户名squeue
%b资源需求squeue

2.2 数据处理与格式化

获取原始数据后,需要通过awk、sed等工具进行加工处理:

# 示例:提取并格式化节点信息 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

对于作业列表,我们需要按节点进行分组和聚合:

# 获取指定节点的作业列表 get_jobs_for_node() { local node=$1 squeue -h -o "%i(%u)" -w $node | tr '\n' ' ' }

2.3 可视化增强

为提高可读性,我们可以添加颜色编码和表格布局:

# 定义颜色常量 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' NC='\033[0m' # No Color # 根据状态设置颜色 get_state_color() { case "$1" in "idle") echo $GREEN ;; "allocated") echo $RED ;; "mixed") echo $YELLOW ;; *) echo $NC ;; esac }

3. 完整脚本实现

以下是整合所有功能的完整脚本实现:

#!/bin/bash # 颜色定义 RED='\033[0;31m' GREEN='\033[0;32m' YELLOW='\033[0;33m' BLUE='\033[0;34m' NC='\033[0m' # No Color # 列宽定义 COL_HOST=15 COL_PART=12 COL_STATE=11 COL_CPU=15 COL_LOAD=8 COL_MEM_T=12 COL_MEM_F=12 COL_GRES=15 COL_JOBS=30 # 打印表头 printf "${BLUE}%-${COL_HOST}s %-${COL_PART}s %-${COL_STATE}s %-${COL_CPU}s %-${COL_LOAD}s %-${COL_MEM_T}s %-${COL_MEM_F}s %-${COL_GRES}s %-${COL_JOBS}s${NC}\n" \ "Hostname" "Partition" "State" "CPU(C/T)" "Load" "MemTotal" "MemFree" "GRES" "Jobs(User)" # 获取节点信息并处理 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}') cores_total=$(echo $node | awk '{print $4}') load=$(echo $node | awk '{print $5}') mem_total=$(echo $node | awk '{print $6}') mem_free=$(echo $node | awk '{print $7}') gres=$(echo $node | awk '{print $8}') # 获取作业信息 jobs=$(squeue -h -o "%i(%u)" -w $hostname | tr '\n' ' ') # 设置状态颜色 case $state in "idle") color=$GREEN ;; "allocated") color=$RED ;; "mixed") color=$YELLOW ;; *) color=$NC ;; esac # 打印节点信息 printf "%-${COL_HOST}s %-${COL_PART}s ${color}%-${COL_STATE}s${NC} %-${COL_CPU}s %-${COL_LOAD}s %-${COL_MEM_T}s %-${COL_MEM_F}s %-${COL_GRES}s %-${COL_JOBS}s\n" \ "$hostname" "$partition" "$state" "$cores_total" "$load" "$mem_total" "$mem_free" "$gres" "$jobs" done

4. 高级功能扩展

4.1 实时刷新功能

通过watch命令实现自动刷新:

watch -n 10 -c ./slurm_dashboard.sh

4.2 资源使用率计算

添加CPU和内存使用率计算:

# 计算CPU使用率 cpu_usage=$(echo "scale=1; $load * 100 / $cores_total" | bc) # 计算内存使用率 mem_usage=$(echo "scale=1; ($mem_total - $mem_free) * 100 / $mem_total" | bc)

4.3 告警阈值设置

根据资源使用率添加颜色提示:

# CPU使用率颜色 if (( $(echo "$cpu_usage > 90" | bc -l) )); then cpu_color=$RED elif (( $(echo "$cpu_usage > 70" | bc -l) )); then cpu_color=$YELLOW else cpu_color=$GREEN fi

4.4 多维度排序支持

添加按CPU、内存等指标排序的功能:

# 按CPU使用率排序 sorted_nodes=$(sinfo -o "%N %P %T %c %O %m %e %G" -h | sort -k5 -rn)

5. 部署与集成

5.1 系统级部署

将脚本部署为系统命令,供所有用户使用:

# 复制脚本到系统目录 sudo cp slurm_dashboard.sh /usr/local/bin/slurm-dashboard # 设置执行权限 sudo chmod +x /usr/local/bin/slurm-dashboard

5.2 登录自动显示

在/etc/profile.d/中添加脚本,实现登录时自动显示:

# 创建自动执行脚本 echo "[[ $- == *i* ]] && slurm-dashboard" | sudo tee /etc/profile.d/slurm-dashboard.sh # 设置权限 sudo chmod +x /etc/profile.d/slurm-dashboard.sh

5.3 Web界面集成

通过CGI脚本将监控面板集成到Web界面:

#!/bin/bash echo "Content-type: text/html" echo "" echo "<pre>" slurm-dashboard echo "</pre>"

6. 性能优化技巧

对于大型集群,原始命令执行可能较慢,可以采用以下优化措施:

  • 并行获取数据:使用GNU parallel并行执行节点信息采集
  • 缓存机制:对不常变化的信息进行缓存
  • 增量更新:只更新发生变化的部分
  • 数据预处理:在后台定期运行信息采集任务
# 使用parallel并行处理 sinfo -o "%N" -h | parallel -j 10 'sinfo -o "%N %P %T %c %O %m %e %G" -h -n {}'

在实际部署中,我们发现对于超过100个节点的集群,合理的脚本优化可以将响应时间从10秒以上降低到2秒以内。

http://www.jsqmd.com/news/927858/

相关文章:

  • CANN/asc-devkit:DCache访问优化
  • Deliberate AI绘图模型深度解析:从v1到v6的进化之路与核心功能揭秘
  • DeBERTa-v3-large_boolq完整指南:从安装到推理的终极教程
  • Umi-OCR双层PDF转换技术深度解析与实战指南
  • PingFangSC字体包技术指南:跨平台中文字体渲染架构方案深度解析
  • 从0到1部署ruadapt_qwen2.5_3B_ext_u48_instruct_v4:环境配置、依赖安装与测试完整教程
  • 2024年Intel OneAPI更新后,VASP 6.3.2编译安装避坑全记录(附常见错误解决)
  • 如何快速上手Amber模型?从环境配置到文本生成的完整指南
  • [开源] 门急诊药房语音核验助手:面向基层断网场景的处方-药品双码核验系统,本地规则驱动、离线播报、联网可扩展解释
  • 【读书笔记】《架构整洁之道》核心观点提炼
  • swin-small-finetuned-cifar100模型训练揭秘:超参数选择与性能优化技巧
  • AI时代职业重塑:从人机协同到技能升级的实战指南
  • A/B测试加速实战:方差缩减与贝叶斯方法提升实验效率
  • CANN/ops-blas sspmv算子实现
  • 如何在Stable-Worldmodel中实现warm-start规划?提升求解效率的关键技巧
  • GPT-2 Large与其他GPT模型对比:如何选择最适合你项目的语言模型
  • VTK太复杂?试试用C#的ActiViz库:5步搞定三维点云可视化(避坑指南)
  • AI重塑ITSM:从技术顾问到社区构建者的实践与思考
  • 深入systemd:从‘ovsdb-server.service is not running’错误理解Linux服务管理
  • 深度解析OpCore-Simplify:自动化OpenCore EFI配置的技术实现
  • 解决常见问题:Qwen3.6-27B-OBLITERATED使用中的10个疑难解答
  • RoBERTa-large-sst2开发者指南:5个自定义训练与模型优化技巧
  • 如何高效自动化下载国家中小学智慧教育平台电子课本?tchMaterial-parser实用指南深度解析
  • 告别采样负电压!用差分运放给MCU设计一个‘零压线’信号调理电路
  • [开源] 医疗大模型知识盲区检测与可视化系统:面向临床决策者的AI能力边界认知工具
  • 虚拟化浪潮与元宇宙演进:从技术架构到社会影响深度解析
  • 告别VirtualBox的‘幽灵网卡’错误:深度清理与重建Host-Only网络适配器全流程
  • 【读书笔记】《系统架构设计》精华解读
  • 终极OpenCore自动化配置指南:如何用OpCore-Simplify在30分钟内完成Hackintosh部署
  • 新手避坑指南:用Arduino IDE 2.2.1点亮源地ESP32-S2-MINI-1开发板上的WS2812B灯珠