|
|
@@ -17,7 +17,7 @@ class Monitor:
|
|
|
self.curr_system_net_io_counter = None # 系统网络读写计数器
|
|
|
self.data_points=[] # 数据点
|
|
|
self.max_count = 1
|
|
|
- self.usage = self.__init_usage
|
|
|
+ self.__usage = self.__init_usage
|
|
|
self.usage_map = {
|
|
|
"pid": '进程名称',
|
|
|
"now_time": '当前时间',
|
|
|
@@ -48,11 +48,11 @@ class Monitor:
|
|
|
self.process = None
|
|
|
if self.process:
|
|
|
print(f"成功附加到进程: {self.process.name()} (PID: {pid})")
|
|
|
- self.usage["name"] = self.process.name()
|
|
|
- self.usage["pid"] = f'{self.process.pid}'
|
|
|
- self.usage["pwd"] = self.process.cwd()
|
|
|
- self.usage["exe"] = self.process.exe()
|
|
|
- self.usage["start_time"] = datetime.fromtimestamp(self.process.create_time()).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ self.__usage["name"] = self.process.name()
|
|
|
+ self.__usage["pid"] = f'{self.process.pid}'
|
|
|
+ self.__usage["pwd"] = self.process.cwd()
|
|
|
+ self.__usage["exe"] = self.process.exe()
|
|
|
+ self.__usage["start_time"] = datetime.fromtimestamp(self.process.create_time()).strftime('%Y-%m-%d %H:%M:%S')
|
|
|
|
|
|
|
|
|
@property
|
|
|
@@ -83,28 +83,28 @@ class Monitor:
|
|
|
rss_mb = mem_info.rss / (1024 * 1024) # 转换为MB 物理内存
|
|
|
vms_mb = mem_info.vms / (1024 * 1024) # 虚拟内存
|
|
|
memory_usage_percent = self.process.memory_percent()
|
|
|
- self.usage["rss"] = f'{rss_mb:.2f}MB' # 物理内存
|
|
|
- self.usage["vms"] = f'{vms_mb:.2f}MB' # 虚拟内存
|
|
|
- self.usage["mem_pct"] = f'{memory_usage_percent:.2f}%' # 占用百分比
|
|
|
+ self.__usage["rss"] = f'{rss_mb:.2f}MB' # 物理内存
|
|
|
+ self.__usage["vms"] = f'{vms_mb:.2f}MB' # 虚拟内存
|
|
|
+ self.__usage["mem_pct"] = f'{memory_usage_percent:.2f}%' # 占用百分比
|
|
|
|
|
|
def __get_cpu_usage_info(self):
|
|
|
# 获取CPU使用率,设置采样间隔为1秒
|
|
|
cpu_usage = self.process.cpu_percent(interval=1.0)
|
|
|
- self.usage["cpu_pct"] = f'{cpu_usage:.2f}%'
|
|
|
+ self.__usage["cpu_pct"] = f'{cpu_usage:.2f}%'
|
|
|
|
|
|
def __get_disk_io_info(self):
|
|
|
"""统计磁盘读写速度"""
|
|
|
new_io_counter = self.process.io_counters()
|
|
|
read_bytes_diff = (new_io_counter.read_bytes - self.curr_disk_io_counter.read_bytes) / (1024 ** 2)
|
|
|
write_bytes_diff = (new_io_counter.write_bytes - self.curr_disk_io_counter.write_bytes) / (1024 ** 2)
|
|
|
- if not self.usage.get('now_time', None):
|
|
|
+ if not self.__usage.get('now_time', None):
|
|
|
raise RuntimeError('存在逻辑错误, 时间获取前被使用')
|
|
|
- time_diff = (datetime.now()-datetime.strptime(self.usage['now_time'], '%Y-%m-%d %H:%M:%S')).total_seconds()
|
|
|
+ time_diff = (datetime.now() - datetime.strptime(self.__usage['now_time'], '%Y-%m-%d %H:%M:%S')).total_seconds()
|
|
|
# 计算速率MB/秒
|
|
|
read_speed_mB = (read_bytes_diff / time_diff) if time_diff > 0 else 0
|
|
|
write_speed_mB = (write_bytes_diff / time_diff) if time_diff > 0 else 0
|
|
|
- self.usage['disk_read'] = f'{read_speed_mB:.2f} MB/s'
|
|
|
- self.usage['disk_write'] = f'{write_speed_mB:.2f} MB/s'
|
|
|
+ self.__usage['disk_read'] = f'{read_speed_mB:.2f} MB/s'
|
|
|
+ self.__usage['disk_write'] = f'{write_speed_mB:.2f} MB/s'
|
|
|
self.curr_disk_io_counter = new_io_counter
|
|
|
|
|
|
def __get_net_io_info(self):
|
|
|
@@ -112,13 +112,13 @@ class Monitor:
|
|
|
new_net_io_counter = psutil.net_io_counters()
|
|
|
sent_bytes_mB = (new_net_io_counter.bytes_sent - self.curr_system_net_io_counter.bytes_sent) / (1024 ** 2)
|
|
|
recv_bytes_mB = (new_net_io_counter.bytes_recv - self.curr_system_net_io_counter.bytes_recv) / (1024 ** 2)
|
|
|
- if not self.usage.get('now_time', None):
|
|
|
+ if not self.__usage.get('now_time', None):
|
|
|
raise RuntimeError('存在逻辑错误, 时间获取前被使用')
|
|
|
- time_diff = (datetime.now()-datetime.strptime(self.usage['now_time'], '%Y-%m-%d %H:%M:%S')).total_seconds()
|
|
|
+ time_diff = (datetime.now() - datetime.strptime(self.__usage['now_time'], '%Y-%m-%d %H:%M:%S')).total_seconds()
|
|
|
sys_net_send_speed = (sent_bytes_mB / time_diff ) if time_diff > 0 else 0
|
|
|
sys_net_recv_speed = (recv_bytes_mB / time_diff ) if time_diff > 0 else 0
|
|
|
- self.usage['sys_net_send'] = f'{sys_net_send_speed:.2f} MB/s'
|
|
|
- self.usage['sys_net_recv'] = f'{sys_net_recv_speed:.2f} MB/s'
|
|
|
+ self.__usage['sys_net_send'] = f'{sys_net_send_speed:.2f} MB/s'
|
|
|
+ self.__usage['sys_net_recv'] = f'{sys_net_recv_speed:.2f} MB/s'
|
|
|
self.curr_system_net_io_counter = new_net_io_counter
|
|
|
|
|
|
def __get_gpu_usage_info(self):
|
|
|
@@ -152,11 +152,11 @@ class Monitor:
|
|
|
except:
|
|
|
power_watts = 0
|
|
|
device_id = f'gpu_{i}_'
|
|
|
- self.usage[device_id+'mem'] = memory_mb # 显存 MB
|
|
|
- self.usage[device_id+'rate_gpu'] = gpu_util.gpu if gpu_util else 0 # GPU利用率 %
|
|
|
- self.usage[device_id+'rate_mem'] = gpu_util.memory if gpu_util else 0 # 显存利用率 %
|
|
|
- self.usage[device_id+'temperature'] = temperature # 显卡温度 °C
|
|
|
- self.usage[device_id+'power'] = power_watts # 显卡功耗 W
|
|
|
+ self.__usage[device_id + 'mem'] = memory_mb # 显存 MB
|
|
|
+ self.__usage[device_id + 'rate_gpu'] = gpu_util.gpu if gpu_util else 0 # GPU利用率 %
|
|
|
+ self.__usage[device_id + 'rate_mem'] = gpu_util.memory if gpu_util else 0 # 显存利用率 %
|
|
|
+ self.__usage[device_id + 'temperature'] = temperature # 显卡温度 °C
|
|
|
+ self.__usage[device_id + 'power'] = power_watts # 显卡功耗 W
|
|
|
# print(f"GPU {i}:")
|
|
|
# print(f" 内存使用: {memory_mb:.2f} MB")
|
|
|
# print(f" GPU 利用率: {gpu_util.gpu if gpu_util else 0}%")
|
|
|
@@ -176,10 +176,10 @@ class Monitor:
|
|
|
# 时间间隔
|
|
|
time.sleep(self.interval)
|
|
|
# 初始化记录
|
|
|
- self.usage = self.__init_usage
|
|
|
+ self.__usage = self.__init_usage
|
|
|
# 刷新时间
|
|
|
- self.usage['now_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
- self.usage['status'] = self.process.status()
|
|
|
+ self.__usage['now_time'] = datetime.now().strftime('%Y-%m-%d %H:%M:%S')
|
|
|
+ self.__usage['status'] = self.process.status()
|
|
|
# 刷新内存使用情况
|
|
|
self.__get_memory_usage_info()
|
|
|
# 刷新cpu使用情况
|
|
|
@@ -190,14 +190,14 @@ class Monitor:
|
|
|
self.__get_net_io_info()
|
|
|
# 获取GPU使用情况
|
|
|
self.__get_gpu_usage_info()
|
|
|
- print(self.usage)
|
|
|
+ print(self.__usage)
|
|
|
if output_file:
|
|
|
- self.data_points.append(self.usage.copy())
|
|
|
+ self.data_points.append(self.__usage.copy())
|
|
|
if len(self.data_points) >= self.max_count: # 如果达到100个数据点,则保存到CSV文件中,并清空数据点
|
|
|
# 检查文件是否存在,以决定是否需要写入标题行
|
|
|
file_exists = os.path.isfile(output_file)
|
|
|
with open(output_file, 'a', newline='', encoding='utf-8') as csvfile:
|
|
|
- writer = csv.DictWriter(csvfile, fieldnames=self.usage.keys())
|
|
|
+ writer = csv.DictWriter(csvfile, fieldnames=self.__usage.keys())
|
|
|
# 如果文件不存在,写入标题行
|
|
|
print(f'psutil 保存文件:{output_file}')
|
|
|
if not file_exists:
|
|
|
@@ -206,14 +206,16 @@ class Monitor:
|
|
|
writer.writerows(self.data_points)
|
|
|
# 清空数据点列表
|
|
|
self.data_points = []
|
|
|
-
|
|
|
+ @property
|
|
|
+ def data(self):
|
|
|
+ return self.__usage
|
|
|
def start(self, interval=1, output_file=None):
|
|
|
if self.process:
|
|
|
while psutil.pid_exists(self.pid):
|
|
|
try:
|
|
|
with self.process.oneshot():
|
|
|
self.update(output_file=output_file)
|
|
|
- print(self.usage)
|
|
|
+ print(self.__usage)
|
|
|
except Exception as e:
|
|
|
break
|
|
|
def main():
|