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

167 行
6.0 KiB
Markdown
原始文件 Blame 文件历史

此文件含有模棱两可的 Unicode 字符
此文件含有可能会与其他字符混淆的 Unicode 字符。 如果您是想特意这样的,可以安全地忽略该警告。 使用 Escape 按钮显示他们。
# GPU Monitor
[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg)](LICENSE)
**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. 克隆仓库
```bash
git clone https://github.com/your-username/GPUMonitor.git
cd GPUMonitor
```
### 2. 创建虚拟环境并安装依赖
```bash
python -m venv venv
source venv/bin/activate # Linux / macOS
# venv\Scripts\activate # Windows (PowerShell/CMD)
pip install -r requirements.txt
```
### 3. 配置服务器列表
复制示例配置文件并重命名为本地配置(**请勿将 `config.yaml` 提交到仓库**):
```bash
cp config.example.yaml config.yaml
```
编辑 `config.yaml`,填入你的服务器信息:
```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. 运行
```bash
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](CONTRIBUTING.md)。
## 许可证
本项目基于 [MIT License](LICENSE) 开源。