文件
wangchuanli 762b4b49a0 feat: 初始化 GPU Monitor 项目
搭建基于 Flask + SocketIO 的 GPU 集群实时监控系统,包含远程采集、定时调度、Web 前端可视化及项目文档。
2026-08-24 15:00:43 +08:00

6.0 KiB

GPU Monitor

License: MIT

GPU Monitor 是一个基于 Flask + SocketIO 的轻量级 NVIDIA GPU 集群实时监控系统。它通过 SSH 远程连接多台服务器,定时执行 nvidia-smi 采集 GPU 状态(利用率、温度、显存等),并通过 WebSocket 实时推送到浏览器前端,提供可视化卡片与历史趋势图表。

功能特性

  • 🚀 实时监控:基于 WebSocket(SocketIO)的秒级数据推送,无需手动刷新
  • 🖥️ 多服务器支持:在 config.yaml 中配置任意数量的远程服务器
  • 📊 可视化卡片:每台服务器的多张 GPU 卡片,展示利用率、温度、显存占用
  • 📈 趋势图表:点击 GPU 卡片可打开详情模态框,查看利用率历史曲线
  • 🔌 连接状态指示:前端实时显示 WebSocket 连接状态与服务器在线/离线
  • 🌡️ 温度阈值告警:可配置温度告警阈值
  • 🔧 零前端构建:前端使用 CDN 引入 Tailwind / Socket.IO / Chart.js,无需打包

技术栈

层级 技术
后端 Python 3.8+ / Flask / Flask-SocketIO
调度 APScheduler(后台定时任务)
采集 paramiko(SSH)调用 nvidia-smi
前端 HTML + Tailwind CSS + Chart.js + Socket.IO(均通过 CDN)

目录结构

GPUMonitor/
├── app.py                 # Flask 应用入口,启动 SocketIO 服务
├── config.example.yaml    # 配置示例文件(提交到仓库)
├── config.yaml            # 本地配置(含敏感信息,已被 .gitignore 忽略)
├── core/
│   ├── __init__.py
│   ├── collector.py       # 通过 SSH 远程采集 GPU 数据 (GPUCollector)
│   └── scheduler.py       # 定时调度与数据分发 (GPUScheduler)
├── static/                # 静态资源(js / css)
├── templates/
│   └── index.html         # 前端监控页面
├── requirements.txt       # Python 依赖
├── README.md
├── LICENSE
└── .gitignore

环境要求

  • Python 3.8 及以上
  • 目标服务器已安装 NVIDIA 驱动并可用 nvidia-smi 命令
  • 监控机可通过 SSH 访问目标服务器(支持密码或密钥登录)

快速开始

1. 克隆仓库

git clone https://github.com/your-username/GPUMonitor.git
cd GPUMonitor

2. 创建虚拟环境并安装依赖

python -m venv venv
source venv/bin/activate        # Linux / macOS
# venv\Scripts\activate         # Windows (PowerShell/CMD)

pip install -r requirements.txt

3. 配置服务器列表

复制示例配置文件并重命名为本地配置(请勿将 config.yaml 提交到仓库):

cp config.example.yaml config.yaml

编辑 config.yaml,填入你的服务器信息:

servers:
  - alias: 'AIServer'          # 服务器别名(前端展示用)
    ip: '192.168.1.10'         # 服务器 IP
    port: 22                   # SSH 端口
    username: 'root'           # SSH 用户名
    password: 'your_password'  # SSH 密码(建议改用 SSH Key)
  # 可继续添加更多服务器 ...

settings:
  interval: 5                  # 采集间隔(秒)
  timeout: 10                  # SSH 连接超时(秒)
  temperature_threshold: 80    # 温度告警阈值(°C)

⚠️ 安全提示:配置文件中的密码为明文,请仅在受信任的本地环境使用,或改用 SSH 公钥认证。生产环境务必通过环境变量 GPU_MONITOR_SECRET_KEY 设置 Flask 会话密钥。

4. 运行

python app.py

启动后访问浏览器:

http://<监控机IP>:8099

前端将自动通过 WebSocket 实时刷新 GPU 数据。

配置说明

配置项 说明 默认值
servers[].alias 服务器展示别名 必填
servers[].ip 服务器 IP 地址 必填
servers[].port SSH 端口 22
servers[].username SSH 用户名 必填
servers[].password SSH 密码 必填
settings.interval 采集间隔(秒) 5
settings.timeout SSH 连接超时(秒) 10
settings.temperature_threshold 温度告警阈值(°C) 80

工作原理

  1. GPUScheduler 使用 APScheduler 在后台按 interval 周期触发采集。
  2. 每个采集周期遍历 config.yaml 中的服务器,由 GPUCollector 通过 paramiko 建立 SSH 连接。
  3. 远程执行 nvidia-smi --query-gpu=... 并以 CSV 格式返回,解析为结构化数据。
  4. 所有服务器结果汇总到 last_data,通过 SocketIO 的 gpu_update 事件推送给所有已连接的浏览器。
  5. 前端接收数据后动态渲染服务器卡片,并维护每张 GPU 的利用率趋势图表。

环境变量

变量名 说明
GPU_MONITOR_SECRET_KEY Flask SECRET_KEY,用于会话签名;未设置时每次启动随机生成

常见问题(FAQ)

Q: 前端显示「无法连接服务器」? A: 检查目标服务器 IP / 端口 / 用户名 / 密码是否正确,以及监控机到目标机的网络与 SSH 权限。

Q: 卡片显示但无数据 / 数据为空? A: 确认目标服务器已安装 NVIDIA 驱动且 nvidia-smi 在登录 Shell(bash -l)的 PATH 中可用。

Q: 如何修改监听端口? A: 编辑 app.py 末尾 socketio.run(app, host='0.0.0.0', port=8099) 中的 port。

Q: 支持 HTTPS / 反向代理吗? A: 生产环境建议在 Nginx 等反向代理后部署,并为 SocketIO 配置 cors_allowed_origins 与 WebSocket 转发。

安全建议

  • 不要将包含真实 IP / 密码的 config.yaml 提交到任何公开仓库。
  • 优先使用 SSH 公钥认证,避免明文密码。
  • 通过反向代理启用 HTTPS,不要将服务直接暴露在公网 0.0.0.0。
  • 设置强随机的 GPU_MONITOR_SECRET_KEY 环境变量。

贡献

欢迎提交 Issue 与 Pull Request!请参阅 CONTRIBUTING.md。

许可证

本项目基于 MIT License 开源。