做性能测试中经常用到top命令,监控一段时间内某个进程的CPU,memory使用情况。10秒中一次输出到文件中,以下的代码是对输出的top文件进行的处理,获取CPU利用率,memory最大,最小,平均值。
#!/usr/bin/env python
# -*- coding: cp936 -*-
import os
import re
import string
import argparse
#D:/createuser.txt
#D:/resultfobj.txt'''analysis createuser.log test'''
parser = argparse.ArgumentParser(description='过滤:时间,系统CPU,进程CPU,进程占用内存')
parser.add_argument('-l',metavar='LOG FILE',help='日志文件,绝对路径')
parser.add_argument('-r',metavar='RESULT FILE',help='保存分析结果,不指定报讯目录,则保存在当前目录下')
parser.add_argument('-p',metavar='PROCESS ID',help='过滤线程ID')
#parser.print_help()
args = parser.parse_args()
try:
#read the createuser.log file
logfobj = open(args.l, 'r')
resultfobj = open(args.r, 'w')
resultfobj.writelines('TIME sysCPU P_ID processCPU processMEMORY'+'\n')
#ID_TOM = '29128'
ID_TOM = args.p
TIME = 'top'
MESSAGE = []
except IOError, e:
print 'open file error:\n',e
else:
print 'start filter'
for eachline in logfobj:
msysCPU = re.search('^Cpu',eachline)
mPID = re.search('^' + ID_TOM,eachline)
mTIME = re.search('^' + TIME,eachline)
if mTIME is not None:
listTIME = re.split('\s+',eachline)
#listTIME01 = re.split(':', listTIME[2])
listTIME01 = ''.join(re.split(':', listTIME[2]))#获取时间戳
MESSAGE.append(listTIME01 + ' ')
#print 'messageTIME:',MESSAGE
if msysCPU is not None:
list00 = re.split(':', eachline)
#print list00
list01 = re.split(',', list00[1])
#print 'list01:\n',list01
for each in range(0, 6):
list0101 = str.strip(list01[each])
#print 'list0101',list0101
us = re.search('us$', list0101)
#print us
if us is not None:
#if each%2 ==0:
list010101 = re.split('%',list0101)#获取系统CPU
#print 'list010101[0]:',list010101[0]
MESSAGE.append(list010101[0] + ' ')
MESSAGE.append( ID_TOM+ ' ')
#sysCPUfobj.writelines(list010101[0]+'\n')
#print 'messagemsysCPU+pid:', MESSAGE
if mPID is not None:
listPID = re.split('\s+', eachline)
#print eachline
MESSAGE.append(listPID[8] + ' ')
MESSAGE.append(listPID[9])
#print 'MESSAGE process:',MESSAGE
if len(MESSAGE)== 5:
message = ''.join(MESSAGE)
resultfobj.writelines(message + '\n')
MESSAGE = []
logfobj.close()
resultfobj.close()
print 'end filter'