python绘图cpu/mem监控曲线

2019-09-05 06:52栏目:编程学习

1
输入日志格式举个例子:[2012-09-26 12:55:31] 16070 sosotest 20 0 8302m 41m 11m S 0 0.1 0:00.93 java 42836 8501676 HandleNum:28
view sourceprint?
001
# -*- coding: cp936 -*-
002
import re, sys, os
003
import time
004
from pylab import *
005
'''
006
修改:二零零六.04.23 扩充开端运维时间音信修改参数,将经过号作为文件名一部分
007
修改:二〇一〇.04.25 将参数1,2呼唤,第1个参数为日志文件,第一个为经过id
008
修改:2009.10.31 扩展core点展现,core时记下在程序运转目录
009
修改:2008.11.30 将两幅图绘制在同步,日志参与ps产生的内部存款和储蓄器详细音讯
010
修改:二〇一三.06.24 插足进度名,表示有效结果日志
011
'''
012
 
013
def getCoreLst(proclst):
014
        retLst = []
015
        curPid = proclst[0]
016
        for i in range(1, len(proclst)):
017
                if curPid != proclst[i]:
018
                        curPid = proclst[i]
019
                        retLst.append(i 1)
020
        return retLst
021
        
022
virt = []
023
res = []
024
cpu = []
025
proc = []
026
allrcd = []#具有记录
027
timeInterval = 10
028
processname = "empty process"
029
if len(sys.argv) != 5 and len(sys.argv) != 4:
030
        print "Usage: python %s fileName mem_cpu.png processname timeinterval[default:10]" %(__file__)
031
        print "Usage: python %s fileName processname timeinterval[default:10]" %(__file__)
032
        sys.exit()
033
 
034
print "VIRT RES CPU%"
035
if len(sys.argv) == 5:
036
        srcfileName = sys.argv[2]
037
        processname = sys.argv[3]
038
        timeInterval = int(sys.argv[4])
039
else:
040
        srcfileName = "cpu_mem.png"
041
        processname = sys.argv[2]      
042
        timeInterval = int(sys.argv[3]) 
043
 
044
bFoundBeginTime = False
045
bFoundEndTime = False
046
 
047
strCurTime = ""
048
strBeginTime = ""
049
strEndTime = ""
050
 
051
 
052
f = open(sys.argv[1], "r")
053
line = f.readline()
054
strBeginTime = line[line.find('[') 1:line.find(']')]
055
f.seek(0, os.SEEK_SET)
056
while True:
057
    line = f.readline()
058
    if len(line)==0: break
059
        #if line.find("ProcessID:%s" % processId) == -1:
060
        #        continue
061
    line = line.strip()
062
 
063
        strEndTime = line[line.find('[') 1:line.find(']')] #收获当前岁月
064
 
065
        try:
066
                if len(line.split()) != 17:
067
                    continue
068
                if not processname in line:
069
                    continue
070
                lp = line.split()[2:]
071
                lp0 = []
072
                for i in range(0, len(lp)):
073
                        if len(lp[i])>0: lp0.append(lp[i])
074
 
075
                #print lp0[]进程号
076
                proc.append(int(lp0[0]))
077
                
078
                #虚构内部存款和储蓄器大小
079
                if lp0[4][-1]!='m' and lp0[4][-1]!='g': fRet = float(lp0[4])/(1024*1024)
080
                if lp0[4][-1]=='m': fRet = float(lp0[4][0:-1])/1024
081
                if lp0[4][-1]=='g': fRet = float(lp0[4][0:-1])
082
                virt.append(fRet)
083
                
084
                #实际内部存款和储蓄器大小
085
                if lp0[5][-1]!='m' and lp0[5][-1]!='g': fRet = float(lp0[5])/(1024*1024)
086
                if lp0[5][-1]=='m': fRet = float(lp0[5][0:-1])/1024
087
                if lp0[5][-1]=='g': fRet = float(lp0[5][0:-1])
088
                res.append(float(fRet))
089
                
090
                #cpu占用率
091
                cpu.append(float(lp0[8]))
092
                allrcd.append(line)
093
 
094
        except:
095
                print "Line data Error as follow..."
096
                print line
097
    #time.sleep(1)
098
    #print "abc", lp0[4], lp0[5], lp0[8]
099
f.close()
100
 
101
print "Show len ",len(virt)
102
print "耗时%.3f小时" % (timeInterval*len(virt)/(60*60.0))
103
print "最初时间: %s" % strBeginTime
104
print "甘休时间: %s" % strEndTime
105
 
106
print virt
107
xSpan = len(virt)
108
a = max(virt)
109
b = max(res)
110
ySpan = max(a, b)#内部存款和储蓄器最高点
111
cpu_mem_rate = max(cpu) / ySpan#计算cpu与内部存款和储蓄器的归一化比率
112
 
113
#归一化CPU损耗
114
for i in range(0, len(cpu)):
115
        cpu[i] = cpu[i] / cpu_mem_rate
116
 
117
 
118
corelst_x = getCoreLst(proc)
119
 
120
corelst_cpu_y = []
121
corelst_virt_y = []
122
corelst_res_y = []
123
 
124
for i in range(0,len(corelst_x)):
125
        corelst_cpu_y.append(cpu[corelst_x[i]])
126
        corelst_virt_y.append(virt[corelst_x[i]])
127
        corelst_res_y.append(res[corelst_x[i]])
128
 
129
#统计core点开始
130
fpCorePoint=file("error_core.log", "at")
131
for i in range(0, len(corelst_x)):
132
        fpCorePoint.write("%sn" % allrcd[corelst_x[i]])
133
fpCorePoint.close()
134
#统计core点结束
135
 
136
 
137
#为了画点,将横轴坐标乘以时间距离
138
for i in range(0, len(corelst_x)):
139
        corelst_x[i]=corelst_x[i]*timeInterval
140
 
141
 
142
strDuration = "StartTime:%s EndTime:%s n Duration %d minutes %d hours" % (strBeginTime, strEndTime, len(virt)*timeInterval/60, len(virt)*timeInterval/3600)
143
x = []
144
for i in range(0, len(virt), 1):
145
        x.append(timeInterval*i)#每10秒获取三回消息
146
 
147
#先绘制CPU图
148
print "Cpu len: %d %d " % (len(x), len(cpu))
149
figure(1)
150
axis([0, len(cpu), 0, max(cpu)])#安插绘图区域
151
strTitle = "______________________________n" strDuration " CPU_rate:%.2f n--------------------------" % cpu_mem_rate
152
title(strTitle, fontsize=12)
153
xlabel("TimeEclipsed/sec", fontsize=12, ha='left')
154
ylabel('CPU-Rate:%.2f | MEM/g' % cpu_mem_rate , fontsize=12, va = 'top')
155
plot(x, cpu, 'g')  #绘制cpu
156
#画core点
157
print "CPU Core Info:"
158
print "Core at ", corelst_x
159
print "Core at ", corelst_cpu_y
160
#plot(corelst_x, corelst_cpu_y, "rs") #绘制cpu的core点
161
 
162
#title("MEM-%s n%s" % (strBeginTime, strDuration), fontsize=12)
163
#xlabel("TimeEclipsed/sec", fontsize=12)
164
#ylabel('Memery/g', fontsize=12)
165
plot(x, virt, 'b')#绘图虚构内部存款和储蓄器
166
plot(x, res, 'r') #绘制物理内部存款和储蓄器
167
#画core点
168
print "MEM Core Info:"
169
print "Core at ", corelst_x
170
print "Core at ", corelst_virt_y
171
print "Core at ", corelst_res_y
172
 
173
#plot(corelst_x, corelst_virt_y, "rs") #绘图虚构内部存储器的core点
174
plot(corelst_x, corelst_res_y, "cs")  #制图物理内部存款和储蓄器的core点
175
 
176
grid()
177
savefig(srcfileName, dpi=85)
178
 
179
strCmd = srcfileName "/b"
180
os.system(strCmd)

概念

小小二乘法多项式曲线拟合,依照给定的m个点,并不须求那条曲线正确地因而那些点,而是曲线y=f(x)的好像曲线y= φ(x)。

 

输入日志格式比方:[2012-09-26 12:55:31] 16070 sosotest 20 0 8302m 41m 11m S 0 0.1 0:00.93 java 42836 8501676 HandleNum:28 view sourceprint? 001 # -*- coding: cp936 -*- 00...

原理

[原理部分由个体根据互联英特网的资料举办总计,希望对我们能有用]

 

 

     给定数根据地pi(xi,yi),在那之中i=1,2,…,m。求近似曲线y= φ(x)。而且使得近似曲线与y=f(x)的偏差最小。近似曲线在点pi处的偏侧δi= φ(xi)-y,i=1,2,...,m。 

周边的曲线拟合方法:

     1.使偏差相对值之和纤维

     图片 1

 

     2.使偏差相对值最大的纤维

     图片 2

 

     3.使偏差平方和微小

 

     图片 3

 

     按偏差平方和纤维的尺度选拔拟合曲线,并且动用二项式方程为拟合曲线的措施,称为最小二乘法。

演绎进程:

     1. 设拟合多项式为:

          图片 4

     2. 各点到那条曲线的相距之和,即不是平方和如下:

          图片 5

     3. 为了求得符合条件的a值,对等式左边求ai偏导数,由此大家收获了: 

          图片 6

          图片 7

                         .......

          图片 8

 

     4. 将等式左侧进行一下化简,然后应该能够得到上面包车型客车等式:

          图片 9

          图片 10

                     .......

          图片 11

 

     5. 把那个等式表示成矩阵的样式,就足以获取上面包车型大巴矩阵:

          图片 12

     6. 将这一个范德蒙得矩阵化简后可收获:

          图片 13

     7. 也等于说X*A=Y,那么A = (X'*X)-1*X'*Y,便拿走了周密矩阵A,同有的时候间,大家也就取得了拟合曲线。

实现

 

运营前提:

  1. Python运维遭受与编辑情况;
  2. Matplotlib.pyplot图形库,可用以快速绘制2D图形,与matlab中的plot命令类似,何况用法也基本同样。

代码:

[python] view plain copy

 

  1. # coding=utf-8  
  2.   
  3. ''''' 
  4. 作者:Jairus Chan 
  5. 次第:多项式曲线拟合算法 
  6. '''  
  7. import matplotlib.pyplot as plt  
  8. import math  
  9. import numpy  
  10. import random  
  11.   
  12. fig = plt.figure()  
  13. ax = fig.add_subplot(111)  
  14.   
  15. #阶数为9阶  
  16. order=9  
  17.   
  18. #生成曲线上的相继点  
  19. x = numpy.arange(-1,1,0.02)  
  20. y = [((a*a-1)*(a*a-1)*(a*a-1) 0.5)*numpy.sin(a*2) for a in x]  
  21. #ax.plot(x,y,color='r',linestyle='-',marker='')  
  22. #,label="(a*a-1)*(a*a-1)*(a*a-1) 0.5"  
  23.   
  24. #扭转的曲线上的各种点偏移一下,并归入到xa,ya中去  
  25. i=0  
  26. xa=[]  
  27. ya=[]  
  28. for xx in x:  
  29.     yy=y[i]  
  30.     d=float(random.randint(60,140))/100  
  31.     #ax.plot([xx*d],[yy*d],color='m',linestyle='',marker='.')  
  32.     i =1  
  33.     xa.append(xx*d)  
  34.     ya.append(yy*d)  
  35.   
  36. '''''for i in range(0,5): 
  37.     xx=float(random.randint(-100,100))/100 
  38.     yy=float(random.randint(-60,60))/100 
  39.     xa.append(xx) 
  40.     ya.append(yy)'''  
  41.   
  42. ax.plot(xa,ya,color='m',linestyle='',marker='.')  
  43.   
  44.   
  45. #扩充曲线拟合  
  46. matA=[]  
  47. for i in range(0,order 1):  
  48.     matA1=[]  
  49.     for j in range(0,order 1):  
  50.         tx=0.0  
  51.         for k in range(0,len(xa)):  
  52.             dx=1.0  
  53.             for l in range(0,j i):  
  54.                 dx=dx*xa[k]  
  55.             tx =dx  
  56.         matA1.append(tx)  
  57.     matA.append(matA1)  
  58.   
  59. #print(len(xa))  
  60. #print(matA[0][0])  
  61. matA=numpy.array(matA)  
  62.   
  63. matB=[]  
  64. for i in range(0,order 1):  
  65.     ty=0.0  
  66.     for k in range(0,len(xa)):  
  67.         dy=1.0  
  68.         for l in range(0,i):  
  69.             dy=dy*xa[k]  
  70.         ty =ya[k]*dy  
  71.     matB.append(ty)  
  72.    
  73. matB=numpy.array(matB)  
  74.   
  75. matAA=numpy.linalg.solve(matA,matB)  
  76.   
  77. #画出拟合后的曲线  
  78. #print(matAA)  
  79. xxa= numpy.arange(-1,1.06,0.01)  
  80. yya=[]  
  81. for i in range(0,len(xxa)):  
  82.     yy=0.0  
  83.     for j in range(0,order 1):  
  84.         dy=1.0  
  85.         for k in range(0,j):  
  86.             dy*=xxa[i]  
  87.         dy*=matAA[j]  
  88.         yy =dy  
  89.     yya.append(yy)  
  90. ax.plot(xxa,yya,color='g',linestyle='-',marker='')  
  91.   
  92. ax.legend()  
  93. plt.show()  

运行效果: 

图片 14

 

 

 

本博客中颇具的博文都为笔者(Jairus Chan)原创。

如需转发,请标注出处:。

借使您对本文有此外的观点与提出,请联系作者(JairusChan)。

版权声明:本文由威尼斯人app发布于编程学习,转载请注明出处:python绘图cpu/mem监控曲线