diff --git a/README.md b/README.md new file mode 100644 index 0000000..112c274 --- /dev/null +++ b/README.md @@ -0,0 +1,12 @@ +# 1. 简介 +TODO +# 2. 安装 +## 2.1. 运行环境 +TODO +## 2.2. 服务器环境 +因为本质上是通过ssh连接服务器,然后通过命令来获取相应的信息,有的命令可能服务器系统上不自带需要另外安装,否则无法获取到对应的数据。 +- **ifstat**,用于获取网络数据的工具,可通过apt安装。并且需要在服务器上运行一下命令,查看哪个网卡才是主要的,写到配置文件里去。 +- **nvidia驱动**,需要安装N卡的驱动,通过`nvidia-smi`来获取显卡信息。 + +## 2.3. 网页部署 +TODO \ No newline at end of file diff --git a/app.py b/app.py index cc9bbcc..64d6235 100644 --- a/app.py +++ b/app.py @@ -124,6 +124,23 @@ def get_memory_info(client, timeout, info_list:list=None): info_list.append(f'memory: {e}') return None +def get_network_info(client, timeout, interface_name, info_list:list=None): + try: + if interface_name is None: + return None + stdin, stdout, stderr = client.exec_command(f'ifstat -i {interface_name} 0.1 1', timeout=timeout) + output = stdout.read().decode().split('\n')[2] + data = output.split() + result = { + "in": float(data[0]), + "out": float(data[1]) + } + return result + except Exception as e: + if info_list is not None: + info_list.append(f'network: {e}') + return None + # 持续获取一个服务器的信息 def keep_check_one(server: dict, shared_data_list: dict, server_title: str, interval: float, re_connect_time: float=5): # 处理一下需要检查的存储空间路径 @@ -156,12 +173,15 @@ def keep_check_one(server: dict, shared_data_list: dict, server_title: str, inte storage_info = get_storage_info(client, interval*3, server['storage_list'], info_list=error_info_list) # 内存信息 memory_info = get_memory_info(client, interval*3, info_list=error_info_list) + # 网络信息 + network_info = get_network_info(client, interval*3, server.get('network_interface_name', None), info_list=error_info_list) # 记录信息 with data_list_lock: 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]['network_info'] = network_info shared_data_list[server_title]['updated'] = True shared_data_list[server_title]['maxGPU'] = len(gpu_info) if len(error_info_list) > 0: @@ -217,6 +237,11 @@ def filter_data(title_list: list): memory_info = data_dict[title].get('memory_info', None) if memory_info is not None: server_data[title]['memory_info'] = memory_info + # 网络 + network_info = data_dict[title].get('network_info', None) + if network_info is not None: + server_data[title]['network_info'] = network_info + result['time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S') result['server_data'] = server_data return result diff --git a/index.html b/index.html index 92841de..4480179 100644 --- a/index.html +++ b/index.html @@ -107,6 +107,22 @@ let updateFlag = serverData[key].updated ? '' : ' - Not updated -'; serverName.textContent = key + updateFlag; serverCard.appendChild(serverName); + + // 网速 + if ('network_info' in serverData[key]){ + let networkInfo = document.createElement('div'); + networkInfo.classList.add('network-info'); + + let inNum = serverData[key].network_info.in; + let outNum = serverData[key].network_info.out; + + networkInfo.innerHTML += " 网络 : in: " + inNum.toFixed(1) + " KB/s, out: " + outNum.toFixed(1) + " KB/s"; + + serverCard.appendChild(networkInfo); + // 分割线 + add_bar(serverCard); + } + // 内存 if ('memory_info' in serverData[key]){ let memoryInfo = document.createElement('div'); @@ -175,6 +191,8 @@ serverCard.appendChild(gpuInfo); }); } + + // 错误信息 if ('err_info' in serverData[key]) { // 分割线