记录机器CPU和内存使用情况的程序 郝伟 2021/02/27 [TOC]
1. 功能简介
为了记录目标机器的CPU和内存占用率,编写了以下代码,本段代码主要注意事项:
- 每0.1秒休眠一次,这样每秒只执行10次,对CPU性能影响为0;
- t0和t1对比的目标是保证每秒有且只记录一次;
- 每60秒写一次文件,减少频率降低对磁盘性能影响;
- 每天生成一个日志文件记录在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. 运行
- 在运行前需要在程序目录下创建
logs目录。 - 运行命令为:
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))
'''