记录机器CPU和内存使用情况的程序 郝伟 2021/02/27 [TOC]

1. 功能简介

为了记录目标机器的CPU和内存占用率,编写了以下代码,本段代码主要注意事项:

  1. 每0.1秒休眠一次,这样每秒只执行10次,对CPU性能影响为0;
  2. t0和t1对比的目标是保证每秒有且只记录一次;
  3. 每60秒写一次文件,减少频率降低对磁盘性能影响;
  4. 每天生成一个日志文件记录在logs(需要手工建立)。

记录的数据格式为:time,cpu, mem_used, mem_free,如 1614391004, 2.2, 1.37, 0.11,其中时间为相对于1970.1.1的秒数,CPU的单位是百分比,内存是GB。程序每秒生成一条记录,长度为31字节,所以每天约为25M数据,每月75M,每年900M。

为了保证文件不至于太大,所以按天保存,每天的日志的文件名为 usage_yyyyMMdd.txt,如 usage_20210227.txt

2. 运行

  1. 在运行前需要在程序目录下创建 logs 目录。
  2. 运行命令为: python cpu_mem_usage.py &,即可在后台运行。

3. 源代码

程序文件名称为:cpu_mem_usage.py,内容如下所示。

#encoding=utf-8
'''
日期:2021/02/25
作者:郝伟
描述:获得CPU和内存使用情况
'''
import time, os
import psutil # pip install psutil

def get_info():
    ''' Get information of cpu and memeory
        return format: time,cpu_usage,mem_used,mem_free
    '''
    cpu=psutil.cpu_percent()
    mem = psutil.virtual_memory()
    mem_used = mem.used / 1073741824
    mem_free = mem.free / 1073741824
    return '{0},{1:5.1f},{2:5.2f},{3:5.2f}'.format(t0, cpu, mem_used, mem_free)

def get_filename():
        return './logs/usage_{0}.txt'.format(time.strftime("%Y%m%d", time.localtime()))

print('dataformat: time, cpu_usage, mem_used, mem_free')
filename=get_filename()
logfile=open(filename, 'w', encoding='utf-8')
t0=int(time.time())
t1=int(time.time())
while True:
    while t0==t1:
        time.sleep(0.1)
        t1 = int(time.time())
    t0=t1
    info=get_info()
    logfile.write(info+'\n')
    if t0 % 60 == 0:
        # 每分钟将缓冲中的数据写到文件中一次
        logfile.flush()
        # 每天一个日志文件,文件名格式为 usage_yyyyMMdd.txt,如 usage_20210227.txt
        if filename != get_filename():
            filename=get_filename()
            logfile.close()
            logfile=open(filename, 'w', encoding='utf-8')
logfile.close()


# 以下代码仅供参考
'''
print('ID\tTime(s)\tSpeed(MB/s)\tMemory(GB)')
for i in range(1):
    t1=time.time()
    time.sleep(1)
    t2=time.time()
    t = t2 - t1 + 0.001
    speed = 1 / t
    mem = psutil.Process(os.getpid()).memory_info().rss / 1024 ** 3
    print(u'{0}\t{1:.2f}\t{2:.2f}\t{3:.4f}'.format(i + 1, t, speed, mem))
'''

results matching ""

    No results matching ""