内容简介:公司中常常会出现很多的报警,大量的报警充斥在运维工作人员的工作和生活中,给运维工作人员带来了很大的压力。更让他们头痛的是,他们需要对比报警事件与监控项的变化规律,需要在数量庞大的报警以及监控数据中找到问题的本质,这通常没有明确的规则,更多的时候需要依靠运维人员长期的工作经验。因此,如何能够快速的从报警事件中定位问题,缩小运维人员的排查范围成了提高运维效率的关键。本文针对运维工作人员所关心的6大类报警,通过相关性检验,信息增益比多次筛选确定影响各类报警的监控指标,再以此为特征运用XGBoost算法对报警进行
背景:
公司中常常会出现很多的报警,大量的报警充斥在运维工作人员的工作和生活中,给运维工作人员带来了很大的压力。更让他们头痛的是,他们需要对比报警事件与监控项的变化规律,需要在数量庞大的报警以及监控数据中找到问题的本质,这通常没有明确的规则,更多的时候需要依靠运维人员长期的工作经验。因此,如何能够快速的从报警事件中定位问题,缩小运维人员的排查范围成了提高运维效率的关键。
本文针对运维工作人员所关心的6大类报警,通过相关性检验,信息增益比多次筛选确定影响各类报警的监控指标,再以此为特征运用XGBoost算法对报警进行分类。真正做到了缩小排查范围以及预测报警事件的作用。
方法研究:
本文分别运用了微软论文中相关性分析,信息增益比确定影响各类报警的监控指标,运用XGBoost算法对报警进行分类,下面将详细分析:
相关性分析:
运维角度能够收集大量的机器维度的监控项,但是不是所有的监控项对于某一类报警都有影响,因此想要达到精确定位报警问题的目的,就需要初步的筛选出与报警相关的监控项。如下图所示,每当事件A发生时,cup占有率都会升高,而事件B发生时cup占有率的变化没有规律性变化,因此可以说明cup占有率与事件A相关而与事件B无关。
报警是事件集,监控项是时序数据集,两者刻画问题的角度不同,因此判断相关性也比较困难。而微软在2014年SIGKDD会议上发表的论文《Correlating Events with Time Series for Incident Diagnosis》中对这一问题给出了解决方法,具体做法为: 作者将事件(E)和时序(S)数据相关关系问题转化为两个两样本问题,两样本假设检验的核心是判断两个样本是否来自相同的分布。首先选取事件发生前(或者后)对应的N段长为k的时序样本数据,用A1表示。样本组A2则是在时间序列上随机选取一系列长度为k的样本数据。样本集为A1并上A2。如果E和S相关,则A1和A2的分布不同,否则分布相同,怎样来判断A1和A2的分布是否相同?我们看下面这个例子:
上图中样本0-4来自样本组A1,5-9属于样本组A2,使用DTW算法来计算两个样本之间的距离(DTW算法可以很好的适应序列数据的伸缩和位移)。某个属于样本组Ai(i=1或2)的样本X,对于X的r个最近邻居样本,与X属于相同样本组的个数越多则意味着样本组A1和A2分布更不同,即E和S越相关。例如,取邻居个数r=2,样本7的两个最近邻居分别是来自两个不同样本组的3和5,但是样本5的两个最近邻居是来自相同样本组A2的7和8。文章使用置信系数(Confident coefficient)来判断“假设检验H1”(两个分布不相同,即E和S相关)的可信度,置信系数越大,H1越可信。算法的两个关键参数:最近邻居个数r和时间序列长度k,邻居个数为样本个数的自然对数,时序数据的自相关函数曲线的第一个峰值为序列长度。
在运用K近邻算法时,首先序列集可以分为两部分M1和M2,M1是报警点附近的监控项序列,M2是非报警点周围的监控项序列。定义指示函数:
其中x是序列元素,M是M1与M2的并集,Nk(x,M)指集合M中与元素x第k近的元素,接下来计算相关性的值:
其中p是集合M的元素个数,当p的值足够大时,Tkp满足正态分布,具体如下:
因此可以根据上式进行相关性的假设检验,从而选择出与报警类相关的监控项。
信息增益比:
利用相关性能选择出与报警类相关的所有特征,但是仍然有大量的监控项被选出,如果直接进行分类很容易出现过拟合现象。因此利用相关性检验只能是特征的初步筛选,为达到精确定位问题的目的,需要对监控项进行精细筛选,本文采用的方法是信息增益比。
信息增益和信息增益比是衡量离散特征对模型的贡献程度的重要指标,常常用于决策树的构建之初。特征A对于训练数据集D的信息增益g(D,A)用于表示特征A使数据集 D的分类不确定性减少的程度。对于数据集D,设|D|代表样本容量,设样本有K个类别 ,|ck|为属于类别ck的样本个数,再设特征A有n个不同的取值,并根据特征A的取值将 划分成n个子集,记子集Di中属于类别ck的样本集合为Dik,因此信息增益g(D,A)可以表示为:
信息增益比是对于信息增益的改进,克服了信息增益在选择训练特征时出现的偏向选择取值较多特征的问题,信息增益比的具体表示如下:
本文对于经过相关性检测筛选出的各个监控项计算信息增益比的值,并选出前K个值(实际操作用选择5个)作为影响报警的最后的监控项特征。
XGBoost算法:
在选择出影响各个报警的监控特征后需要建立相应的分类器进行报警分类,本文选择的是XGBoost算法。XGBoost算法是决策树模型与AdaBoost算法结合的产物,是GDBT模型的改进,在分类方面表现出优异的效果。XGBoost的分类思想以及具体实现:
若已知第t-1轮的决策树,则由Boost思想希望利用前t-1轮构建的决策树构建第t轮的决策树,因此第t轮的目标函数是:
其中L(x)是损失函数,一般为似然函数,将L(x)在第t-1棵树处进行二阶泰勒展开:
而对于一棵决策树而言:
其中Wj是第j个叶子节点的预测值,q(x)是一个索引映射,其作用是将输入映射到叶子的索引号上面;T是叶子节点的个数。因此目标函数可以写成如下形式:
对Wj求导并带入上式中可得:
由上式可知通过XGBoost算法可以直接构建出决策树每个叶子节点的预测值,于是问题转化为对于第t轮决策树应该构建多少个叶节点,而对节点的分裂可以用贪心算法进行计算。
若对于某一个叶节点进行再分裂,则会穿红色呢过的目标函数的下降量为:
对于每一次叶节点的分裂应该枚举所有的可能的分割方案,并按照上述公式计算分裂后的目标函数下降量,直至达到最大的决策树深度,或者Gain值都小于0为止。
总结:
利用上述方法,我们对host.alive,df.bytes.used.percent、sys.disk.rw、cpu.idle、mem.swapused.percent和disk.io.util等6大类报警进行了分类,最终的结果如下:
- host.alive的报警指标: 'cpu.idle', 'net.if.totoal.bits.sum', 'mem.memused.percent', 'mem.swapused.percent', 'ss.closed';分类精确度:99.6%
- df.bytes.used.percent的报警指标:'load.1min','load.5min','load.15min','ss.timewait', 'ss.closed';分类精确度:81%
- sys.disk.rw的报警指标:'load.1min','load.5min', 'load.15min', 'df.statistics.used.percent', 'ss.timewait';分类精度:98%
- cpu.idle的报警指标:'df.statistics.used.percent', 'ss.timewait','ss.closed','cpu.idle', 'mem.memused.percent';分类精确度:76.6%
- mem.swapused.percent的报警指标:'agent.alive', 'load.1min','load.5min','load.15min', 'net.if.totoal.bits.sum';分类精度:80.8%
- disk.io.util的报警指标:'load.1min', 'load.5min','load.15min', 'mem.memused.percent', 'ss.closed';分类精度:75.9%
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持 码农网
猜你喜欢:- 根因分析初探:一种报警聚类算法在业务系统的落地实施
- zabbix 创建邮件报警
- Fundebug支持配置实时报警
- 极简监控报警系统
- 报警神器 AlertManager 的使用
- 使用 Serverless 实现日志报警
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Flask Web开发:基于Python的Web应用开发实战
[美] Miguel Grinberg / 安道 / 人民邮电出版社 / 2014-12 / 59.00元
本书不仅适合初级Web开发人员学习阅读,更是Python程序员用来学习高级Web开发技术的优秀参考书。 • 学习Flask应用的基本结构,编写示例应用; • 使用必备的组件,包括模板、数据库、Web表单和电子邮件支持; • 使用包和模块构建可伸缩的大型应用; • 实现用户认证、角色和个人资料; • 在博客网站中重用模板、分页显示列表以及使用富文本; • 使用基于......一起来看看 《Flask Web开发:基于Python的Web应用开发实战》 这本书的介绍吧!