From fad4dce56a10a5eef93b958862579a1b23bc866e Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?=E9=B1=BC=E9=AA=A8=E5=89=AA?= <1580622474@qq.com>
Date: Thu, 3 Oct 2024 11:33:08 +0800
Subject: [PATCH] =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E4=BA=86=E5=86=85=E5=AD=98?=
=?UTF-8?q?=E7=9A=84=E6=98=BE=E7=A4=BA?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
---
app.py | 19 ++++++++++++++++++-
index.html | 28 +++++++++++++++++++++++++---
2 files changed, 43 insertions(+), 4 deletions(-)
diff --git a/app.py b/app.py
index 07de284..dc81a1e 100644
--- a/app.py
+++ b/app.py
@@ -98,13 +98,27 @@ def get_storage_info(client, timeout, path_list):
return result
+def get_memory_info(client, timeout):
+
+ stdin, stdout, stderr = client.exec_command('free', timeout=timeout)
+ output = stdout.read().decode().split('\n')[1]
+ if output == "":
+ return None
+ data = output.split()
+ result = {
+ "total": int(data[1]),
+ "used": int(data[2])
+ }
+
+ return result
+
# 持续获取一个服务器的信息
def keep_check_one(server: dict, shared_data_list: dict, server_title: str, interval: float, re_connect_time: float=5):
# 处理一下需要检查的存储空间路径
if not 'storage_list' in server:
server['storage_list'] = []
if not '/' in server['storage_list']:
- server['storage_list'].append('/')
+ server['storage_list'].insert(0, '/')
re_try_count = 0
# 循环连接
@@ -127,12 +141,14 @@ def keep_check_one(server: dict, shared_data_list: dict, server_title: str, inte
gpu_info = get_gpus_info(client, interval*3)
# 存储空间信息
storage_info = get_storage_info(client, interval*3, server['storage_list'])
+ memory_info = get_memory_info(client, interval*3)
# locked = False
with data_list_lock:
# locked = True
shared_data_list[server_title]['gpu_info_list'] = gpu_info
shared_data_list[server_title]['storage_info_list'] = storage_info
+ shared_data_list[server_title]['memory_info'] = memory_info
shared_data_list[server_title]['updated'] = True
shared_data_list[server_title]['maxGPU'] = len(gpu_info)
# locked = False
@@ -180,6 +196,7 @@ def filter_data(title_list: list):
err_info = data_dict[title].get('err_info', '')
server_data[title]['gpu_info_list'] = gpu_info_list
server_data[title]['storage_info_list'] = data_dict[title].get('storage_info_list', [])
+ server_data[title]['memory_info'] = data_dict[title].get('memory_info', {})
server_data[title]['updated'] = data_updated
server_data[title]['err_info'] = err_info
result['time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
diff --git a/index.html b/index.html
index 5b3feee..5db6b51 100644
--- a/index.html
+++ b/index.html
@@ -104,11 +104,32 @@
serverCard.appendChild(serverName);
// 分割线
add_bar(serverCard);
+ // 内存
+ if ('memory_info' in serverData[key]){
+ let memoryInfo = document.createElement('div');
+ memoryInfo.classList.add('memory-info');
+
+ let totalNum = serverData[key].memory_info.total
+ let usedNum = serverData[key].memory_info.used
+ let totalMem = parse_storage(totalNum);
+ let usedMem = parse_storage(usedNum);
+ let tmpColor = "green";
+ if (usedNum / totalNum > 0.8)
+ tmpColor = "red";
+ else if (usedNum / totalNum > 0.6)
+ tmpColor = "orange";
+
+ memoryInfo.innerHTML += " 内存 : " + usedMem + " / " + totalMem + "
";
+
+ serverCard.appendChild(memoryInfo);
+ // 分割线
+ add_bar(serverCard);
+ }
// 存储空间
if ('storage_info_list' in serverData[key]){
let storageInfo = document.createElement('div');
- storageInfo.classList.add('storage-info');
+ storageInfo.classList.add('storage-info');
for (let i = 0; i < serverData[key].storage_info_list.length; i++) {
let targetPath = serverData[key].storage_info_list[i].path;
@@ -126,9 +147,10 @@
}
serverCard.appendChild(storageInfo);
+ // 分割线
+ add_bar(serverCard);
}
- // 分割线
- add_bar(serverCard);
+
// gpu
if ('gpu_info_list' in serverData[key]){
serverData[key].gpu_info_list.forEach(function(gpu){