根据pid定时监控CPU使用率和内存使用率并输出到文件 (windows和linux跨平台可用)
有时服务器运维中,某些程序员的应用发布后完全不管CPU和内存的使用率,只觉得代码能运行就行了,这样给我们运维人员经常造成困扰;
比如我在zabbix平台中就经常监测到凌晨1~3~5点时候突然CPU飙升到50~93%,win和linux系统都没有比较方便的定时监控指定进程的方法,经过长时间的寻解、修改和测试,如下python代码可以实现根据pid定时监控CPU使用率和内存使用率,并输出到.csv文件,windows和linux平台皆可用:
# 本程序可以实现自动识别CPU内核数,然后根据输入的进程pid号,来计算出多核的CPU使用率和内存使用率,并将监控结果同时打印到屏幕和文件中。
import sys
import time
import psutil
# 查询显示当前系统的CPU内核和颗数等信息
print('逻辑CPU个数:' + str(psutil.cpu_count())) # 取多内核平均值时应除以物理内核比较近似
print('物理CPU个数:' + str(psutil.cpu_count(logical=False)))
# print('当前可用CPU个数:' + str(len(psutil.Process().cpu_affinity())))
# 将输入的参数pid号保存到列表sys.argv中,若输入的值小于2位则中断退出并提示
if len(sys.argv) < 2:
print("输入pid值无效,请按示例输入,例:“python CPU_Analysis_Python.py pid号码”")
sys.exit()
# 通过psutil模块,获取并保存pid对应的进程对象
pid = int(sys.argv[1])
p = psutil.Process(pid)
# 监控进程相关的CPU和内存使用率数据,写入存储
interval = 1 # 设置监控的循环间隔时间
with open("CPU_Analysis_pid" + str(pid) + "_" + p.name() + ".csv", "a") as f: # 创建记录输出文档,格式为.csv
f.write(" 时间 , CPU使用率(%), 内存使用率(%) \n") # 写入标题——>.csv文档中
while True:
with open("CPU_Analysis_pid" + str(pid) + "_" + p.name() + ".csv", "a") as f: # 添加监控记录输出文档
current_time = time.strftime('%Y%m%d-%H:%M:%S', time.localtime(time.time()))
# 计算CPU使用率(%) = 所有核心使用率之和 / (1s * 物理内核数量), 参数interval的值为获取当前CPU使用率的时间间隔
cpu_percent = round(((p.cpu_percent(interval=1) / 100) / psutil.cpu_count(logical=False)) * 100, 2)
mem_percent = p.memory_percent()
line = current_time + ',' + str(cpu_percent) + ',' + str(mem_percent)
print('时间:' + current_time + ', CPU使用率:' + str(cpu_percent) + ', 内存使用率:' + str(mem_percent)) # 输出控制台,可注销掉
f.write(line + "\n")
time.sleep(interval)