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