-
已有研究表明,当软件连续运行较长时间时,其内部的一些错误条件的积累会导致软件性能衰退甚至停止运行,这种现象称为软件老化[1]。软件老化在需要长时间运行的系统中尤为常见,如虚拟机和虚拟机管理器[2]、操作系统[3]、云平台系统软件[4]、Java虚拟机[5]、Web服务器[6-7]、视频点播系统[8]等。软件老化降低了系统的可靠性与可用性,有时可能会给应用带来难以估量的损失。为了降低甚至消除软件老化带来的风险,文献[1]提出了一种名为软件再生的方法,及时评估系统老化状态并适时采取再生操作,提升了系统可靠性。如何选择再生的时机是消除软件老化风险的关键,再生太早则代价过高、效果不明显,而再生太晚则起不到降低风险的作用。
确定再生时机的方法主要分为两种:基于模型的方法和基于测量的方法[6]。前者通过马尔科夫、随机Petri网等方法对系统建模,计算出系统的最佳再生周期;后者基于系统核心指标的观察数据进行软件老化评估,预测关键资源耗尽或是降低到一定阈值的时间,从而适时采取再生操作。基于测量的分析方法主要包括:局部线性回归、决策树、支持向量机、时间序列分析等。与基于模型的方法相比,基于测量的方法更侧重于反映真实观察数据的变化规律,也更容易在工程领域被验证[9]。可用内存数、内存交换区使用大小、CPU利用率等是已有基于测量方法的主要观察指标,而上述指标的观察值和系统负载强相关。
值得关注的是,软件系统的老化趋势很大程度上受负载变化的影响[6],负载越重、老化趋势会越快。而需要长时间运行的系统其负载通常表现出一定的周期性变化趋势,呈现出time-of-day或month-of-year效应[10]。如基于Web服务器的ERP系统负载与员工上下班周期强相关,白天工作时间系统负载较重,员工下班后系统负载会逐步降低。但现有基于测量的方法未充分考虑系统负载的周期性变化特征。文献[9]主要针对目前软件老化分析中的单参数模型及未考虑变量间关联性和影响性的多参数模型的不足,提出了运用多元时间序列模型分析软件老化的方法,但未考虑系统负载特征与变量观测值之间的关系;文献[11]采用了响应时间、吞吐率、内存使用量等多个参数以反应软件老化趋势,并基于机器学习 (M5P) 算法预测软件的宕机时间,但同样对负载特征考虑不足。文献[6]通过观察内存交换区使用数、空闲物理内存数等指标变化情况,建立了季节性自回归 (seasonal auto-regression) 模型描述软件老化,同时给出了基于已使用内存交换区大小的预测结果,但AR模型本质上是一种针对平稳时间序列的分析方法,使得季节性自回归模型在考虑季节性负载的同时忽视了其变化的不平稳性。
因此,本文提出了一种基于乘积季节性自回归求和滑动平均模型 (seasonal autoregressive integrated moving average, SARIMA) 的软件老化评估方法。该方法充分考虑了系统负载给软件老化带来的影响,既涉及了季节性因素,又纳入了对动态趋势的评估,能够更为准确地预测关键指标 (资源使用率) 的变化趋势,以提升软件老化评估的效果。最后,基于一个实际线上系统的监测数据开展实验分析,说明了该方法的有效性。
HTML
-
为了说明本文老化评估方法的有效性,收集了某线上系统连续3天的实际运行监测数据。主要包括CPU占用率、内存占用率等指标。为避免影响实际系统的运行,降低了监测数据的采集频率。最终采集频率为20 min/次,数据规模为216条。
在反映软件老化状况的众多指标中,内存使用是其中的一项关键指标[3, 6, 8]。因此,本文把内存作为软件老化的特征展开分析。数据集中关于内存的统计如图 2所示。可以看出,内存消耗具备一定的季节性特征。每个周期开始后,内存占用率会持续上升,当上升到一定值后会骤降 (对应时间点定时重置系统所致),而后又会继续上升。其中,第2个周期内圆圈标识点内存使用骤降是因为实际故障处置中的重启所致。图 2的数据表明,随着系统运行时间的增加,内存使用率指标上升趋势逐步加快,系统老化现象也愈发明显。同时,软件再生 (重启来实现) 及时降低内存消耗,避免因内存不足导致软件崩溃。
-
本文借助R语言工具 (3.1.2版本)[19]完成乘积季节模型识别、参数估计等操作,并通过模型诊断、关键指标预测等说明了本文方法的有效性。
-
图 2中的统计数据表现出了很强的季节性特征,因此,首先能够确定模型为一种季节性模型。而后,对同一周期内数据特征进行分析,主要是计算其ACF (自相关) 值和PACF (偏自相关) 值。
实际计算得知,内存数据具有较强的非平稳特征,无明显的截尾或拖尾现象。截尾是统计数据在某个点之后都突然为零的现象,拖尾是统计数据在某个点之后统计值逐步降低并很快接近于零的现象。需要通过差分操作,将统计数据变成平稳的。对一般的非平稳时间序列,一次差分就能使之变成平稳的时间序列。即先确定了模型为ARIMA (p, 1, q) (k, 1, m)72,并通过观察差分后平稳序列的自相关和偏自相关图,得出可能性最大的模型为:ARIMA (0, 1, 0) (0, 1, 0)72,ARIMA (0, 1, 1)(0, 1, 0)72,ARIMA (1, 1, 0)(0, 1, 0)72,ARIMA (1, 1, 1)(0, 1, 0)72,ARIMA (0, 1, 0)(0, 1, 1)72,ARIMA (0, 1, 1)(0, 1, 1)72,ARIMA (1, 1, 0)(0, 1, 1)72,ARIMA (1, 1, 1)(0, 1, 1)72。
最终模型的选定主要依据AIC和BIC最小准则。上述模型的对应指标统计值如表 1所示。
模型 AIC值 BIC值 ARIMA (0, 1, 0)(0, 1, 0)72 255.68 259.94 ARIMA (0, 1, 1)(0, 1, 0)72 255.29 259.82 RIMA (1, 1, 0)(0, 1, 0)72 255.36 259.88 ARIMA (1, 1, 1)(0, 1, 0)72 256.57 263.36 ARIMA (0, 1, 0)(0, 1, 1)72 256.68 261.2 ARIMA (0, 1, 1)(0, 1, 1)72 257.29 264.08 ARIMA (1, 1, 0)(0, 1, 1)72 257.06 264.83 ARIMA (1, 1, 1)(0, 1, 1)72 258.54 267.59 基于表 1的结果,结合AIC和BIC准则,最终选取的模型为ARIMA (0, 1, 1)(0, 1, 0)72。
-
对上述模型进行拟合,得到在前两个周期里真实值和拟合值的时序图,如图 3所示。
图 3中,实线为真实值,虚线为模型拟合值。该图显示出拟合值能较好拟合真实统计数据。另外,也可对模型的残差序列进行白噪声检验以判断模型的真实效果。一般地,若残差序列是白噪声序列,则认为该模型适合模拟当前时间序列,若残差序列不是白噪声序列,则认为还存在有用信息未提取出来,模型还需进一步改进。用R语言中的Box.test () 函数完成残差序列的随机性检验,最终的p值为0.875,可以认为残差序列为白噪声序列。同时,还可以检验残差序列的自相关数随着滞后阶数的增大是否逐渐趋近于零。检验结果如图 4所示,残差序列相关系数均落入了随机区间,且基本上都小于0.2。因此,ARIMA (0, 1, 1)(0, 1, 0)72模型较好地拟合了真实数据。
-
软件老化评估是根据关键指标的历史时间序列,运用乘积季节ARIMA模型对关键指标未来值进行推测。若该值在未来某时间点上的推测结果超过一定的阈值,则认为系统将会在该点发生异常,系统管理员可提前采取备份、软件再生等操作,以降低老化给业务运行带来的潜在影响。
本节利用上述数据集进行预测分析。把前两个周期的数据当作是历史数据,第3个周期内的数据当作是测试数据,以比对模型的预测效果。预测阶数为12,每个数据点采集频率为20 min,因此提前预测的时长为240 min (4 h)。第一点预测效果如图 5所示 (实线为测试集中的实际值,虚线为对应点上的预测值)。
从图 5可以看出,预测曲线的走势与实际数据曲线的走势基本一致。另外,本文还计算了预测结果的MAPE值 (the mean absolute percentage error),即平均绝对误差百分比来对模型进行评价。上述12阶预测的MAPE值为0.77%,即预测的相对误差控制在1%以内,能够很好地满足再生策略的生产需求。