返回案例库

精选案例 · 工程接入与部署 / Agent 自动化

HPC 集群自适应监控框架

作者: HMLi

面向 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 共享存储

  1. 项目主页:https://hmli.edu.cn/hmli/hpc-monitor
  2. 实际部署:http://114.214.255.131/hpc/

设计思路

核心理念

  1. 零外部依赖 — Agent 监控脚本仅依赖 bash + /proc + /sys,无需 Python/Perl/外部执行体。 每个脚本可独立运行,便于调试和移植。

  2. 自适应阈值 — 阈值不硬编码,根据节点自身硬件信息动态生成。 CPU 温度告警基于 Tjmax 计算百分比(≥70% Tjmax warning,≥90% critical), 各节点自动适配不同 CPU 型号。

  3. 模块化架构 — 每个监控指标独立文件,增删模块无需重启主服务。 Master 启动时自动扫描 triggers/ 目录动态加载。

  4. 可降级运行 — 可选命令缺失时自动退回到备选方案。 IB 状态检测 ibdev2netdev 不可用时自动切到 ip + 端口名匹配。

  5. 幂等更新 — 上报数据使用 MySQL UNIQUE KEY (hostname, collected_at)

    • ON DUPLICATE KEY UPDATE,网络抖动重放不产生重复行。
  6. 告警去重 — 同一节点+同一类型+同一消息,在未解决期间不重复报警。 状态恢复后自动清除历史,下次再出现时才重新报警。

数据流

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 探测优先级):

  1. coretemp sysfs(Intel 平台)
  2. k10temp / zenpower hwmon(AMD 平台)
  3. thermal_zone trip_point
  4. MSR 0x1A2rdmsr 命令)

无 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 中国科学技术大学网络信息中心超级计算中心

返回顶部