当前位置: 首页 > 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.rkmt.cn/news/1439191.html

相关文章:

  • 从0到1部署ruadapt_qwen2.5_3B_ext_u48_instruct_v4:环境配置、依赖安装与测试完整教程
  • 如何快速上手Amber模型?从环境配置到文本生成的完整指南
  • [开源] 门急诊药房语音核验助手:面向基层断网场景的处方-药品双码核验系统,本地规则驱动、离线播报、联网可扩展解释
  • 【读书笔记】《架构整洁之道》核心观点提炼
  • CANN/ops-blas sspmv算子实现
  • 如何在Stable-Worldmodel中实现warm-start规划?提升求解效率的关键技巧
  • VTK太复杂?试试用C#的ActiViz库:5步搞定三维点云可视化(避坑指南)
  • AI重塑ITSM:从技术顾问到社区构建者的实践与思考
  • 解决常见问题:Qwen3.6-27B-OBLITERATED使用中的10个疑难解答
  • 如何高效自动化下载国家中小学智慧教育平台电子课本?tchMaterial-parser实用指南深度解析
  • 虚拟化浪潮与元宇宙演进:从技术架构到社会影响深度解析
  • 新手避坑指南:用Arduino IDE 2.2.1点亮源地ESP32-S2-MINI-1开发板上的WS2812B灯珠
  • AI时代商业可见性:从SEO到AI优化的范式转移与实战指南
  • LabVIEW UI 逻辑解耦设计
  • 5分钟彻底改造你的音乐播放器:foobox-cn终极美化方案实战
  • Exodia-7B开发者指南:自定义训练与模型微调全攻略
  • MoE架构深度解析:Qwen3.5-122B-A10B-Uncensored-HauhauCS-Aggressive如何用1220亿参数实现高效推理
  • 2026年4月有实力的水分仪厂家推荐,电磁流量传感器/矿用本安型超声波流量计/本安气体流量计,水分仪公司哪家可靠 - 品牌推荐师
  • 反拖延经济崛起:从AI教练到共享空间,如何科学对抗拖延症?
  • 微信聊天记录如何实现永久本地化存储:WeChatMsg开源工具技术解析
  • 告别抖动!用Cinemachine 2.9.7搞定Unity 2D角色移动时的镜头平滑跟随
  • 国家中小学智慧教育平台电子课本下载完整指南:一键获取PDF教材的高效解决方案
  • 如何利用Notus-7B-v1-openmind构建智能聊天应用:从零开始的完整教程
  • AI驱动的社会工程学攻击:大语言模型如何模拟“邪恶双胞胎”实施身份劫持
  • AI SDLC转型:从虚荣指标到能力进化的三层度量模型实践
  • 用Python+Matplotlib分析美国犯罪率:从数据清洗到散点图绘制的保姆级教程
  • distilcamembert-base-sentiment多格式支持:PyTorch、TensorFlow、ONNX全解析
  • 如何用3步永久保存微信聊天记录:开源工具的完整实践指南
  • 三步搞定国家中小学智慧教育平台电子课本下载:免费开源工具终极指南
  • CentOS 8.3虚拟机里装Sentaurus TCAD,我踩过的7个坑和填坑方法(附详细命令)