百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

用根因定位法,让运维效率再高一点

toyiye 2024-06-21 12:30 9 浏览 0 评论

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

头图 | 下载于视觉中国

出品 | 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 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实践,代码如下:

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

相关推荐

如何用 coco 数据集训练 Detectron2 模型?

随着最新的Pythorc1.3版本的发布,下一代完全重写了它以前的目标检测框架,新的目标检测框架被称为Detectron2。本教程将通过使用自定义coco数据集训练实例分割模型,帮助你开始使...

CICD联动阿里云容器服务Kubernetes实践之Bamboo篇

本文档以构建一个Java软件项目并部署到阿里云容器服务的Kubernetes集群为例说明如何使用Bamboo在阿里云Kubernetes服务上运行RemoteAgents并在agents上...

Open3D-ML点云语义分割实验【RandLA-Net】

作为点云Open3D-ML实验的一部分,我撰写了文章解释如何使用Tensorflow和PyTorch支持安装此库。为了测试安装,我解释了如何运行一个简单的Python脚本来可视化名为...

清理系统不用第三方工具(系统自带清理软件效果好不?)

清理优化系统一定要借助于优化工具吗?其实,手动优化系统也没有那么神秘,掌握了方法和技巧,系统清理也是一件简单和随心的事。一方面要为每一个可能产生累赘的文件找到清理的方法,另一方面要寻找能够提高工作效率...

【信创】联想开先终端开机不显示grub界面的修改方法

原文链接:【信创】联想开先终端开机不显示grub界面的修改方法...

如意玲珑成熟度再提升,三大发行版支持教程来啦!

前期,我们已分别发布如意玲珑在deepinV23与UOSV20、openEuler24.03发行版的操作指南,本文,我们将为大家详细介绍Ubuntu24.04、Debian12、op...

118种常见的多媒体文件格式(英文简写)

MP4[?mpi?f??]-MPEG-4Part14(MPEG-4第14部分)AVI[e?vi??a?]-AudioVideoInterleave(音视频交错)MOV[m...

密码丢了急上火?码住7种console密码紧急恢复方式!

身为攻城狮的你,...

CSGO丨CS2的cfg指令代码分享(csgo自己的cfg在哪里?config文件位置在哪?)

?...

使用open SSL生成局域网IP地址证书

某些特殊情况下,用户内网访问多可文档管理系统时需要启用SSL传输加密功能,但只有IP,没有域名和证书。这种情况下多可提供了一种免费可行的方式,通过openSSL生成免费证书。此方法生成证书浏览器会提示...

Python中加载配置文件(python怎么加载程序包)

我们在做开发的时候经常要使用配置文件,那么配置文件的加载就需要我们提前考虑,再不使用任何框架的情况下,我们通常会有两种解决办法:完整加载将所有配置信息一次性写入单一配置文件.部分加载将常用配置信息写...

python开发项目,不得不了解的.cfg配置文件

安装软件时,经常会见到后缀为.cfg、.ini的文件,一般我们不用管,只要不删就行。因为这些是程序安装、运行时需要用到的配置文件。但对开发者来说,这种文件是怎么回事就必须搞清了。本文从.cfg文件的创...

瑞芯微RK3568鸿蒙开发板OpenHarmony系统修改cfg文件权限方法

本文适用OpenHarmony开源鸿蒙系统,本次使用的是开源鸿蒙主板,搭载瑞芯微RK3568芯片。深圳触觉智能专注研发生产OpenHarmony开源鸿蒙硬件,包括核心板、开发板、嵌入式主板,工控整机等...

Python9:图像风格迁移-使用阿里的接口

先不多说,直接上结果图。#!/usr/bin/envpython#coding=utf-8importosfromaliyunsdkcore.clientimportAcsClient...

Python带你打造个性化的图片文字识别

我们的目标:从CSV文件读取用户的文件信息,并将文件名称修改为姓名格式的中文名称,进行规范资料整理,从而实现快速对多个文件进行重命名。最终效果:将原来无规律的文件名重命名为以姓名为名称的文件。技术点:...

取消回复欢迎 发表评论:

请填写验证码