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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章