欢迎大家来到IT世界,在知识的湖畔探索吧!
作者 | 中国农业银行研发中心 王哲
头图 | 下载于视觉中国
出品 | CSDN云计算(ID:CSDNcloud)
随着业务不断发展,微服务架构越来越受到各大企业的青睐,随之也给传统运维带来更大的挑战,多维KPI指标数量繁多、相互之间关系复杂,要想在故障发生后,第一时间定位到故障性能指标,只依靠人力排查的难度可想而知。
在几代运维人的不懈努力下,故障定位的方法也由传统的查日志、匹配历史解决方案,晋升为利用机器学习、深度学习等更加智能快捷的方法,进行异常检测、时序分析、根因定位,快速定位异常,极大缩短故障抢修时间,从而快速恢复服务。本文将从异常检测算法、相关性系数以及格兰杰因果分析三种方法出发,对故障根因进行初步的探索和实践。
异常检测算法——孤立森林和RRCF
根因定位问题的目标其实是要定位到某个网元发生的某种指标异常,那么将异常检测算法直接运用到根因定位问题中也是有效可行的,本章节将介绍孤立森林和Robust Random Cut Forest两种异常检测算法的应用。
众所周知,孤立森林(Isolation Forest)是一种高效的异常检测算法,它和随机森林比较相似,不同点在于每次选择划分属性和划分值时都是随机的,而不是根据信息增益或者基尼指数来选择。在构建树的过程中,如果一些样本很快就到达了叶子节点(即叶子到根的距离很短),那么就被认为很有可能是异常点。比如下图中,共有a,b,c,d四个指标,b和c的高度为3,a的高度为2,d的高度为1,d就有可能是异常,因为其最早就被孤立了。
下面展示该方法的代码实现:
import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.ensemble import IsolationForest from scipy import stats # 读入数据 df = pd.read_csv(‘a.csv’) rng = np.random.RandomState(42) #定义样本总数 n_samples=10 # 训练模型 clf = IsolationForest(max_samples=n_samples, random_state=rng, contamination=0.33) #contamination为异常样本比例 clf.fit(df.values) scores_pred = clf.decision_function(df.values) # 测试 clf.predict(df.values)
欢迎大家来到IT世界,在知识的湖畔探索吧!
RRCF(Robust Random Cut Forest)是以孤立森林为基础改造而来的,由于数据是持续产生的,那么数据时序特征也是不可忽视的重要特征,RRCF的优势就在于能更好地适用于流式数据。
大致的算法流程如下:首先对数据流进行采样,为保证数据的实效性,采用蓄水池采样策略判断出当前数据点是否参与异常检测建模,同时指定一个时间窗口长度,当建模的数据过期后,应该从模型中剔除掉;然后构建森林,人为指定采样点数量(如果使用RRCF的默认值,将会构建出一个由100棵树构成的森林,每棵树都从上一步的池中随机采样256个数据点);在森林构造完成后,将待处理的样本点放入森林中并计算异常分数,每个样本的异常分数代表包含或不包含该点的情况下,导致模型发生变化的程度,计算公式如下:
在无法很好的确定故障根因的情况下,可以考虑计算各个时间序列指标特征的RRCF异常分数,然后对其进行排序,得到的TOPN作为根因的候选值,再结合其他方法能够得到比较好的异常定位效果。
相关性系数
要进行故障诊断,完成根因定位,计算不同指标的相关系数势必会产生一定的帮助。比如在观测到响应时间、交易量等业务指标异常时,可以计算这一段时间内,与该业务指标相关性较高的的性能指标,这些高相关性的性能指标很有可能是引发这次故障的根因。当然,在实际使用时,需要结合实际情况或者前期训练的结果,设置相应的权重,决定其是否为真正根因。
计算相关性系数的方法有很多,例如Person相关、时间滞后互相关(TLCC)计算两个信号之间的方向性,动态时间扭曲(DTW)同步长度不同的信号、还有瞬时相位同步等方法,不同的方法将适用于不同的数据场景。本章节将以常用的Person相关为例展开实验,展现相关性系数的魅力。
两个连续变量(X,Y)的pearson相关性系数等于它们之间的协方差cov(X,Y)除以它们各自标准差的乘积(σX,σY),系数的取值总是在-1到1之间,数字 -1(负相关)、0(不相关)和 1(完全相关)表示出它们之间的线性关系,相关系数的绝对值越大,相关性越强,也就是说,相关系数越接近于1或-1,相关度越强,相关系数越接近于0,相关度越弱。
下面展示一个在一段时间内不同指标之间的Person相关系数的方法,并根据两两指标间的系数大小,排序输出topn进行结果展示。
欢迎大家来到IT世界,在知识的湖畔探索吧!# 计算相关系数并进行可视化 def plot_corr(new_metric1): columns = [column for column in new_metric1] col_dic = {} for i in range(len(columns)): col_dic[columns[i]] = new_metric1[columns[i]] df = pd.DataFrame(col_dic) #画出曲线趋势图 ax = df.plot() ax.legend(loc=2, bbox_to_anchor=(1.05,1.0),borderaxespad = 0.) plt.show() # 计算相关系数 df_corr = df.corr() # 对相关系数排序输出 sort_res = sort_corr(df_corr) # 可视化 cmap:YlGnBu RdPu import matplotlib.pyplot as mp, seaborn seaborn.heatmap(df_corr, center=0, annot=True, cmap='YlGnBu') mp.show() return df_corr, sort_res
下图1展示的是不同指标在一段时间内的趋势,图2展示的是这些指标之间的相关性系数热力图,并对相关系数设定一定的阈值,得到大于阈值的强相关性指标集。
['system.load.1', 'system.load.1.pct', 'system.cpu.pct_usage', 'system.cpu.user', 'system.load.norm.1', 'system.cpu.i_dle']
格兰杰因果分析
格兰杰因果关系作为一种可以衡量时间序列之间相互影响关系的方法,近十几年备受业界青睐。如果想知道两个序列之间是否具有因果性,可以用格兰杰因果检验(Granger causality test)进行分析。
格兰杰因果关系检验的是“统计学意义上”的因果性(时间上的先后),和我们日常语言逻辑中的因果关系并不能同一而论。从统计的角度上讲,因果关系是通过概率或者分布函数的角度体现出来的,在宇宙中所有其它事件的发生情况固定不变的条件下,如果一个事件 A 的发生与会对于另一个事件 B 的发生造成一定的影响,并且这两个事件在时间上又是先后发生的(A 前 B 后),那么我们便可以说 A 是 B 的原因。
举个生活中的例子:在下雷雨前往往会天气闷热,有“蚂蚁搬家”的现象发生,从统计学角度来讲,“蚂蚁搬家”和“下雷雨”之间存在因果关系,但并不能说“蚂蚁搬家”是“下雷雨”的原因,按照我们通常的逻辑来讲,“下雷雨”反而是“蚂蚁搬家”的原因。因此在使用该方法前,要明确格兰杰因果关系检验的是“统计学意义上”因果性的内涵。
下面展示使用Python的statsmodels中的grangercausalitytests实践,代码如下:
欢迎大家来到IT世界,在知识的湖畔探索吧!from statsmodels.tsa.stattools import grangercausalitytests import pandas as pd import numpy as np #生成数据 df = pd.DataFrame(np.random.randint(0, 100, size=(10, 2)), columns=['a', 'b']) #格兰杰因果检验 grangercausalitytests(df[['a', 'b']], maxlag=2)
执行的结果为:
Granger Causality number of lags (no zero) 1 ssr based F test: F=5.7509 , p=0.0534 , df_denom=6, df_num=1 ssr based chi2 test: chi2=8.6264 , p=0.0033 , df=1 likelihood ratio test: chi2=6.0496 , p=0.0139 , df=1 parameter F test: F=5.7509 , p=0.0534 , df_denom=6, df_num=1 Granger Causality number of lags (no zero) 2 ssr based F test: F=1.6759 , p=0.3246 , df_denom=3, df_num=2 ssr based chi2 test: chi2=8.9380 , p=0.0115 , df=2 likelihood ratio test: chi2=6.0010 , p=0.0498 , df=2 parameter F test: F=1.6759 , p=0.3246 , df_denom
对结果解读如下:
number of lags (no zero) 1:当lags为1时的检测结果
ssr based F test:残差平方和F检验
ssr based chi2 test:残差平方和卡方检验
likelihood ratio test:似然比检验结果
parr F testamete:参数 F 检验结果
根因定位在日常运维工作中起到的重要作用可以说是不言而喻,本文介绍了孤立森林和RRCF、相关性分析以及格兰杰因果关系三种根因定位的方法,也做了初步的算法探索与实践。相信随着研究的进一步深入,根因定位在智能运维领域的应用会更加广泛,我们也将为快速定位异常,大力而做出不懈的努力。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。 本文来自网络,若有侵权,请联系删除,如若转载,请注明出处:https://itzsg.com/62675.html