**方法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;