README.md 8.26 KB
Newer Older
zk's avatar
zk committed
1
2
# GPU/DCU 资源看板

zk's avatar
zk committed
3
一个通过 SSH 采集服务器 GPU/DCU 占用情况的 Web 看板。适合集中查看多台服务器的加速卡状态,支持海光 DCU 和 NVIDIA GPU。
zk's avatar
zk committed
4

zk's avatar
zk committed
5
看板会定时在目标服务器上执行 `hy-smi``nvidia-smi`,展示每台服务器的卡数、型号、显存占用、算力占用、温度、功耗、在线状态和分组信息。
zk's avatar
zk committed
6

zk's avatar
zk committed
7
## 界面预览
zk's avatar
zk committed
8

zk's avatar
zk committed
9
主界面:
zk's avatar
zk committed
10

zk's avatar
zk committed
11
![主界面](docs/主界面.png)
zk's avatar
zk committed
12

zk's avatar
zk committed
13
添加服务器:
zk's avatar
zk committed
14

zk's avatar
zk committed
15
![添加服务器界面](docs/添加服务器界面.png)
zk's avatar
zk committed
16

zk's avatar
zk committed
17
## 功能
zk's avatar
zk committed
18

zk's avatar
zk committed
19
20
21
22
23
24
- 添加、编辑、删除服务器。
- 按服务器状态和分组筛选。
- 支持海光 DCU:通过 `hy-smi` 采集占用,通过 `hy-smi --showproductname` 识别型号。
- 支持 NVIDIA GPU:通过 `nvidia-smi` 采集占用和识别型号。
- 自动识别卡数,不需要手动填写 4 卡或 8 卡。
- 同时显示显存占用和算力占用。
zk's avatar
zk committed
25
- 根据显存占用和算力占用综合判断每张卡是否可用。
zk's avatar
zk committed
26
- 主界面用水位色块展示每张卡的显存和算力占用。
zk's avatar
zk committed
27
- 盘点每台服务器 `/models``/public``/data` 等目录下的模型文件/目录,并展示 Docker images。
zk's avatar
zk committed
28
29
- 提供“模型镜像检索”视图,按模型名、路径、Docker 镜像名或 tag 查找资产所在服务器。
- 检索结果显示服务器分组、IP、当前占用状态,并支持复制 IP、SSH 命令、模型路径和镜像名称。
zk's avatar
zk committed
30
- 支持多站点入口切换,可以在昆山/天津中心和太原中心等多套独立部署之间跳转。
zk's avatar
zk committed
31
- 右上角支持按服务器名称、IP、分组、标签、型号、模型路径和镜像名称进行模糊搜索。
zk's avatar
zk committed
32
- 型号只在新增服务器和手动刷新时重新识别,日常自动刷新只采集占用数据。
zk's avatar
zk committed
33
- 定期备份服务器配置文件,便于误操作后恢复。
zk's avatar
zk committed
34

zk's avatar
zk committed
35
## 环境准备
zk's avatar
zk committed
36

zk's avatar
zk committed
37
部署机器需要:
zk's avatar
zk committed
38

zk's avatar
zk committed
39
40
41
42
- Node.js:建议 18 或更高版本;当前代码兼容 Node.js 12+。
- npm:通常随 Node.js 一起安装。
- OpenSSH 客户端:需要能执行 `ssh`
- 网络能访问被监控服务器的 SSH 端口,默认 `22`
zk's avatar
zk committed
43

zk's avatar
zk committed
44
被监控服务器需要:
zk's avatar
zk committed
45

zk's avatar
zk committed
46
47
48
- 海光 DCU 服务器能执行 `hy-smi`
- NVIDIA GPU 服务器能执行 `nvidia-smi`
- 部署机器必须能免密 SSH 登录被监控服务器。
zk's avatar
zk committed
49

zk's avatar
zk committed
50
添加服务器前,先在部署机器上验证免密访问和采集命令,例如:
zk's avatar
zk committed
51

zk's avatar
zk committed
52
```bash
zk's avatar
zk committed
53
54
55
56
ssh root@10.0.0.12 hy-smi
ssh root@10.0.0.13 nvidia-smi
```

zk's avatar
zk committed
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
如果这里需要输入密码,网页里添加后也会采集失败。需要先把部署机器的 SSH 公钥加入目标服务器的 `authorized_keys`

## Windows 部署

1. 安装 Node.js。

   下载并安装 Node.js LTS 版本。安装后在 PowerShell 验证:

   ```powershell
   node -v
   npm -v
   ssh -V
   ```

2. 配置免密 SSH。

   如果本机还没有 SSH key:

   ```powershell
   ssh-keygen -t ed25519
   ```

`C:\Users\你的用户名\.ssh\id_ed25519.pub` 的内容追加到每台被监控服务器的 `~/.ssh/authorized_keys`

3. 启动服务。

   在项目目录执行:

   ```powershell
   npm start
   ```

   或双击:

   ```text
   start-windows.bat
   ```

4. 打开页面。

   ```text
   http://localhost:3066
   ```

   如果要让同网段其他机器访问,需要放行 Windows 防火墙的 `3066` 端口,然后访问:

   ```text
   http://部署机器IP:3066
   ```

## Linux 部署
zk's avatar
zk committed
108

zk's avatar
zk committed
109
1. 安装 Node.js、npm 和 OpenSSH 客户端。
zk's avatar
zk committed
110

zk's avatar
zk committed
111
   RHEL/Kylin/CentOS 类系统:
zk's avatar
zk committed
112

zk's avatar
zk committed
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
   ```bash
   sudo dnf install -y nodejs npm openssh-clients
   ```

   Ubuntu/Debian 类系统:

   ```bash
   sudo apt update
   sudo apt install -y nodejs npm openssh-client
   ```

2. 配置免密 SSH。

   ```bash
   ssh-keygen -t ed25519
   ```

   将部署机器的公钥追加到每台被监控服务器的 `~/.ssh/authorized_keys`。验证:

   ```bash
   ssh root@10.0.0.12 hy-smi
   ssh root@10.0.0.13 nvidia-smi
   ```

3. 启动服务。

   ```bash
   cd gpu-dcu-monitor
   npm start
   ```

4. 后台常驻运行。

   可以使用 systemd。创建 `/etc/systemd/system/gpu-dcu-monitor.service`

   ```ini
   [Unit]
   Description=GPU DCU Server Monitor
   After=network-online.target
   Wants=network-online.target

   [Service]
   Type=simple
   WorkingDirectory=/opt/gpu-dcu-monitor
   Environment=PORT=3066
   Environment=POLL_INTERVAL_MS=10000
   Environment=SSH_TIMEOUT_MS=20000
zk's avatar
zk committed
160
   Environment=ASSET_REFRESH_INTERVAL_MS=1800000
zk's avatar
zk committed
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
   ExecStart=/usr/bin/node /opt/gpu-dcu-monitor/server.js
   Restart=always
   RestartSec=3
   User=root

   [Install]
   WantedBy=multi-user.target
   ```

   启动并设置开机自启:

   ```bash
   sudo systemctl daemon-reload
   sudo systemctl enable --now gpu-dcu-monitor
   sudo systemctl status gpu-dcu-monitor
   ```

## 添加服务器

在页面点击“添加服务器”,填写:

- 名称:看板上显示的服务器名称。
- Host / IP:服务器 IP 或主机名。
- SSH 用户:默认 `root`
- 端口:默认 `22`
- 分组:例如通信组、政府组、金融组、NV 环境等。
- 标签:可选,用于补充公共池、回归、临时等信息。
- 采集命令:海光选择 `hy-smi`,NVIDIA 选择 `nvidia-smi`

保存后会立即采集一次,并自动识别卡数和型号。

## 配置文件

真实服务器配置保存在:
zk's avatar
zk committed
195
196
197
198
199

```text
data/servers.json
```

zk's avatar
zk committed
200
示例配置:
zk's avatar
zk committed
201
202
203
204
205

```text
data/servers.sample.json
```

zk's avatar
zk committed
206
服务器配置支持 `group` 分组字段。页面会根据已有服务器自动生成分组筛选入口;`tags` 用于补充额外标签。
zk's avatar
zk committed
207

zk's avatar
zk committed
208
209
210
211
212
213
214
215
216
217
218
219
220
221
多站点入口配置保存在:

```text
data/sites.json
```

示例配置:

```text
data/sites.sample.json
```

每套部署可以维护自己的 `current``sites`。例如昆山服务可以把当前站点写成“昆山 / 天津中心”,并在 `sites` 里加入太原服务地址;太原服务则把当前站点写成“太原中心”,同时保留返回昆山服务的地址。`data/sites.json` 属于本地运行配置,不会提交到仓库。

zk's avatar
zk committed
222
223
224
225
226
227
228
229
程序会定期把服务器配置备份到:

```text
data/backups/
```

默认保留最近 30 份备份。

zk's avatar
zk committed
230
231
## 环境变量

zk's avatar
zk committed
232
233
Windows PowerShell 示例:

zk's avatar
zk committed
234
235
236
```powershell
$env:PORT=3066
$env:POLL_INTERVAL_MS=10000
zk's avatar
zk committed
237
$env:SSH_TIMEOUT_MS=20000
zk's avatar
zk committed
238
239
240
npm start
```

zk's avatar
zk committed
241
242
243
244
245
246
Linux 示例:

```bash
PORT=3066 POLL_INTERVAL_MS=10000 SSH_TIMEOUT_MS=20000 npm start
```

zk's avatar
zk committed
247
248
249
250
常用配置:

- `PORT`:网页端口,默认 `3066`
- `POLL_INTERVAL_MS`:自动采集间隔,默认 `10000` 毫秒。
zk's avatar
zk committed
251
- `SSH_TIMEOUT_MS`:单台服务器 SSH/采集命令超时,默认 `20000` 毫秒。部分 NVIDIA 机器执行 `nvidia-smi` 较慢时可以继续调大。
zk's avatar
zk committed
252
253
254
255
256
257
258
259
- `REFRESH_CONCURRENCY`:GPU/DCU 状态采集并发数,默认 `8`
- `ASSET_REFRESH_INTERVAL_MS`:模型资产和 Docker 镜像盘点间隔,默认 `1800000` 毫秒。
- `ASSET_SSH_TIMEOUT_MS`:单台服务器资产盘点 SSH 超时,默认 `30000` 毫秒。
- `ASSET_CONCURRENCY`:资产盘点并发数,默认 `3`
- `ASSET_PATHS`:模型目录扫描路径,默认 `/models,/public,/data`
- `ASSET_MAX_ITEMS`:每台服务器最多返回的模型条目和镜像条目数量,默认 `160`
- `BACKUP_INTERVAL_MS`:服务器配置定期备份间隔,默认 `86400000` 毫秒。
- `BACKUP_RETENTION`:服务器配置备份保留份数,默认 `30`
zk's avatar
zk committed
260
261
262
263
264
- `SITE_ID`:当前站点 ID,默认 `local`
- `SITE_NAME`:当前站点显示名称,默认 `本地中心`
- `SITE_DESCRIPTION`:当前站点说明,默认 `共享测试资源`
- `SITE_URL`:当前站点访问地址,默认 `/`
- `SITE_LINKS`:无 `data/sites.json` 时使用的站点列表,支持 JSON 数组,或 `名称|地址|说明;名称|地址|说明` 格式。
zk's avatar
zk committed
265
266
- `SSH_PATH`:自定义 SSH 程序路径。Windows 默认使用 `C:\Windows\System32\OpenSSH\ssh.exe`

zk's avatar
zk committed
267
## 运维命令
zk's avatar
zk committed
268

zk's avatar
zk committed
269
systemd 部署时常用命令:
zk's avatar
zk committed
270

zk's avatar
zk committed
271
272
273
274
```bash
systemctl status gpu-dcu-monitor
systemctl restart gpu-dcu-monitor
journalctl -u gpu-dcu-monitor -f
zk's avatar
zk committed
275
276
```

zk's avatar
zk committed
277
检查端口:
zk's avatar
zk committed
278

zk's avatar
zk committed
279
280
```bash
ss -lntp | grep 3066
zk's avatar
zk committed
281
282
283
284
```

## 注意事项

zk's avatar
zk committed
285
286
287
- 如果页面能打开但服务器显示离线,优先在部署机器上手动执行 `ssh root@目标IP hy-smi``ssh root@目标IP nvidia-smi`
- 如果 NVIDIA 服务器偶发超时,可以调大 `SSH_TIMEOUT_MS`
- 如果多人共同查看,建议部署在一台固定机器上,由这台机器统一采集。
zk's avatar
zk committed
288
- 模型资产盘点默认不计算目录大小,避免对大模型盘产生明显 IO 压力。