Python监控进程性能数据并画图保存为PDF文档

引言

利用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()

输出结果示范图

时间: 2024-10-13 20:52:51

Python监控进程性能数据并画图保存为PDF文档的相关文章

python监控linux性能以及进程消耗的性能

ExecutorService 建立多线程线程池的步骤: 线程池的作用: 线程池作用就是限制系统中执行线程的数量. 根据系统的环境情况,可以自动或手动设置线程数量,达到运行的最佳效果:少了浪费了系统资源,多了造成系统拥挤效率不高.用线程池控制线程数量,其他线程排队等候.一个任务执行完毕,再从队列的中取最前面的任务开始执行.若队列中没有等待进程,线程池的这一资源处于等待.当一个新任务需要运行时,如果线程池中有等待的工作线程,就可以开始运行了:否则进入等待队列. 为什么要用线程池: 1.减少了创建和

check_mk自定义监控增加性能数据图形展示

在nagios中可以实现性能图形展示,利用的是PNP4Nagios,check_mk当然也可以,而且很简单. 这篇文章在前一篇文章<check_mk自定义监控实践之powershell>的基础之前,脚本稍作修改 1.客户端process_top5.ps1 $dp = (Get-Process) | select -First 5 $ops = Get-WmiObject -Class Win32_OperatingSystem echo `<`<`<process_top5`

python解析PDF文档

1.安装 pip install pdfminer3k 2.  python读取PDF文档代码分析 PDF格式不是规范格式. 尽管它被叫做"PDF文档", 但并不像word或者html文档.PDF的表现更像一张图片.PDF更像是在一张纸的各个准确的位置上把内容都摆放出来.大部分情况下,没有逻辑结构,比如句子或段落,并且不能自适应页面大小的调整.PDFMiner尝试通过猜测它们的布局来重建它们的结构,但是不保证一定能工作.我知道这样很难看,但是,PDF确实不够规范. 下面这个图片是使用流

C++MFC编程笔记day07 MFC单文档绘图保存、多文档绘图保存

完善绘图例子(day06中的),加上保存功能 1 设计和编写图形类 CShape 1.1 成员变量 CPoint m_ptBegin; CPoint m_ptEnd; UINT m_nType; 1.2 支持序列化 1.2.1 继承自CObject 1.2.2 添加序列化的声明宏和实现宏 1.2.3 重写虚函数Serilize(),在函数中,完成成员变量的序列化 2 由于保存多个图形,引入MFC的集合类CObArray,保存的是CObject 对象的地址. 3 图形数据需要保存到文档类中,在该类

“Word自动更改后的内容保存到通用文档模板上。是否加载该模板?“的解决办法

在win7系统下,Word2010出现了不能正常关闭.打开一个已有word文档,点击右上角关闭按钮后,先提示"word已停止工作,windows正在检查该问题的解决方案",随后提示"Microsoft word正试图恢复您的信息,这可能需要几分钟",最后提示"Microsoft Word已停止工作,出现了一个问题,导致程序停止正常工作.如果有可用的解决方案,Windows将关闭程序并通知您".之后,再重新打开word时,提示"Word自

Python抓取单个网页中所有的PDF文档

Github博文地址,此处更新可能不是很及时. 1.背景 最近发现算法以及数据结构落下了不少(其实还是大学没怎么好好学,囧rz),考虑到最近的项目结构越来越复杂了,用它来练练思路,就打算复习下数据结构与算法.结合最近在学英语,然后干脆就用英文喽.然后选定一本参考书籍<Data Structures and Algorithms in Java>.刚开始看还是蛮吃力的,慢慢来.由于之前有翻录书籍附录的习惯,于是就去书籍附带的官网看了下,发现http://ww0.java4.datastructu

Domino表单保存后,文档默认增加$Readers域的设置

[背景] 今天遇到一个奇怪的问题,一个表单一保存后,文档属性中会有一个$Readers域.查遍了各种资料无果. [原因] 表单属性-最后一个选项卡-去掉"所有读者及更高权限者"并且选择指定的角色.截图如下:

分享一下自己写的Python 3的各种PDF文档【花了半年时间那】

这些文档花了我半年的时间去整理,由于是第一次进行整理,希望帮助后来者少走弯路,毕竟是第一次整理,哪些地方不到位,希望大家和我练习,我们一起把它做好,下面就直接给出下载地址了,都是免积分的下载奥,因此,想怎么下就怎么下. 首先就是这个,它介绍了Python的基础语法,个人感觉还是蛮精炼的,下面是在CSDN的下载地址:python基础语法下载,如果不能下载,大家可以在浏览器中输入如下地址进行下载:http://download.csdn.net/detail/xinguimeng/7643003 然

pyPdf - 用Python方便的处理PDF文档

pyPdf库 ( http://pybrary.net/pyPdf/ ) ,操作起来相当直接易懂,把代码贴在这儿,做个记录. 1 from pyPdf import PdfFileWriter, PdfFileReader 2  3 pdf = PdfFileReader(file('original.pdf', 'rb')) 4 out = PdfFileWriter() 5  6 for page in pdf.pages: 7   page.mediaBox.upperRight = (5