【深度学习】性能监控

article/2024/3/2 12:20:20
性能监控

判断系统,然后再监控程序运行期间机器的性能

import psutil
import matplotlib.pyplot as plt
import time
import matplotlib
import subprocess
import platform
import os try:import GPUtilimport pynvml
except ImportError as e:print(f"导入GPU模块失败,请先安装GPU驱动:{e}")def is_windows():"""检查当前系统是否为Windows"""return platform.system() == "Windows"def is_linux():"""检查当前系统是否为Linux"""return platform.system() == "Linux"class Linux:"""Linux系统性能监控类"""@staticmethoddef get_cpu_info_linux():"""获取Linux系统的CPU使用率和频率"""cpu_usage = psutil.cpu_percent(interval=1)cpu_freq = psutil.cpu_freq().currentreturn cpu_usage, cpu_freq@staticmethoddef get_memory_info_linux():"""获取Linux系统的内存使用信息"""memory = psutil.virtual_memory()memory_used_gb = memory.used / (1024 ** 3)return memory_used_gb@staticmethoddef get_gpu_info_linux():"""获取Linux系统的GPU信息"""return 0, 0  # 示例值,需要实际实现@staticmethoddef get_cpu_model_unix():"""获取Unix系统的CPU型号"""try:if platform.system() == "Linux":with open('/proc/cpuinfo') as f:for line in f:if line.strip().startswith('model name'):return line.strip().split(':')[1].strip()elif platform.system() == "Darwin":return subprocess.check_output(["sysctl", "-n", "machdep.cpu.brand_string"],universal_newlines=True).strip()except Exception as e:print(f"Error: {e}")return Noneclass run:"""运行性能监控的主类"""def __init__(self):"""初始化run类,创建windows和Linux类的实例"""self.win = windows()self.linux = Linux()# 设置matplotlib以支持中文字符matplotlib.rcParams['font.sans-serif'] = ['SimHei']  # 'SimHei'是常用的中文黑体字体matplotlib.rcParams['axes.unicode_minus'] = False    # 用于正确显示负号matplotlib.rcParams['font.size'] = 12                # 调整字体大小def collect_system_data(self, total_duration, interval):"""根据当前系统是Windows还是Linux,收集系统数据"""if is_windows():return self.collect_system_data_windows(total_duration, interval)elif is_linux():return self.collect_system_data_linux(total_duration, interval)else:raise NotImplementedError("Unsupported operating system.")def collect_system_data_windows(self, total_duration, interval):"""在Windows系统上收集系统数据"""start_time = time.time()data = []gpu, gpu_handle = self.win.initialize_gpu_info()while time.time() - start_time < total_duration:cpu_usage, cpu_freq = self.win.get_cpu_info()memory_used_gb = self.win.get_memory_info()gpu_usage, gpu_memory_used = self.win.get_gpu_info(gpu)gpu_temp = self.win.get_gpu_temperature(gpu_handle)data.append((cpu_usage, cpu_freq, memory_used_gb, gpu_usage, gpu_memory_used, gpu_temp))time.sleep(interval)return datadef collect_system_data_linux(self, total_duration, interval):"""在Linux系统上收集系统数据"""start_time = time.time()data = []while time.time() - start_time < total_duration:cpu_usage, cpu_freq = self.linux.get_cpu_info_linux()memory_used_gb = self.linux.get_memory_info_linux()gpu_usage, gpu_memory_used = self.linux.get_gpu_info_linux()data.append((cpu_usage, cpu_freq, memory_used_gb, gpu_usage, gpu_memory_used))time.sleep(interval)def plot_system_data(self, data, cpu_model, gpu_list):"""绘制收集的系统数据并将其保存为PNG文件"""plt.figure(figsize=(14, 12))plt.subplots_adjust(hspace=0.5)titles = ['CPU 使用率 (%)', 'CPU 频率 (MHz)','内存使用量 (GB)', 'GPU 使用率 (%)','GPU 内存使用量 (MB)', 'GPU 温度 (°C)']for i in range(6):plt.subplot(3, 2, i + 1)plt.plot([entry[i] for entry in data], label=titles[i], color=['blue', 'green', 'red', 'purple', 'orange', 'cyan'][i])plt.title(f'{titles[i]}随时间变化')plt.xlabel('时间 (秒)')plt.ylabel(titles[i], rotation=0, labelpad=45)plt.legend()plt.suptitle(f'系统性能监控 \n\n CPU 型号:{cpu_model} \n GPU:{gpu_list[0]} \n 型号:{gpu_list[1]} \n 显存大小:{gpu_list[2]}(MB) \n', fontsize=16)plt.tight_layout()plt.savefig('间段性能图.png')# 显示图形plt.show()current_path = os.getcwd()print("当前工作目录是:", current_path)script_path = os.path.dirname(os.path.abspath(__file__))print("脚本所在目录是:", script_path)print("\n监控图表已保存为 '间段性能图.png'")# 还未调试完成def run_monitor(self, total_duration, interval):"""监控指定时间的系统性能"""cpu_model = self.linux.get_cpu_model_unix()print(cpu_model)gpu_info = self.win.get_gpu_xh_info()gpu_list = []if gpu_info:for gpu in gpu_info:gpu_list.append(gpu['GPU'])gpu_list.append(gpu['型号'])gpu_list.append(gpu['显存大小 (MB)'])else:print("无法获取GPU信息。请确保已安装NVIDIA驱动和nvidia-smi工具。")data = self.collect_system_data(total_duration, interval)self.plot_system_data(data, gpu_list)def run_and_monitor(self, script_path, interval=1):"""运行一个Python脚本并监控其性能"""spitted_test = script_path.split('.')[-1]if spitted_test == 'py': # python脚本process = subprocess.Popen(['python', script_path])elif spitted_test == 'ps1': # PowerShellprocess = subprocess.Popen(["powershell.exe", script_path], stdout=subprocess.PIPE)data = []while True:if process.poll() is not None:break  current_data = self.collect_system_data(1, interval)  if current_data:data.extend(current_data)time.sleep(interval)cpu_model = self.win.get_cpu_model_windows()gpu_info = self.win.get_gpu_xh_info()gpu_list = []if gpu_info:for gpu in gpu_info:gpu_list.append(gpu['GPU'])gpu_list.append(gpu['型号'])gpu_list.append(gpu['显存大小 (MB)'])else:print("无法获取GPU信息。请确保已安装NVIDIA驱动和nvidia-smi工具。")self.plot_system_data(data, cpu_model, gpu_list)class windows:"""Windows系统性能监控类"""def initialize_gpu_info(self):"""初始化并返回使用pynvml和GPUtil的GPU信息"""pynvml.nvmlInit()gpus = GPUtil.getGPUs()if gpus:return gpus[0], pynvml.nvmlDeviceGetHandleByIndex(0)return None, Nonedef get_cpu_info(self):"""获取并返回当前CPU的使用率和频率"""cpu_usage = psutil.cpu_percent(interval=1)cpu_freq = psutil.cpu_freq().currentreturn cpu_usage, cpu_freqdef get_memory_info(self):"""获取并返回以GB为单位的已使用内存量"""memory = psutil.virtual_memory()memory_used_gb = memory.used / (1024 ** 3)return memory_used_gbdef get_gpu_info(self, gpu):"""如果有GPU可用,则返回GPU的使用率和已使用内存"""if gpu:return gpu.load * 100, gpu.memoryUsedreturn 0, 0def get_gpu_temperature(self, handle):"""根据其句柄返回GPU的温度"""if handle:return pynvml.nvmlDeviceGetTemperature(handle, pynvml.NVML_TEMPERATURE_GPU)return 0def get_cpu_model_windows(self):"""获取Windows系统的CPU型号"""try:return subprocess.check_output(["wmic", "cpu", "get", "name"], universal_newlines=True).strip().split('\n')[2]except Exception as e:print(f"Error: {e}")return Nonedef get_gpu_xh_info(self):"""使用nvidia-smi命令获取有关GPU的扩展信息"""try:output = subprocess.check_output(['nvidia-smi', '--query-gpu=name,memory.total', '--format=csv,noheader,nounits'])output = output.decode('utf-8').strip().split('\n')gpu_info = [line.split(',') for line in output]gpu_data = []for idx, (model, memory) in enumerate(gpu_info):gpu_data.append({'GPU': idx + 1,'型号': model,'显存大小 (MB)': int(memory)})return gpu_dataexcept (subprocess.CalledProcessError, FileNotFoundError):return Noneif __name__ == "__main__":print('监控程序运行时的机器性能状态...\n 支持 py 和 ps1')script_path = input('输入程序路径:')jk_start=run()# script_path = 'run.py'print('start...\n')jk_start.run_and_monitor(script_path)print('end\n')print('5秒之后退出')time.sleep(5)

有个问题还没解决

pyinstaller --onefile .\monitor_performance.py

打包成exe执行之后,保存的图片中并没有画出线条


http://www.ngui.cc/article/show-1753820.html

相关文章

【开源】基于JAVA的医院门诊预约挂号系统

项目编号&#xff1a; S 033 &#xff0c;文末获取源码。 \color{red}{项目编号&#xff1a;S033&#xff0c;文末获取源码。} 项目编号&#xff1a;S033&#xff0c;文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 功能性需求2.1.1 数据中心模块2.1.2…

frp实现内网穿透(多端口穿透)

frp实现内网穿透 准备一个公网服务器&#xff08;腾讯、阿里、华为的云服务器&#xff09; 下载frp的安装包 下载对应系统的安装包&#xff0c;不要下错文件。 注意amd对应x86架构的系统 arm对应 arm架构系统&#xff08;macos&#xff09; 点击下载 查看文档将对应的安装包放…

医保支付方式探索——利益共享机制的文章分析

Care-coordination: Gain-sharing Agreements in Bundled Payment Models 分析一下这篇文章&#xff0c;这篇文章于2021年发表在POMS上&#xff0c;但是引用量没有那么高。这篇文章涉及到医疗捆绑支付&#xff0c;应该可以学习一下。 文章研究一个在一个以最小成本为目标的质…

ASP.NET版本WOL服务的使用

本文以WOL为例&#xff0c;演示如何通过 GPT-4 让其为 WebAPI 项目设计一个网页。其中介绍了如何让GPT4生成相关功能&#xff0c;添加动画效果&#xff0c;接口鉴权等。 1. 背景 前面我们已经完成了一个WOL服务的开发&#xff0c;并将其迁移改造为了 ASP.NET 服务并完成了部署…

Java的TPC通信

TPC通信-快速入门 TPC通信-客户端开发 TPC通信-服务端开发 TPC通信-多发多收 客户端 服务端 TPC通信-支持与多个客户端同时通信 服务端 独立线程对象

禁止谷歌浏览器自动更新

禁止谷歌浏览器自动更新 在使用Python包selenium的时候浏览器版版本发生变化后产生很多问题如&#xff1a; 1、直接版本不对应无法运行 2、版本不一致导致debug启动浏览器超级慢 这里是已谷歌浏览器为代表的。 禁止自动更新的方法如下&#xff1a; 1、WinR调出运行&#x…

深度学习与深度迁移学习有什么区别?

深度学习包含深度迁移学习&#xff0c;它们都利用了深层神经网络&#xff08;Deep Neural Network&#xff0c;DNN&#xff09;来处理数据&#xff0c;并从中学习特征。但是&#xff0c;它们也有一些区别。 深度学习是一种机器学习方法&#xff0c;它通过多层神经网络来自动学…

Ext4文件系统解析(三)

1、前言 前文已经讲述了如何根据索引号获取实际的文件内容。对于文件而言&#xff0c;到了这里已经结束了。 但是对于文件夹来说&#xff0c;我们还需要从数据块中解析出对应的数据。 而在文件系统的实现中&#xff0c;文件夹的实际存储方式有着两种不同的实现&#xff0c;经典…

【Android】Android Framework系列--Launcher3桌面图标加载流程

Launcher3桌面加载流程 Android Launcher3(简称Launcher&#xff09;启动后会加载桌面。基于Android12代码&#xff0c;分析一下桌面加载的流程。 一些相关的概念&#xff1a; WorkSpace&#xff1a;桌面。在桌面上可以添加快捷方式、Hoseat或Dock&#xff08;就是手机或者车…

自动化之旅:掌握Ansible常用模块的实用技巧

1 Ansible部署 1.1 三台机器配置 1台主控机器 2台被控机器 1.2 安装 dnf install ansible -yansible方便控制多台主机&#xff0c;比shell效率更高 1.3 配置文件 /etc/ansible/ansible.conf ##全局配置文件,默认很少修改 /etc/ansible/hosts ##全局主机清单清单文件2 构建…