精选案例 · 工程接入与部署 / Agent 自动化
HPC 集群自适应监控框架
面向 Slurm 管理的 GPU 集群的自适应监控系统,采用 Master-Agent 分离架构,纯 Shell 采集 + Python 服务端 + PHP Web 展示,零外部依赖。支持自适应阈值、模块化架构、可降级运行、幂等更新和告警去重。涵盖 CPU/内存/磁盘/GPU/IB 网络/硬件健康等多种指标,并提供 Web 总览、图表、告警和历史追踪功能。
案例速读
项目设计严谨:零外部依赖、自适应阈值、模块化架构、降级运行、幂等更新、告警去重,且提供完整安装文档、目录结构和监控指标说明。已在实际环境部署,工程实践度高。 建议从 「HPC 集群自适应监控框架」、「设计思路」、「核心理念」、「数据流」 进入正文,先确认真实任务和模型辅助过程。
- 重点看 监控采集脚本可独立部署复用、自适应温度阈值计算逻辑、Master 端模块化触发器框架。结合 工程接入与部署 / Agent 自动化 / 监控系统 / 超算集群 和「系统管理员、HPC 运维人员、集群管理员」,它更适合作为任务检索后的精读材料。
- 正文目录和原始材料仍然是判断依据;导读只帮助你更快定位阅读重点。
- 首读入口
- 设计思路
- 读者
- 系统管理员、HPC 运维人员、集群管理员
- 复用
- 监控采集脚本可独立部署复用
- 结构
- 12 个目录入口
原文内容
HPC 集群自适应监控框架
最新版本: v2026-06-05 | 发布日期: 2026-06-05
通用超算集群监控系统,面向 Slurm 管理的 GPU 集群设计,采用 Master-Agent 分离架构, 纯 Shell 采集 + Python 服务端 + PHP Web 展示,零外部依赖,可移植部署。
适用场景: Slurm 集群、GPU 集群、IB 网络、ParaStor / Lustre / NFS 共享存储
- 项目主页:https://hmli.edu.cn/hmli/hpc-monitor
- 实际部署:http://114.214.255.131/hpc/
设计思路
核心理念
-
零外部依赖 — Agent 监控脚本仅依赖 bash +
/proc+/sys,无需 Python/Perl/外部执行体。 每个脚本可独立运行,便于调试和移植。 -
自适应阈值 — 阈值不硬编码,根据节点自身硬件信息动态生成。 CPU 温度告警基于
Tjmax计算百分比(≥70% Tjmax warning,≥90% critical), 各节点自动适配不同 CPU 型号。 -
模块化架构 — 每个监控指标独立文件,增删模块无需重启主服务。 Master 启动时自动扫描
triggers/目录动态加载。 -
可降级运行 — 可选命令缺失时自动退回到备选方案。 IB 状态检测
ibdev2netdev不可用时自动切到ip+ 端口名匹配。 -
幂等更新 — 上报数据使用 MySQL
UNIQUE KEY (hostname, collected_at)ON DUPLICATE KEY UPDATE,网络抖动重放不产生重复行。
-
告警去重 — 同一节点+同一类型+同一消息,在未解决期间不重复报警。 状态恢复后自动清除历史,下次再出现时才重新报警。
数据流
Agent 采集 ────────────────────────────────────────────┐
(每个节点 cron */5) │
├─ monitor-cpu.sh → /proc/stat │
├─ monitor-memory.sh → /proc/meminfo │
├─ monitor-disk.sh → df │
├─ monitor-gpu.sh → nvidia-smi │ POST
├─ monitor-hardware.sh → sensors, dmesg │ ───▶ Master (:8282)
├─ monitor-ib.sh → ibstat, ip │
├─ monitor-network.sh → /proc/net/dev │
├─ monitor-slurm.sh → systemctl │
└─ monitor-fs.sh → findmnt │
Master (:8282) │
├─ do_POST() 接收 JSON │
├─ parse_extract() → 展平为 DB 字段 │
├─ save_report() → MySQL INSERT │
├─ load triggers/*.py → 阈值判定 │
├─ dedup_alerts() → 去重 │
└─ save_alerts() + post_alert_webhook() │
│ │
▼ │
Alert Webhook (:8283) │
│ │
▼ │
Hermes Agent → 飞书/微信 │
Web 展示 │
Apache + PHP 8.3 │
└─ http://{MASTER_NODE}/hpc/ │
├─ 总览 → 统计卡 + 节点状态表 │
├─ 图表 → 8 指标 Chart.js 折线图 │
├─ 告警 → 筛选/详情 │
├─ 历史 → 节点记录追踪 │
└─ 帮助 → 使用说明 │
┌────────────────┐ ┌────────────────────┐ ┌────────────────┐ │ 计算节点 (N个) │ │ 管理节点 (Master) │ │ Hermes 节点 │ │ │ │ │ │ (报警接收) │ │ cron /5 min │ │ hpc-monitor-master │ │ │ │ ↓ │ │ → triggers 阈值判定│ │ alert- │ │ agent.sh │─────▶│→ dedup_alerts() │─────▶│ receiver.py │ │ ↓ │ │ → save_report(DB) │ │ ↓ │ │ 10 × monitor- │ │→ post_alert_webhook│ │ hermes send │ │ (bash + /proc) │ │ (:8282) │ │ ↓ │ │ │ │ └─── MariaDB (hpc) │ │ 飞书/Telegram │ └────────────────┘ └───────────────┬────┘ └────────────────┘ │ ▼ PHP Web 展示 Apache :80/hpc/ Chart.js / 8 图表 / 告警过滤 / 节点详情
目录结构
hpc-monitor/
├── README.md # 本文档
├── .gitignore
├── hpc-monitor.env # 环境变量配置(模板,无敏感信息)
├── hpc-monitor-agent.sh # Agent 调度脚本(节点侧)
├── hpc-monitor-master.py # Master 主服务(管理节点)
├── hpc-monitor-db.py # 数据库持久化模块
├── hpc_monitor_db.py # (同上,部署别名)
├── hpc-monitor-probe.sh # 单次探测脚本
├── hpc-monitor-setup.sh # 一键部署脚本
├── fs-discover.sh # 文件系统发现
├── fs-recover.sh # 文件系统恢复(根目录级)
├── net-recover.sh # 网络恢复(根目录级)
│
├── config/ # 配置模板
│ ├── hpc-monitor.yaml
│ ├── hpc-monitor.env
│ └── fs-state-agent.yaml
│
├── monitors/ # 监控模块(每节点部署)
│ ├── monitor-cpu.sh # CPU 负载 / 核心数
│ ├── monitor-memory.sh # 内存使用率
│ ├── monitor-disk.sh # 磁盘分区使用率
│ ├── monitor-gpu.sh # GPU 温度 / 显存 / ECC / XID
│ ├── monitor-hardware.sh # 硬件健康(dmesg/EDAC/SMART)
│ ├── monitor-ib.sh # IB 链路状态 / IP
│ ├── monitor-network.sh # 网口流量 / 错误
│ ├── monitor-slurm.sh # Slurm 服务状态
│ ├── monitor-fs.sh # 共享文件系统
│ ├── fs-recover.sh # 文件系统自动恢复
│ └── net-recover.sh # 网络自动恢复
│
├── triggers/ # 阈值判定 / 告警生成(Master侧)
│ ├── trigger-cpu.py
│ ├── trigger-disk.py # 磁盘空间 + SMART 硬件
│ ├── trigger-fs.py
│ ├── trigger-gpu.py # GPU XID/ECC
│ ├── trigger-hardware.py # 温度/EDAC/AER/MCE
│ ├── trigger-ib.py
│ ├── trigger-memory.py
│ ├── trigger-network.py
│ └── trigger-slurm.py
├── web/ # PHP Web 前端
│ ├── index.php # Web 前端主页面
│ └── config.example.php # 配置模板(复制为 config.php 后修改)
└── monitor-tmp.sh # 节点临时文件清理
└── hpc-monitor-probe.sh
---
## 安装和使用
### 前置要求
| 组件 | 要求 | 说明 |
|--------------|---------------------------------|--------------------------------|
| 管理节点 | Linux, Python 3.6+, systemd | 运行 Master + MariaDB + Apache |
| 计算节点 | Linux, bash, nvidia-smi(可选) | 运行 Agent |
| MariaDB | 10.x+ | 数据存储 |
| Apache + PHP | 8.0+(8.3 推荐) | Web 展示 |
| 共享存储 | NFS / Lustre / ParaStor | 部署文件统一管理 |
### 快速部署
#### 1. 数据库初始化
```bash
# 创建数据库和用户
mysql -u root -p <<EOF
CREATE DATABASE IF NOT EXISTS hpc_monitor DEFAULT CHARACTER SET utf8mb4;
CREATE USER IF NOT EXISTS 'hpcmon'@'localhost' IDENTIFIED BY 'your_password';
GRANT ALL PRIVILEGES ON hpc_monitor.* TO 'hpcmon'@'localhost';
FLUSH PRIVILEGES;
EOF
# 初始化表结构(自动创建)
python3 hpc-monitor-db.py
2. 配置环境变量
# 复制环境变量模板,编辑实际值
cp config/hpc-monitor.env /etc/hpc-monitor/
# 编辑 /etc/hpc-monitor/hpc-monitor.env
# 必须设置: HPC_DB_PASS, MASTER_HOST, AGENT_MASTER_HOST, ALERT_WEBHOOK_URL
3. 启动 Master
# 安装 systemd 服务
cat > /etc/systemd/system/hpc-monitor-master.service <<EOF
[Unit]
Description=HPC Cluster Monitor Master Service
After=network.target
[Service]
Type=simple
ExecStart=/usr/bin/python3 /path/to/hpc-monitor-master.py
Restart=always
RestartSec=10
User=root
EnvironmentFile=/etc/hpc-monitor/hpc-monitor.env
[Install]
WantedBy=multi-user.target
EOF
systemctl daemon-reload
systemctl enable --now hpc-monitor-master
4. 部署 Agent 到计算节点
# 每个计算节点 cron */5 运行
cp hpc-monitor-agent.sh /usr/local/bin/
mkdir -p /usr/local/bin/hpc-monitors/
cp monitors/*.sh /usr/local/bin/hpc-monitors/
# 添加 cron 任务
echo '*/5 * * * * root /usr/local/bin/hpc-monitor-agent.sh' > /etc/cron.d/hpc-agent
# 测试运行(不上报)
bash /usr/local/bin/hpc-monitor-agent.sh --local
5. 配置 Web 展示
# 复制 PHP 到 Apache 目录
cp -r web/ /var/www/html/hpc/
# 编辑 `config.php`(从模板复制):
cp web/config.example.php /var/www/html/hpc/config.php
# 然后修改数据库密码、系统名称(APP_NAME)、节点角色等配置
# 重启 Apache
systemctl restart apache2
注意: 本项目仓库仅包含监控核心代码(Agent/Master/Triggers), Web PHP 前端(
index.php+config.php)在部署环境中维护, 不在版本控制中。
监控指标
| 指标 | 正常 | 警告 | 严重 | 数据来源 | 告警策略 |
|---|---|---|---|---|---|
| CPU 负载 | < 0.7 | 0.7 – 0.9 | > 0.9 | /proc/loadavg | 阈值 |
| CPU 温度 | < 70% Tjmax | 70% – 90% Tjmax | > 90% Tjmax | hwmon / coretemp | 自适应 % |
| 内存使用率 | < 80% | 80% – 90% | > 90% | /proc/meminfo | 阈值 |
| 磁盘使用率 | < 90% | 90% – 95% | > 95% | df | 阈值 |
| GPU 温度 | < 70% Tjmax | 70% – 90% Tjmax | > 90% Tjmax | nvidia-smi | 自适应 % |
| IB 链路 | ACTIVE (4) | — | 非 ACTIVE | /sys/class/infiniband | 状态 |
| GPU ECC | 0 | > 0 SB | > 0 DB / XID | nvidia-smi | 累计 |
| 硬件错误 | 0 | dmesg > 0 | EDAC UE | dmesg / EDAC | 累计 |
| 磁盘 SMART | PASSED | 重映射 > 0 | 不可纠正 > 0 | smartctl | 累计 |
| OOM | 0 | — | > 0 | dmesg | 事件 |
| 文件系统 | healthy | — | D 状态 > 0 | findmnt | 状态 |
自适应温度阈值
各节点 Agent 上报 cpu_tjmax_c(Tjmax 探测优先级):
coretempsysfs(Intel 平台)k10temp/zenpowerhwmon(AMD 平台)thermal_zonetrip_point- MSR
0x1A2(rdmsr命令)
无 Tjmax 时回退硬编码(warning ≥80°C / critical ≥90°C)。
存储
数据库
- 类型: MariaDB 10.11+
- 数据库:
hpc_monitor表:
| 表名 | 用途 | 行数参考 |
|---|---|---|
nodes |
节点注册信息 | 17 |
monitor_data |
监控时间序列 | ~300K/月 |
alerts |
告警记录 | ~1K/月 |
node_online_history |
每日汇总 | 按天 |
- 数据保留: monitor_data 保留 30 天,alerts 保留 90 天
- 每日维护: cron 1:00 自动汇总 + 清理 + OPTIMIZE
告警去重
- 同一条告警(节点+类型+消息)在未解决期间不重复写入
- 告警解除后自动清除,下次复现时重新触发
- 避免"节点 DOWN"每 5 分钟重复报警
告警通知
Agent 上报 → Master trigger → dedup → alerts 表
|
▼
alert webhook :8283
|
▼
Hermes send → 飞书
通知内容示例:
🔴 CRITICAL [gpu]
anode03 GPU 0 XID 48 (Double Bit ECC)
2026-06-02 14:30:01
🟡 WARNING [disk]
anode01 / 分区使用率 87%(≥90% 阈值)
2026-06-02 14:25:01
维护命令
# Master
systemctl status hpc-monitor-master
systemctl restart hpc-monitor-master
journalctl -u hpc-monitor-master -n 50 --no-pager
# Agent 测试
bash hpc-monitor-agent.sh --local # 本地测试,不上报
bash hpc-monitor-agent.sh --list # 列出所有模块
# Web
systemctl restart apache2
tail -f /var/log/apache2/error.log
# 数据库
mysql -u hpcmon -p hpc_monitor -e "SELECT * FROM alerts WHERE resolved=0"
许可
MIT License
Copyright © 2026 中国科学技术大学网络信息中心超级计算中心