9 应用系统负载分析与磁盘容量预测

9.1背景与挖掘目标

   本案例通过分析存储设备中磁盘容量预测,通过对磁盘容量的预测,可预测磁盘未来的负载情况,避免应用系统因出现存储容量耗尽的情况而导致应用系统负载率过高,最终引发系统故障。针对历史磁盘数据,采用时间序列分析方法,预测应用系统服务器磁盘空间已使用的大小。

9.2分析方法

   在不考虑其他因素下,磁盘空间时随时间变化的,与时间存在很大的关联性,并且历史数据对未来发展存在一定的影响。因此本案例采用时间序列的分析方法实现对磁盘已使用空间的预测。

具体过程如下:

(1) 从数据源中选择性抽取历史数据与每天定时抽取数据

(2) 对抽取的数据进行周期性分析以及数据清洗、数据变换等操作后形成建模数据

(3) 采用时间序列分析方法对建模数据进行建模的构建,利用模型预测服务器磁盘已使用情况

(4) 应用模型预测服务器磁盘将要使用的情况,通过预测到的磁盘使用大小与磁盘容量大小进行判断,将结果反馈给系统管理员,提醒管理员磁盘的使用情况。

9.3数据抽取

9.4数据探索性分析

    本案例是进行时序分析方法进行建模,为了建模的需要,需要探索数据的平稳性,通过时序图可以初步发现数据的平稳性。

9	应用系统负载分析与磁盘容量预测

9	应用系统负载分析与磁盘容量预测

    根据上面两个图,我们发现磁盘使用情况是不具备周期性的,呈现缓慢增长的趋势,因此可以认为数据是非平稳的。

9.5数据预处理

9.5.1数据清洗

9	应用系统负载分析与磁盘容量预测

通过观察数据我们可以发现,磁盘容量是不变的,数据中存在重复的磁盘容量数据,需要把它剔除。

9	应用系统负载分析与磁盘容量预测

9.5.2属性构造

   观察数据可发现表中NAME、TARGET、ENTITY三个属性可反映每台服务器的磁盘信息,而且这些每台服务器的这些信息是不变的,因此我们可以把这三个属性合三为一,从而创建新的属性。

代码如下:

# encoding=utf-8
#
属性变换
import pandas as pd
#参数初始化
discfile='demo/data/discdata.xls'
transformedata='demo/tmp/discdata_processed.xls'
data=pd.read_excel(discfile)
data=data[data[
'TARGET_ID']==184].copy()
data_group=data.groupby(
'COLLECTTIME')#以时间分组、
def attr_trans(x):#定义属性变换函数
   
result=pd.Series(index=['SYS_NAME','CWXT_DB:184:C:\\','CWXT_DB:184:D:\\','COLLECTTIME'])
    result[
'SYS_NAME']=x['SYS_NAME'].iloc[0]
    result[
'COLLECTTIME']=x['COLLECTTIME'].iloc[0]
    result[
'CWXT_DB:184:C:\\']=x['VALUE'].iloc[0]
    result[
'CWXT_DB:184:D:\\']=x['VALUE'].iloc[1]
   
return result
data_processed=data_group.apply(attr_trans)
#逐组处理
data_processed.to_excel(transformedata,index=False)

 

处理后的数据:

9	应用系统负载分析与磁盘容量预测

9.6模型构建

将处理后的数据分为两部分,一部分是建模样本数据,一部分是模型验证数据。选取建模数据的最后5条数据为验证数据,其他数据为建模样本数据。

(1)我们首先要做的是对观测值进行平稳性检验,如果不平稳需要进行差分运算直到差分后的数据平稳

(2)在数据平稳后进行白噪声检验,如果没有通过白噪声检验,就进行模型识别,识别模型属于AR,MA和ARMA中的哪一种模型,并通过贝叶斯信息准则对模型进行定阶,确定ARIMA模型的p、q参数 。

(3)在模型识别后需要进行模型检验,检测模型残差序列是否为白噪声序列,如果没有通过检验,需要对其进行重新识别,对已经通过检验的模型采用极大似然估计方法进行模型参数估计。

(4)应用模型进行预测,将实际值与预测值进行误差分析。如果误差比较小,表明模型拟合效果较好,则模型可以结束,反之需要重新估计参数。

9.6.1平稳性检验

为了确定原始数据序列中没有随机趋势或确定趋势,需要对数据进行平稳性检验,否则会产生伪回归现象。本案例采用单位根检验(ADF)的方法。单位根检验是指检验序列是否存在单位根,如果存在单位根就是非平稳时间序列了。

#平稳性检验代码
data2=pd.read_excel(transformedata)
data2=data2.iloc[:
len(data2)-5]#不使用最后5个数据
#平稳性检验
from statsmodels.tsa.stattools import adfuller as ADF
diff=
0
adf=ADF(data2['CWXT_DB:184:D:\\'])
while adf[1]>=0.05:#adf[1]p值,p值小于0.05认为是平稳的
   
diff=diff+1
   
adf=ADF(data2['CWXT_DB:184:D:\\'].diff(diff).dropna())
print (u'原始序列经过%s阶差分后归于平稳,p值为%.10f'%(diff,adf[1])

print adf

 9	应用系统负载分析与磁盘容量预测

上图为输出的原始序列ADF检验结果:adf值为-5.7942637174166043,在置信区间为5%时标准为-2.9412623574865142,adf值比它小,说明拒绝原假设(ADF的原假设是存在单位根),也就是说不存在单位根,即原序列稳定。

或者也可以这么判断,4.7925912633937558e-07为p值,p值小于0.05时认为是平稳的。

9.6.2平稳检验

   为了验证平稳序列中有用信息是否已被提取完,需要对序列进行白噪声检验,如果序列是白噪声的说明序列中的有用信息已经被提取完毕了,剩下的全是随机扰动,无法进行预测和使用,本案例采用LB统计量的方法进行白噪声检验。(检验时间序列是否为白噪声序列,一般如果统计量的P值小于0.05时,则可以拒绝原假设,认为该序列为非白噪声序列

#白噪声检验
from statsmodels.stats.diagnostic import acorr_ljungbox
[[lb]
,[p]]=acorr_ljungbox(data2['CWXT_DB:184:D:\\'],lags=1)#滞后阶数
if p<0.05:
   
print (u'原始序列为非白噪声序列,对应的p值为:%s'%p)
else:
   
print (u'原始序列为白噪声序列,对应的p值为:%s' % p)
[[lb]
,[p]]=acorr_ljungbox(data2['CWXT_DB:184:D:\\'].diff().dropna(),lags=1)
if p<0.05:
   
print (u'一阶差分序列为非白噪声序列,对应的p值为:%s'%p)
else:
   
print (u'一阶差分序列为白噪声序列,对应的p值为:%s' % p)

9	应用系统负载分析与磁盘容量预测

也就是说原始序列是非白噪声的,一阶差分序列是白噪声序列。

9.6.3模型识别

本案例采用极大似然比方法进行模型的参数估计,估计各个参数值,然后针对各个不同模型,采用BIC信息准则(贝叶斯信息准则)对模型进行定阶,确定p,q参数,从而选择最优模型。

#模型识别
#确定最佳pdq
data3=pd.read_excel(transformedata,index_col='COLLECTTIME')
data3=data3.iloc[:
len(data3)-5]
xdata=data3[
'CWXT_DB:184:D:\\']
from statsmodels.tsa.arima_model import ARIMA
#定阶
pmax=int(len(xdata)/10)
qmax=
int(len(xdata)/10)
bic_matrix=[]
#bic矩阵
for p in range(pmax+1):
    tmp=[]
   
for q in range(qmax+1):
       
try:#存在报错,用try来跳过报错
           
tmp.append(ARIMA(xdata,(p,1,q)).fit().bic)
       
except:
            tmp.append(
None)
    bic_matrix.append(tmp)
bic_matrix=pd.DataFrame(bic_matrix)
p
,q=bic_matrix.stack().idxmin()#从中可以找出最小值
print (u'BIC最小的p值和q值为:%s,%s'%(p,q))

9	应用系统负载分析与磁盘容量预测

9.6.4模型检验

模型确定后,检验其残差序列是否为白噪声,如果不是白噪声说明残差中还存在有用信息,需要修改模型或者进一步提取,本案例确定的模型为ARIMA(1,1,1)

#模型检验
lagnum=12#残差延迟个数
arima=ARIMA(xdata,(1,1,1)).fit()#建立并训练模型
xdata_pred=arima.predict(typ='levels')#预测
pred_error=(xdata_pred-xdata).dropna()#计算残差(观察值与拟合值之间的差)
from statsmodels.stats.diagnostic import acorr_ljungbox#白噪声检验
lb,p=acorr_ljungbox(pred_error,lags=lagnum)
h=(p<
0.05).sum()#p值小于0.05,认为是非白噪声
if h>0:
   
print (u'模型不符合白噪声检验')
else:
   
print (u'模型符合白噪声检验')

 

9	应用系统负载分析与磁盘容量预测

结果显示模型符合白噪声检验

9.6.4模型预测

我们通过检验模型进行预测,获取未来5天的预测值,并且与实际值做比较。

9	应用系统负载分析与磁盘容量预测

9	应用系统负载分析与磁盘容量预测

根据图我们可以看出实际值和预测值还是有点差距的,但是差多少?是不是在我们接受的范围内?这需要我们对模型进行评价。

9.6.5模型评价

本案例采用三个衡量模型预测精度的统计指标:平均绝对值、均方根误差、均方根误差和平均绝对误差,这三个指标从不同侧面反映了算法的预测精度。

选择建模后的5条记录作为实际值,将预测值与实际值进行误差分析。

#计算预测误差
file='demo\data\predictdata.xls'
data=pd.read_excel(file)
abs_=(data[
u'预测值']-data[u'实际值']).abs()
mae_=abs_.mean()
#平均绝对误差
rmse_=((abs_**2).mean())**0.5#均方根误差
mape_=(abs_/data[u'实际值']).mean()#平均绝对百分误差
print (u'平均绝对误差:%0.4f,\n均方根误差为:%0.4f,\n平均绝对百分误差:%0.6f'%(mae_,rmse_,mape_))

9	应用系统负载分析与磁盘容量预测

综合业务分析,将阈值设置为1.5,也就是说这些误差都小于阈值,模型预测效果在实际业务可接受的范围内,可以采用此模型进行预测。