【用python写性能监测工具-根据进程pid监控内存及CPU占用】

  • Post author:
  • Post category:python


**方法1:**遍历tasklist查询与目标pid,记录其内存及CPU占用

此方法记录的内存是PSS,单位KB(千字节)

**方法2:**借助第三方库psutil直接查询目标pid,记录其内存及CPU占用

此方法记录的内存的内存信息较为详细

这里介绍第二种方法

1.根据pid获取进程的相关信息(进程号、进程名、状态、开始时间)

def getInfo():    
    #直接使用psutil查找pid
    p = psutil.Process(pid)
    #这里会打印有关进程的相关信息
    print(p)




if __name__ == '__main__':
    getInfo(20172)

结果:

2.获取进程的CPU占用

#获取当前进程的CPU占用
    cpu =p.cpu_percent(interval=0.1)
    print("CPU占用率:",cpu,"CPU核数:",psutil.cpu_count())

输出结果:

3.获取进程内存占用

# 获取当前进程的内存占用
    full_info = str(p.memory_full_info())
    rss = full_info.split("(")[-1].split(",")[0].split("=")[-1]
    uss = full_info.split("(")[-1].split(",")[-1].split("=")[-1].split(")")[0]
    vms = full_info.split("(")[-1].split(",")[1].split("=")[-1]
    print("内存全部信息:",full_info)
    print("RSS,USS,VMS",rss,uss,vms)

输出结果:

内存全部信息:单位字节

pfullmem(rss=82161664, vms=123883520, num_page_faults=869906, peak_wset=208740352, wset=82161664, peak_paged_pool=890176, paged_pool=829328, peak_nonpaged_pool=164376, nonpaged_pool=63784, pagefile=123883520, peak_pagefile=149839872, private=123883520, uss=32964608)

RSS,USS,VMS = 82161664 32964608 123883520

4.将获取到的CPU和内存信息写入到csv文件中

完整代码如下:

import time

import psutil

#根据进程名查找pid
def getInfo(pid):
    #方法1-使用Psutil第三方模块,此方法接受的pid为int-缺点记录的内存占用为内存峰值(进程所使用的最大物理内存)
    p = psutil.Process(pid)
    #获取当前进程的CPU占用
    #print(p.cpu_percent(interval=1),psutil.cpu_count())
    cpu = round(p.cpu_percent(interval=0.1)/psutil.cpu_count(),2)
    #获取当前进程的内存占用
    full_info = str(p.memory_full_info())

    rss = full_info.split("(")[-1].split(",")[0].split("=")[-1]
    uss = full_info.split("(")[-1].split(",")[-1].split("=")[-1].split(")")[0]
    vms = full_info.split("(")[-1].split(",")[1].split("=")[-1]

    #print(memory.split("(")[-1].split(",")[0].split("=")[-1])
    times = time.strftime("%Y-%m-%d-%H-%M-%S", time.localtime())
    wbdata = times + "," + str(cpu) + "," + str(round(int(rss)/1024/1024,2))+ "," + str(round(int(uss)/1024/1024,2))+ "," + str(round(int(vms)/1024/1024,2))
    print(wbdata)
    return wbdata

#定时存进一个csv文档里
def saveinformation(information):
    filename = "savememory.csv"
    with open(filename,'a+') as f:
        "每隔10s去执行一次"
        f.write(information)
        f.write('\n')

def work():
    #输入pid和时间间隔
    pid = input("请输入进程的pid:")
    intervalTime = input("请输入性能监控间隔时间(建议0.3s以上):")
    #先写csv文件头
    initdata = "Time,CPU(%),RSS(M-该进程实际使用物理内存(包含共享库占用的全部内存)),USS(M-进程独立占用的物理内存(不包含共享库占用的内存)),VMS(M-该进程使用的虚拟内存总量)"
    with open('savememory.csv','w') as f:
        f.write(initdata)
        f.write('\n')
    while 1 :
        info = getInfo(int(pid))
        saveinformation(info)
#定时执行
        time.sleep(float(intervalTime))

输出文件结果:

注  这里监测CPU占用为0,是因为该进程一直挂后台没有运行,只会有内存占用,而不会申请CPU,所以为0;



版权声明:本文为weixin_46043035原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。