feat: 初始化 GPU Monitor 项目
搭建基于 Flask + SocketIO 的 GPU 集群实时监控系统,包含远程采集、定时调度、Web 前端可视化及项目文档。
这个提交包含在:
@@ -0,0 +1,166 @@
|
||||
# GPU Monitor
|
||||
|
||||
[](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) 开源。
|
||||
在新工单中引用
屏蔽一个用户