视频1 视频21 视频41 视频61 视频文章1 视频文章21 视频文章41 视频文章61 推荐1 推荐3 推荐5 推荐7 推荐9 推荐11 推荐13 推荐15 推荐17 推荐19 推荐21 推荐23 推荐25 推荐27 推荐29 推荐31 推荐33 推荐35 推荐37 推荐39 推荐41 推荐43 推荐45 推荐47 推荐49 关键词1 关键词101 关键词201 关键词301 关键词401 关键词501 关键词601 关键词701 关键词801 关键词901 关键词1001 关键词1101 关键词1201 关键词1301 关键词1401 关键词1501 关键词1601 关键词1701 关键词1801 关键词1901 视频扩展1 视频扩展6 视频扩展11 视频扩展16 文章1 文章201 文章401 文章601 文章801 文章1001 资讯1 资讯501 资讯1001 资讯1501 标签1 标签501 标签1001 关键词1 关键词501 关键词1001 关键词1501 专题2001
Python监控进程性能数据并绘图保存为PDF文档
2020-11-27 14:41:51 责编:小采
文档


引言

利用psutil模块(https://pypi.python.org/pypi/psutil/),能够非常方便的监控系统的CPU、内存、磁盘IO、网络带宽等性能参数,以下是否代码为监控某个特定程序的CPU资源消耗,打印监控数据,最终绘图显示,并且保存为指定的 PDF 文档备份。

示范代码

#!/usr/bin/env python
# -*- coding: utf-8 -*-
'''
Copyright (C) 2015 By Thomas Hu. All rights reserved.

@author : Thomas Hu (thomashtq#163.com)
@version: 1.0
@created: 2015-7-14
'''
import matplotlib.pyplot as plt
import psutil as ps
import os
import time
import random
import collections
import argparse

class ProcessMonitor(object):
 def __init__(self, key_name, fields, duration, interval):
 self.key_name = key_name
 self.fields = fields
 self.duration = float(duration)
 self.inveral = float(interval)

 self.CPU_COUNT = ps.cpu_count()
 self.MEM_TOTAL = ps.virtual_memory().total / (1024 * 1024)
 self.procinfo_dict = collections.defaultdict(dict)


 def _get_proc_info(self, pid):
 try:
 proc = ps.Process(pid)
 name = proc.name()
 # If not contains the key word, return None
 if name.find(self.key_name) == -1:
 return None
 pinfo = {
 "name": name,
 "pid" : pid,
 }
 # If the field is correct, add it to the process information dictionary.
 for field in self.fields:
 if hasattr(proc, field):
 if field == "cpu_percent":
 pinfo[field] = getattr(proc, field)(interval = 0.1) / self.CPU_COUNT
 elif field == "memory_percent":
 pinfo[field] = getattr(proc, field)() * self.MEM_TOTAL / 100
 else:
 pinfo[field] = getattr(proc, field)()
 if pid not in self.procinfo_dict:
 self.procinfo_dict[pid] = collections.defaultdict(list)
 self.procinfo_dict[pid]["name"] = name
 for field in self.fields:
 self.procinfo_dict[pid][field].append(pinfo.get(field, 0))
 print(pinfo)
 return pinfo
 except:
 pass
 return None

 def monitor_processes(self):
 start = time.time()
 while time.time() - start < self.duration:
 try:
 pids = ps.pids()
 for pid in pids:
 self._get_proc_info(pid)
 except KeyboardInterrupt:
 print("Killed by user keyboard interrupted!")
 return

 def _get_color(self):
 color = "#"
 for i in range(3):
 a = hex(random.randint(0, 255))[2:]
 if len(a) == 1:
 a = "0" + a
 color += a
 return color.upper()

 def draw_figure(self, field, pdf):
 # Draw each pid line
 for pid in self.procinfo_dict:
 x = range(len(self.procinfo_dict[pid][field]))
 #print x, self.procinfo_dict[pid][field]
 plt.plot(x, self.procinfo_dict[pid][field], label = "pid" + str(pid), color = self._get_color())
 plt.xlabel(time.strftime("%Y-%m-%d %H:%M:%S"))
 plt.ylabel(field.upper())
 plt.title(field + " Figure")
 plt.legend(loc = "upper left")
 plt.grid(True)
 plt.savefig(pdf, dpi = 200)
 plt.show()

def Main():
 parser = argparse.ArgumentParser(description='Monitor process CPU and Memory.')
 parser.add_argument("-k", dest='key', type=str, default="producer", 
 help='the key word of the processes to be monitored(default is "producer")')
 parser.add_argument("-d", dest='duration', type=int, default=60,
 help='duration of the monitor to run(unit: seconds, default is 60)')
 parser.add_argument('-i', dest='interval', type=float, default=1.0,
 help='interval of the sample(unit: seconds, default is 1.0)')
 args = parser.parse_args()
 fields = ["cpu_percent", "memory_percent"]
 #print args.key, args.duration, args.interval
 pm = ProcessMonitor(args.key, fields, args.duration, args.interval)
 pm.monitor_processes()
 pm.draw_figure("cpu_percent", "cpu.pdf")
 pm.draw_figure("memory_percent", "mem.pdf")


if __name__ == "__main__":
 Main()
 
 



输出结果示范图

下载本文
显示全文
专题