6.2 AIOps 运维中一些常见异常检查算法
1 前言
运维日常中其实利用到了很多异常检测算法、经验、架构等等。本文会重点介绍一下,场景、原理、如何使用、如何实现等等。整体来说没有任何一种算法是完美的,所有的算法都有他的特点和需要解决的问题。很多时候是需要多种算法组合来完成的。
2 场景介绍
最常见的就是设定阈值、同比、环比算法 这三种。这三种算法其实可以解决日常检测中的80%以上的问题。
算法不在多复杂,而在于多实用。
阈值的场景:比如sla、失败率、错误码等等。因为这种数量平时就非常少一旦有应该就是有问题,需要及时报警出来处理
同比的场景:主要是容量、流量、延迟缓慢退化的情况。这种时序周期性的变化。需要跟昨天、上周等作出对比
环比的场景:主要是容量、流量、延迟退化的情况。这种发现有突增突降的情况
组合场景
比如缓慢下降不确定是自然变化场景和系统异常。这个时候就需要多个指标去同时判断。
复杂场景
抖动,比如一些抖动场景,有时间需要剔除的比如采集的问题、或者网络抖动的问题。这个需要达到一定的阈值或者频率在报警出来
缓慢下降的问题。这个问题靠阈值是发现不了的。如果靠同比和环比 时间会很长时间就过去了。
整体来说分为三个阶段
3 算法介绍
场景1: 徒增突降,突变的含义是发生了均值漂移。
场景2: 缓慢下降 ,计算当前值在历史数据分布(正态分布)下的发生概率,指标趋势预测:通过分析指标历史数据,判断未来一段时间指标趋势及预测值,常见有Holt-Winters、时序数据分解、ARIMA等算法。
场景3:离群点基于概率的恒定阈值检测(波动性异常检测) 对一定窗口累积量监控常见算法:多维检测和决策树、孤立森林、随机森林等等。比如异常抖动的情况。
场景4:指标聚类: 根据曲线的相似度把多个KPI聚成多个类别。如果有个运营商出现异常的时候,这个运营商往往就是异常的。该算法技术可以应用于大规模的指标异常检测,在同一指标类别里采用同样的异常检测算法及参数,大幅降低训练和检测开销。常见的算法有DBSCAN, K-medoids, CLARANS等应用的挑战是数据量大曲线模式复杂。 比如,运营商有联通、移动、电信往往波动趋势是一样的。一旦有某个运营商的曲线波动其他的不一致那么这个运营商往往就是出现异常的那个。
场景5:多指标联动关联挖掘:多指标联动分析判断多个指标是否经常一起波动或增长。该算法技术可用于构建故障传播关系,从而应用于故障诊断。常见的算法有Pearson correlation, Spearman correlation, Kendall correlation等应用的挑战为KPI种类繁多关联关系复杂。比如,像现在的短视频,直播的投放大部分来自关注页面。如果直播的增加和降低是否跟关注页面的增减一起波动。
场景6:指标与事件关联挖掘: 自动挖掘文本数据中的事件与指标之间的关联关系, 比如在程序A每次启动的时候CPU利用率就上一个台阶。该算法技术可用于构建故障传播关系,从而应用于故障诊断。常见的算法有Pearson correlation, J-measure, Two-sample test等。应用的挑战为事件和KPI种类繁多,KPI测量时间粒度过粗会导致判断相关、先后、单调关系困难。比如,上线导致的异常指标波动。当有指标异常波动的时候,找到是否有可疑事件发生。快速去回滚。
场景7:事件与事件关联挖掘:分析异常事件之间的关联关系把历史上经常一起发生的事件关联在一起。该算法技术可用于构建故障传播关系,从而应用于故障诊断。常见的算法有FP-Growth、 Apriori、随机森林等,但前提是异常检测需要准确可靠。比如当前的故障跟之前的故障有关系。当有故障的时候发现的指标跟其他的一样的情况。这样需要迅速把之前的可疑事件找到。寻找解决方案
场景8:故障传播关系挖掘:融合文本数据与指标数据,基于上述多指标联动关联挖掘、指标与事件关联挖掘、事件与事件关联挖掘等技术、由tracing推导出的模块调用关系图、辅以服务器与网络拓扑,构建组件之间的故障传播关系。该算法技术可以应用于故障诊断,其有效性主要取决于其基于的其它技术。比如一个模块异常导致上下游都有异常。这个时候需要找到发生问题的根源。
4 总结
本文的算法和思路有些来自作者日常运维经验,有些来自AIOPS白皮书等算法总结。还有一些bat的业界分享。介绍场景算法的如何使用以及如何选择。
注(封面图片来自网络)