python 利用psutil获取系统的内存使用率前10的进程,CPU使用率前10的进程,系统负载,网卡流量以及每个进程的磁盘IO情况
python 利用psutil获取系统的内存使用率前10的进程,CPU使用率前10的进程,系统负载,网卡流量以及每个进程的磁盘IO情况。
注:仅适用于 linux 系统。
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import psutil
import multiprocessing
import time
import sys
from multiprocessing import Process, Manager
Cpu_dict = {}
Mem_dict = {}
#t内存使用率
print "================内存使用率前10================"
print "PID\t内存使用率\t进程状态\t进程名"
for Mem in ([(p.pid, p.info) for p in sorted(psutil.process_iter(attrs=['name', 'memory_percent']), key=lambda p: p.info['memory_percent'])][-10:])[::-1]:
try:
M_p = psutil.Process(Mem[0])
print Mem[0],'\t',"{:.2f}".format((Mem[1])['memory_percent'])+"%","\t\t"+M_p.status()+' \t'+" ".join(M_p.cmdline())
except:
pass
##################################################################
#系统负载
print "================系统负载================"
print '系统负载 (1,5,15分钟:',psutil.getloadavg(),")"
###################################################################
#网卡流量
#获取网卡信息
print ""
print "================网卡流量================"
def get_netcard():
netcard_info = []
info = psutil.net_if_addrs()
for k,v in info.items():
for item in v:
if item[0] == 2 and not item[1]=='127.0.0.1':
netcard_info.append((k))
return netcard_info
def Net_card_flow(get_net):
Sent_flow_1 = (psutil.net_io_counters(pernic=True)[get_net]).bytes_sent
Recv_flow_1 = (psutil.net_io_counters(pernic=True)[get_net]).bytes_recv
time.sleep(1)
Sent_flow_2 = (psutil.net_io_counters(pernic=True)[get_net]).bytes_sent
Recv_flow_2 = (psutil.net_io_counters(pernic=True)[get_net]).bytes_recv
#计算当前流量的字节数
Sent_flow = Sent_flow_2-Sent_flow_1
Recv_flow = Recv_flow_2-Recv_flow_1
#计算发送流量
if Sent_flow < 1024:
Sent_flow_format = str(Sent_flow)+"B/s"
elif 1024 <= Sent_flow < 1048576:
Sent_flow_format = str(Sent_flow/1024)+"K/s"
elif 1048576 <= Sent_flow < 1073741824:
Sent_flow_format = str(Sent_flow/1024/1024)+"M/s"
else:
Sent_flow_format = str(Sent_flow/1024/1024/1024)+"G/s"
#计算接受流量
if Recv_flow < 1024:
Recv_flow_format = str(Recv_flow)+"B/s"
elif 1024 <= Recv_flow < 1048576:
Recv_flow_format = str(Recv_flow/1024)+"K/s"
elif 1048576 <= Recv_flow < 1073741824:
Recv_flow_format = str(Recv_flow/1024/1024)+"M/s"
else:
Recv_flow_format = str(Recv_flow/1024/1024/1024)+"G/s"
print "网卡:",get_net," \t发送流量:",Sent_flow_format,"接受流量:",Recv_flow_format
p_list=[]
for Net_card in get_netcard():
p = multiprocessing.Process(target=Net_card_flow, args=(Net_card,))
p.daemon=True
p_list.append(p)
for p in p_list:
p.start()
for p in p_list:
p.join()
###################################################################
#CPU使用率
print ""
def CPU_Utilization(P):
try:
p1 = psutil.Process(int(P))
if sys.argv[0] not in " ".join(p1.cmdline()):
Cpu_dict[P] = str(p1.cpu_percent(interval=8))+"%" #等8秒
except:
pass
p_list=[]
with Manager() as manager:
Cpu_dict = manager.dict()
for i in psutil.pids():
p = multiprocessing.Process(target=CPU_Utilization, args=(i,))
p.daemon=True
p_list.append(p)
for p in p_list:
p.start()
for p in p_list:
p.join()
print "================CPU使用率前10================"
print "PID\tCPU使用率\t进程状态\t进程名"
for Mem_max in (sorted(Cpu_dict.items(), key = lambda kv:(kv[1], kv[0]),reverse=True))[0:10]:
M_p = psutil.Process(Mem_max[0])
print str(Mem_max[0])+"\t "+str(Mem_max[1])+"\t\t"+M_p.status()+' \t'+" ".join(M_p.cmdline())
#获取每个进程的磁盘IO情况
def Disk_io(i):
try:
p = psutil.Process(i)
Read_count_1 = p.io_counters().read_count #读操作数
Write_count_1 = p.io_counters().write_count #写操作数
Read_bytes_1 = p.io_counters().read_bytes #读字节数
Write_bytes_1 = p.io_counters().write_bytes #写字节数
time.sleep(1)
Read_count_2 = p.io_counters().read_count #读操作数
Write_count_2 = p.io_counters().write_count #写操作数
Read_bytes_2 = p.io_counters().read_bytes #读字节数
Write_bytes_2 = p.io_counters().write_bytes #写字节数
Read_count = Read_count_2-Read_count_1
Write_count = Write_count_2-Write_count_1
Read_bytes = Read_bytes_2-Read_bytes_1
Write_bytes = Write_bytes_2-Write_bytes_1
####################################################
if Read_count != 0 or Write_count != 0 or Read_bytes != 0 or Write_bytes != 0 :
if Read_bytes < 1024:
Read_bytes_format = str(Read_bytes)+"B/s"
elif 1024 <= Read_bytes < 1048576:
Read_bytes_format = str(Read_bytes/1024)+"K/s"
elif 1048576 <= Read_bytes < 1073741824:
Read_bytes_format = str(Read_bytes/1024/1024)+"M/s"
else:
Read_bytes_format = str(Read_bytes/1024/1024/1024)+"G/s"
###############################
if Write_bytes < 1024:
Write_bytes_format = str(Write_bytes)+"B/s"
elif 1024 <= Write_bytes < 1048576:
Write_bytes_format = str(Write_bytes/1024)+"K/s"
elif 1048576 <= Write_bytes < 1073741824:
Write_bytes_format = str(Write_bytes/1024/1024)+"M/s"
else:
Write_bytes_format = str(Write_bytes/1024/1024/1024)+"G/s"
print "PID:"+str(i)+" \t (磁盘读操作数:"+str(Read_count)+" \t磁盘写操作数:"+str(Write_count)+" \t磁盘读字节数:"+Read_bytes_format+" \t磁盘写字节数:"+Write_bytes_format+") \t"+" ".join(p.cmdline())
except:
pass
p_list=[]
for Pid in psutil.pids():
p_d = multiprocessing.Process(target=Disk_io, args=(Pid,))
p_d.daemon=True
p_list.append(p_d)
for p in p_list:
p.start()
for p in p_list:
p.join()