一个简易的多GPU服务器监控程序

news/2024/11/16 20:53:59/

前言

因为实验室有很多台 GPU 服务器,每次要运行代码都要一台一台跑上去看GPU有没有人用,所以就写了一个这种小程序。

https://github.com/rikonaka/watchcorgi

效果图

curl http://127.0.0.1:7070/info
>> 2023-06-03 12:01:31 [watchcorgi]
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   name  |cpu[s]|cpu[u]|              gpu device             |gpu[u]|       gpu[m]      |   gpu user   |update time|
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu1  | 0.0 %| 0.0 %|      A100-PCIE-40GB(460.106.00)     |  0 % |  0 MiB/40536 MiB  |     null     |  12:01:22 |
|         |      |      |      A100-PCIE-40GB(460.106.00)     | 17 % |  0 MiB/40536 MiB  |              |           |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu2  | 0.0 %| 0.0 %|  NVIDIA GeForce RTX 3090(515.65.01) |  0 % |  2 MiB/24576 MiB  |   StainAtt   |  12:01:30 |
|         |      |      |  NVIDIA GeForce RTX 3090(515.65.01) | 91 % |12611 MiB/24576 MiB|              |           |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu3  | 0.0 %| 0.0 %|NVIDIA GeForce GTX 1080 Ti(530.30.02)|  0 % |  0 MiB/11264 MiB  |     null     |  12:01:24 |
|         |      |      |NVIDIA GeForce GTX 1080 Ti(530.30.02)|  1 % |  0 MiB/11264 MiB  |              |           |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu4  | 0.0 %| 0.2 %|                                     |      |                   | driver failed|  12:01:25 |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu5  | 0.0 %| 0.0 %|NVIDIA GeForce RTX 2080 Ti(530.30.02)|  0 % |  0 MiB/11264 MiB  |     null     |  12:01:20 |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu6  | 0.1 %| 0.0 %|         Quadro P5000(510.54)        | 100 %|16145 MiB/16384 MiB|      CNN     |  12:01:29 |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu7  | 0.0 %| 0.0 %|      A100-PCIE-40GB(460.106.00)     |  0 % |39262 MiB/40536 MiB|    API-Net   |  12:01:28 |
|         |      |      |      A100-PCIE-40GB(460.106.00)     |  0 % |  3 MiB/40536 MiB  |              |           |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu8  | 0.0 %| 0.0 %|NVIDIA GeForce RTX 2080 Ti(510.47.03)|  0 % |  1 MiB/11264 MiB  |     null     |  12:01:26 |
|         |      |      |NVIDIA GeForce RTX 2080 Ti(510.47.03)|  0 % |  1 MiB/11264 MiB  |              |           |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|   gpu9  | 0.0 %| 0.0 %|  NVIDIA A100-PCIE-40GB(525.116.03)  | 83 % |18796 MiB/40960 MiB|OpenHGNN_final|  12:01:23 |
|         |      |      |                                     |      |                   |   StainAtt   |           |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|  gpu10  | 0.0 %| 0.0 %| NVIDIA GeForce RTX 3090(525.116.03) |  0 % |  0 MiB/24576 MiB  |     null     |  12:01:28 |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|  gpu11  | 0.5 %| 4.2 %|   NVIDIA A100-PCIE-40GB(515.65.01)  | 91 % | 3671 MiB/40960 MiB|     liif     |  12:01:26 |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
|  gpu12  | 0.0 %| 0.0 %| NVIDIA GeForce RTX 4090(525.116.03) |  0 % |  0 MiB/24564 MiB  |     null     |  12:01:18 |
+---------+------+------+-------------------------------------+------+-------------------+--------------+-----------+
Powered by Rust

普通安装

安装之前确保 server 所在的服务器上有 redis

分别下载 client 和 server 程序,client 放在你GPU服务器上,server 随便放在另外一台服务器上。

https://github.com/rikonaka/watchcorgi/releases

之后分别运行 client 和 server 程序,client 这里的 address 参数放 server 所在服务器的 IP,默认端口是7070

watchcorgi-client --server gpu --address http://YOUR_SERVER_IP:7070/update --interval 9

这里是设置 server 的监听地址和监听端口

watchcorgi-server --address 0.0.0.0 --port 7070

当然,最好的还是用 systemd 来管理

systemd 安装

这个 service 文件仓库里面已经提供了一个,大家下下来然后对应修改一下里面的内容就行,这里提供一个版本的 service 文件

这是 client 的文件,我们记得把可执行文件换成你文件在的 PATH,你也可以图省事直接把文件拖到 /usr/bin 下面

修改 --address 参数,填 server 所在服务器的 IP 和端口就行,–interval 为多久发一次监控包,最小为 1,–server 为服务器类型,这里默认是 GPU 服务器,如果你也有 CPU 服务器就填 cpu

[Unit]
Description=Watchcorgi Client Service
After=network.target[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/watchcorgi-client --server gpu --address http://192.168.1.206:7070/update --interval 9
ExecReload=/usr/bin/watchcorgi-client --server gpu --address http://192.168.1.206:7070/update --interval 9
LimitNOFILE=1048576[Install]
WantedBy=multi-user.target

然后是 server 的 service 文件,这里的 --address 和 --port 都是后端监控地址,按需求改就行

[Unit]
Description=Watchcorgi Client Service
After=network.target[Service]
Type=simple
User=root
Restart=on-failure
RestartSec=5s
ExecStart=/usr/bin/watchcorgi-server --address 0.0.0.0 --port 7070
ExecReload=/usr/bin/watchcorgi-server --address 0.0.0.0 --port 7070
LimitNOFILE=1048576[Install]
WantedBy=multi-user.target

然后执行

cp watchcorgi-client.service /etc/systemd/system
systemctl enable watchcorgi-client.service
systemctl start watchcorgi-client.service
cp watchcorgi-server.service /etc/systemd/system
systemctl enable watchcorgi-server.service
systemctl start watchcorgi-server.service

前端

没有…不会写漂亮的网页,如果哪个大佬有这个能力可以写一下,命令行一辈子!

前端可以请求

http://YOUR_SERVER_IP:7070/info2

来获得一个JSON字段


http://www.ppmy.cn/news/190463.html

相关文章

python: zip 和unzip用法

a [1, 2] b [1, 3] zipped zip(a, b) zipped <zip at 0xa857448> list(zipped) [(1, 1), (2, 3)] c, d zip(*zip(a, b)) c, d list(c), list(d) ([1, 2], [1, 3])

zipfile.BadZipFile: File is not a zip file

zipfile.BadZipFile: File is not a zip file的问题复现步骤&#xff1a; 使用openpyxl的save函数&#xff0c;将数据保存在Excel文件中。在没有保存完成的情况下&#xff0c;又使用load_workbook函数加载该Excel文件。 解决方法&#xff1a;在执行完save前&#xff0c;不要使…

”拒绝访问,压缩包无法解压,压缩文件zipped无法创建指定的目录“的解决方法

电脑重装系统之后偶然间解压缩的时候提示拒绝访问&#xff0c;无法创建指定的目录。 分析应该是权限的问题&#xff0c;然后尝试给目标文件夹添加当前账户的控制许可&#xff0c;如下图&#xff1a; 再次解压即可完成。 原因应该是重装系统之后新的账户和原系统的硬盘文件之间的…

zip与zip(*)

zip创建一个聚合了来自每个可迭代对象中元素的迭代器。 zip返回一个元组的迭代器&#xff0c;其中的第 i 个元组包含来自每个参数序列或可迭代对象的第 i 个元素。 当所输入可迭代对象中最短的一个被耗尽时&#xff0c;迭代器将停止迭代。 zip*相当于zip的逆操作&#xff08;…

python zip(*zipped)的疑问

zipped zip([one, two, three], [1, 2, 3]) print(zipped) print(list(zipped)) print(zipped) letter, number zip(*zipped) # *将元组解压为列表&#xff0c;返回二维矩阵&#xff0c;再打包为元组&#xff0c;拆包为两个变量 print("num_zip: ", letter, numbe…

Windows11 拒绝访问压缩(zipped)文件夹

最近windows10被自动升级到windows11&#xff0c;使用的一个工具zip压缩包突然就无法解压了&#xff0c;提示&#xff1a; 拒绝访问压缩&#xff08;zipped)文件夹&#xff0c;提取文件之前&#xff0c;必须更改这个压缩文件夹的权限。 我的尝试&#xff1a;更改了这个压缩包文…

zip和unzip的使用方法

Linux系统中我们会经常用到压缩命令&#xff0c;由于我们经常办公是用windows&#xff0c;服务器用的是linux&#xff0c;所以很多时候会用zip压缩包&#xff0c;这里大概介绍下zip包在linux系统中压缩和解压命令 1、zip命令 比如我要将linux系统中/home/admin/result_html下…

解决 java.util.zip.ZipException: zip file is empty

报错 java.util.zip.ZipException: zip file is empty 解决方案 你待解压的zip文件是空的&#xff0c;0kb那种&#xff0c;把它换成可用的即可&#xff0c;例如我的文件如下&#xff1a; 我之前一直用的这个压缩包做测试&#xff0c;用着用着突然就给我报错了&#xff0c;…