0
点赞
收藏
分享

微信扫一扫

python系统性能统计(CPU占用率,磁盘使用率,内存占用率,系统平均负载)

生态人 2023-04-16 阅读 95


#!/usr/bin/env python
# -*- coding:utf-8 -*-
# author:Eli
# datetime:2021/8/16 10:25
# software: PyCharm

import os, time
import logging

logging.basicConfig(level=logging.DEBUG,#控制台打印的日志级别
                    filename='monitor.log',
                    filemode='a',##模式,有w和a,w就是写模式,每次都会重新写日志,覆盖之前的日志
                    #a是追加模式,默认如果不写的话,就是追加模式
                    format=
                    '%(asctime)s - %(pathname)s[line:%(lineno)d] - %(levelname)s: %(message)s'
                    #日志格式
                    )
last_worktime = 0
last_idletime = 0


def get_cpu():
    global last_worktime, last_idletime
    f = open("/proc/stat", "r")
    line = ""
    while not "cpu " in line: line = f.readline()
    f.close()
    spl = line.split(" ")
    worktime = int(spl[2]) + int(spl[3]) + int(spl[4])
    idletime = int(spl[5])
    dworktime = (worktime - last_worktime)
    didletime = (idletime - last_idletime)
    rate = float(dworktime) / (didletime + dworktime)
    last_worktime = worktime
    last_idletime = idletime
    if (last_worktime == 0): return 0
    return rate


def get_mem_usage_percent():
    try:
        f = open('/proc/meminfo', 'r')
        for line in f:
            if line.startswith('MemTotal:'):
                mem_total = int(line.split()[1])
            elif line.startswith('MemFree:'):
                mem_free = int(line.split()[1])
            elif line.startswith('Buffers:'):
                mem_buffer = int(line.split()[1])
            elif line.startswith('Cached:'):
                mem_cache = int(line.split()[1])
            elif line.startswith('SwapTotal:'):
                vmem_total = int(line.split()[1])
            elif line.startswith('SwapFree:'):
                vmem_free = int(line.split()[1])
            else:
                continue
        f.close()
    except:
        return None
    physical_percent = usage_percent(mem_total - (mem_free + mem_buffer + mem_cache), mem_total)
    virtual_percent = 0
    if vmem_total > 0:
        virtual_percent = usage_percent((vmem_total - vmem_free), vmem_total)
    return physical_percent, virtual_percent


def usage_percent(use, total):
    try:
        ret = (float(use) / total) * 100
    except ZeroDivisionError:
        raise Exception("ERROR - zero division error")
    return ret


def go(logfile=""):
    statvfs = os.statvfs('/')

    total_disk_space = statvfs.f_frsize * statvfs.f_blocks
    free_disk_space = statvfs.f_frsize * statvfs.f_bfree
    disk_usage = (total_disk_space - free_disk_space) * 100.0 / total_disk_space
    disk_usage = int(disk_usage)
    disk_tip = "硬盘空间使用率(最大100%):" + str(disk_usage) + "%"
    # print(disk_tip)
    logging.info(disk_tip)


    mem_usage = get_mem_usage_percent()
    mem_usage = int(mem_usage[0])
    mem_tip = "物理内存使用率(最大100%):" + str(mem_usage) + "%"
    # print(mem_tip)
    logging.info(mem_tip)

    cpu_usage = int(get_cpu() * 100)
    cpu_tip = "CPU使用率(最大100%):" + str(cpu_usage) + "%"
    # print(cpu_tip)
    logging.info(cpu_tip)

    load_average = os.getloadavg()
    load_tip = "系统负载(三个数值中有一个超过3就是高):" + str(load_average)
    # print(load_tip)
    logging.info(load_tip)


if __name__ == '__main__':
    logfile = "$HOME"
    while True:
        go(logfile)
        time.sleep(30) # 每30s统计一次

举报

相关推荐

0 条评论