python3 基于 psutil 的性能监控工具

sysinfo.py

运行环境:linux

# -*- coding:utf8 -*-
# 系统性能信息统计
import psutil
import math
import time
import datetime
import os

def getCpuUse():
    """获取 CPU 使用率百分比"""
    cpuUse = psutil.cpu_percent(1)
    return cpuUse

def getMemUse():
    """获取 物理内存 信息"""
    phyMem = psutil.virtual_memory()
    # 内存使用率
    memPercent = phyMem.percent
    # 内存使用(bytes)
    memUse = phyMem.used
    # 总内存(bytes)
    memTotal = phyMem.total
    return (memPercent, memUse, memTotal)

def getSwapUse():
    """交换分区使用情况"""
    swap = psutil.swap_memory()
    # 交换分区使用率
    swapPercent = swap.percent
    # 交换分区使用(bytes)
    swapUse = swap.used
    # 总交换分区(bytes)
    swapTotal = swap.total
    return (swapPercent, swapUse, swapTotal)

def getDiskInfo():
    """磁盘详细信息"""
    diskInfo = psutil.disk_partitions(False)
    # [sdiskpart(device='/dev/sdc2', mountpoint='/', fstype='ext4', opts='rw,noatime,errors=remount-ro,data=ordered', maxfile=255, maxpath=4096), sdiskpart(device='/dev/sdb2', mountpoint='/boot', fstype='ext4', opts='rw,noatime,data=ordered', maxfile=255, maxpath=4096), sdiskpart(device='/dev/sda', mountpoint='/data', fstype='ext4', opts='rw,relatime,data=ordered', maxfile=255, maxpath=4096)]
    disks = []
    for i in diskInfo:
        device =  i.device.split("/")[-1]
        disks.append(device)
        disks.sort()
    return disks

def getDiskIO(disks):
    """分别统计每个物理磁盘IO"""
    diskIO = psutil.disk_io_counters(perdisk=True)
    # print(diskIO)
    diskIOInfo = {}
    for i in disks:
        io = diskIO.get(i)
        ioInfo = {}
        ioInfo["readCount"] = io.read_count
        ioInfo["writeCount"] = io.write_count
        ioInfo["readBytes"] = io.read_bytes
        ioInfo["writeBytes"] = io.write_bytes
        ioInfo["readTime"] = io.read_time
        ioInfo["writeTime"] = io.write_time
        diskIOInfo[i] = ioInfo
    return diskIOInfo

def getNetInfo():
    """获取网卡信息"""
    netInfo = psutil.net_if_stats()
    nets = [i for i in netInfo.keys()]
    nets.sort()
    return nets

def getNetIO(nets):
    """网络信息,每个网卡单独采集"""
    netIO = psutil.net_io_counters(pernic=True)
    netIOInfo  = {}
    for i in nets:
      io = netIO.get(i)
      ioInfo = {}
      ioInfo["bytesSent"] = io.bytes_sent
      ioInfo["bytesRecv"] = io.bytes_recv
      ioInfo["packetsSent"]  = io.packets_sent
      ioInfo["packetsRecv"] = io.packets_recv
      netIOInfo[i] = (ioInfo)
    return netIOInfo

def getColumns(disks, nets):
    """获取列标题"""
    columns = ["开始获取时间","CPU(%)", "内存(%)", "内存使用(MB)", "总内存(MB)", "交换分区(%)","交换分区使用(MB)", "总交换分区(MB)"]
    for di in disks:
        diskWriteName = "磁盘({0})写(MB/s)".format(di)
        diskReadName = "磁盘({0})读(MB/s)".format(di)
        columns.append(diskWriteName)
        columns.append(diskReadName)
    for ni in nets:
        netSendName = "网卡({0})发送(MB/s)".format(ni)
        netRecvName = "网卡({0})接收(MB/s)".format(ni)
        columns.append(netSendName)
        columns.append(netRecvName)
    
    return columns

def getSysInfo(disks, nets, interval):
    """获取系统信息"""
    writeInfo = []
    
    getTime = datetime.datetime.now().strftime("%Y-%m-%d %H:%M:%S")
    writeInfo.append(getTime)
    
    cpuUse = getCpuUse()
    writeInfo.append(cpuUse)
    
    # (memPercent, memUse, memTotal)
    memUse = getMemUse()
    # 内存使用百分比
    writeInfo.append(memUse[0])
    # 内存实际使用(MB), 向上取整
    writeInfo.append(math.ceil(memUse[1]/1024/1024))
    # 实际总内存(MB), 向上取整
    writeInfo.append(math.ceil(memUse[2]/1024/1024))
    
    # (swapPercent, swapUse, swapTotal)
    swapUse = getSwapUse()
    # 交换分区使用百分比
    writeInfo.append(swapUse[0])
    # 交换分区使用(MB), 向上取整
    writeInfo.append(math.ceil(swapUse[1]/1024/1024))
    # 交换分区使用(MB), 向上取整
    writeInfo.append(math.ceil(swapUse[2]/1024/1024))
    
    diskIOBefore = getDiskIO(disks)
    netIOBefore = getNetIO(nets)
    time.sleep(interval)
    diskIOAfter = getDiskIO(disks)
    netIOAfter = getNetIO(nets)
    
    # 磁盘 IO
    for i in disks:
        dAfter = diskIOAfter.get(i)
        dBefore = diskIOBefore.get(i)
        diskWriteSpeed ="{0:.2f}".format((dAfter.get("writeBytes") - dBefore.get("writeBytes"))/interval/1024/1024)
        diskReadSpeed ="{0:.2f}".format((dAfter.get("readBytes") - dBefore.get("readBytes"))/interval/1024/1024)
        
        writeInfo.append(diskWriteSpeed)
        writeInfo.append(diskReadSpeed)
    
    # 网卡 IO
    for i in nets:
        netAfter = netIOAfter.get(i)
        netBefore = netIOBefore.get(i)
        netSendSpeed ="{0:.2f}".format((netAfter.get("bytesSent") - netBefore.get("bytesSent"))/interval/1024/1024)
        netRecvSpeed ="{0:.2f}".format((netAfter.get("bytesRecv") - netBefore.get("bytesRecv"))/interval/1024/1024)
        
        writeInfo.append(netSendSpeed)
        writeInfo.append(netRecvSpeed)
    
    return writeInfo
    
    

if __name__ == "__main__":
    
    csvFile = "monitor.csv"
    try:
        interval = 10
        disks = getDiskInfo()
        nets = getNetInfo()
        
        columns = getColumns(disks, nets)
        columnStr = ",".join(columns)
        if os.path.exists(csvFile):
            with open(csvFile,"r+") as f:
                data = f.readline()
                if "开始获取时间" not in data:
                    f.write(columnStr+"\n")
        else:
            with open(csvFile, "w") as f:
                f.write(columnStr+"\n")
                
        while 1:
            # args = poll(interval)
            # refresh_window(*args)
            writeInfo = getSysInfo(disks, nets, interval)
            
            with open(csvFile,"a+") as f:
                writeData = [str(i) if type(i).__name__ != "str" else i for i in writeInfo]
                writeStr = ",".join(writeData)
                f.write(writeStr+"\n")
            print("write:{0} finished".format(csvFile))
            
    except (KeyboardInterrupt,SystemExit):
        pass
posted @ 2025-06-19 16:59  BrianSun  阅读(14)  评论(0)    收藏  举报