‍‍

作者 | 中国农业银行研发中心 王哲

头图 | 下载于视觉中国

出品 | 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)

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进行结果展示。

# 计算相关系数并进行可视化
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 RdPuimport matplotlib.pyplot as mp, seabornseaborn.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实践,代码如下:

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=1Granger 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、相关性分析以及格兰杰因果关系三种根因定位的方法,也做了初步的算法探索与实践。相信随着研究的进一步深入,根因定位在智能运维领域的应用会更加广泛,我们也将为快速定位异常,大力而做出不懈的努力。

60+专家,13个技术领域,CSDN 《IT 人才成长路线图》重磅来袭!

直接扫码或微信搜索「CSDN」公众号,后台回复关键词「路线图」,即可获取完整路线图!

更多精彩推荐
☞5G、射频、奥特曼,这仨有联系吗?☞再见 Nacos,我要玩 Service Mesh 了!☞有没有不用加班的程序员?如何衡量程序员的工作量?
点分享点收藏点点赞点在看

用根因定位法,让运维效率再高一点!相关推荐

  1. 天眼AIOps—AI提升运维效率

    1.系统简介 AI结合大数据的智能运维现已成为运维领域的焦点及未来发展趋势.天眼大数据AIOps平台致力于引入成熟的AI算法.大数据流处理技术及成熟的开源组件,打造智能运维平台.该平台致力于改变依赖专 ...

  2. 发布国内首个无服务器容器服务,运维效率从未如此高效

    近年来,随着越来越多的企业基于微服务架构构建自身核心业务平台后,微服务已获得越来越多技术人员的肯定,同时,微服务也承载着企业数字化转型的重任.但微服务架构的落地给企业的运维团队带来了不少的挑战,原有的 ...

  3. 想提高运维效率,那就把MySQL数据库部署到Kubernetes 集群中

    摘要:Kubernetes 很多看起来比较"繁琐"的设计的主要目的,都是希望为开发者提供更多的"可扩展性",给使用者带来更多的"稳定性"和& ...

  4. 多功能自动化智能运维平台,提升集群的全自动运维效率

    一.开源项目简介 致力于打造一个集主机管理.配置部署.监控报警.异常诊断.安全审计等一系列功能的自动化运维平台. 探索创新的sysAK.ossre诊断工具及高效的LCC(Libbpf Compiler ...

  5. 如何提高运维团队的运维效率?

    如何运行一个庞杂的机房,进行无数的主动和被动的操作,同时避免错误导致的数据中心故障? 1.以终为始 以终为始是一种以结果为导向的思维方式,提示人们在做事情前要先明确做事情的最终目的,也就是" ...

  6. 数据中心如何提高运维效率?数据中心综合能效管理解决方案——安科瑞 严新亚

    1.概述 安科瑞电气紧跟数据中心发展形式,推出AcrelEMS-IDC数据中心综合能效管理解决方案,包含有电力监控.动环监控.消防监控.能耗统计分析.智能照明控制以及新能源监测几个子系统.集成了变配电 ...

  7. 《2023金融科技趋势研究报告》显示dbPaaS管理平台将成为提升数据库应用、运维效率的关键...

    2023年1月,恒生电子研究院发布了<2023金融科技趋势研究报告>,其中明确指出dbPaaS管理平台将成为提升数据库应用.运维效率的关键.dbPaaS趋势的背景是,随着信创进程的推进以及 ...

  8. 基于云计算的自动化部署与自动化运维:提高运维效率

    作者:禅与计算机程序设计艺术 1.简介 随着互联网技术的飞速发展,网站流量日益增长,用户对网站功能及其可用性的需求也越来越高,越来越多的人开始担忧网站的安全和稳定性.因此,如何快速.准确地处理网站故障 ...

  9. 运维监控再添新品,F5联合智维数据推出应用质量主动拨测解决方案

    一直以来,业务的稳定性和客户体验是企业各个部门都关注的重点,也是企业数字化转型的重要支撑.但在实际的运维环境中,如果只从服务端的视角进行监控,往往会出现数据中心内部监控体系显示设备状态正常,但却收到了 ...

最新文章

  1. MySQL更新命令_UPDATE
  2. 问题清空easyui required=true的提示信息所在位置不对。乱跑的解决办法
  3. HuaWeiCloud_model_arts
  4. JSP简单练习-用Servlet获取表单数据
  5. “让Keras更酷一些!”:层与模型的重用技巧
  6. Excel教程一:将Excel中一列转换成多行
  7. firefox 开源_Firefox 10岁了,Microsoft开源了更多,等等
  8. 信息熵,条件熵,相对熵,交叉熵
  9. android 4.0 蓝牙分析之一
  10. CountDownLatch分析(AQS共享锁)
  11. 图书租赁管理系统——数据流程图
  12. 成信大809软件工程专业基础历年真题及答案
  13. 解读加拿大综合类大学排名 提升雅思成绩刻不容缓
  14. bootstrap4学习路线
  15. 音视频的相关名词、术语、概念
  16. 键盘定位板图纸_客制化键盘
  17. MapGis 二次开发 常见问题 转
  18. TypeError: can‘t convert cuda:0 device type tensor to numpy. Use Tensor.cpu() to copy the tensor to
  19. 《高级计算机网络》之物联网——大连理工大学研究生课程整理笔记(非常详细,通俗易懂)
  20. pat顶级1003 Universal Travel Sites (35 point(s))

热门文章

  1. zynq中mgtx应用_Zynq7000系列之芯片引脚功能综述
  2. 计算机主机硬件图片,电脑主机内部有哪些硬件
  3. linux创建新进程就分配空间,linux几种创建进程的方法
  4. hive的一些调优参数
  5. dubbo启动服务启动报错.UnsatisfiedDependencyException: Error creating bean with name '***': Un
  6. 初学ACM之路(训练大纲)
  7. Linux内核社区迁移到github?
  8. 阿里云CDN操控2.0版本正式发布
  9. JVM性能提升50%,聊一聊背后的秘密武器Alibaba Dragonwell
  10. 数据的“敏捷制造”,DataWorks一站式数据开发治理范式演进