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){