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