找回密码
 会员注册
查看: 22|回复: 0

时间序列异常检测机制的研究

[复制链接]

2

主题

0

回帖

7

积分

新手上路

积分
7
发表于 2024-10-12 00:57:10 | 显示全部楼层 |阅读模式
女主宣言本文出自于ADDOPS团队,该文章的作者籍鑫璞主要负责360 HULK云平台运维自动化和智能运维方面的工作。本文提出了一种高效的LVS流量异常检测算法,帮助ops同事更加精准的判断业务流量突增突减等非正常状态。希望该文章能给大家对异常检测的理解有所启发,后续会有作者对机器学习落地运维创新的系列文章,敬请期待。PS:丰富的一线技术、多元化的表现形式,尽在“HULK一线技术杂谈”,点关注哦!前言双十一刚过,阿里还有京东就在疯狂地show(秀)他们的技术有多牛逼。无可厚非,两家公司在应对guagngu节的时候都有自己的一套针对不同场景的策略。试想一下,假如双十一那天天猫的主页访问不了,那马爸爸不得损失好多个亿。为了防止这样的情况出现,除了疯狂扩容以外,一套理想的异常检测机制也是非常非常重要的。异常检测的场景很多,例如硬件的故障检测、流量的异常点的检测等场景。这篇博客我们针对的是时间序列的异常检测。时间序列异常的检测算法有很多,业界比较流行的比如普通的统计学习方法--3σ原则,它利用检测点偏移量来检测出异常。比如普通的回归方法,用曲线拟合方法来检测新的节点和拟合曲线的偏离程度,甚至有人讲CNN和RNN技术应用到异常点的检测。通过普通的阈值来检测lvs流量异常的方法效果比较差,本篇文章提出了一种新的检测算法,下面将重点介绍我们在实践过程中的经验。1数据分析 获取过去7天的lvs流量的数据,我们可以大致将趋势分为两种:一种是如下图的具有周期性的数据,这种情况更多需要考虑周期性给数据带来的影响。而另一种如下图的随机的数据,不具有周期性,这种情况需要采用和周期性不一样的策略来检测。2检测机制的研究 由于曲线就有周期性和非周期性的两种趋势,所以我们的检测机制需要能够处理两种方式。下面我们将详细介绍每个算法。 算法短期环比(SS)对于时间序列(是指将同一统计指标的数值按其发生的时间先后顺序排列而成的数列)来说,T时刻的数值对于T-1时刻有很强的依赖性。比如流量在8:00很多,在8:01时刻的概率是很大的,但是如果07:01时刻对于8:01时刻影响不是很大。首先,我们可以使用最近时间窗口(T)内的数据遵循某种趋势的现象来做文章。比如我们将T设置为7,则我们取检测值(now_value)和过去7个(记为i)点进行比较,如果大于阈值我们将count加1,如果count超过我们设置的count_num,则认为该点是异常点。上面的公式涉及到threshold和count_num两个参数,threshold如何获取我们将在下节进行介绍,而count_num可以根据的需求进行设置,比如对异常敏感,可以设置count_num小一些,而如果对异常不敏感,可以将count_num设置的大一些。动态阈值业界关于动态阈值设置的方法有很多,今天介绍一种针对我们lvs流量异常检测的阈值设置方法。通常阈值设置方法会参考过去一段时间内的均值、最大值以及最小值,我们也同样应用此方法。取过去一段时间(比如T窗口)的平均值、最大值以及最小值,然后取max-avg和avg-min的最小值。之所以取最小值的原因是让筛选条件设置的宽松一些,让更多的值通过此条件,减少一些漏报的事件。长期环比(LS)上面短期环比参考的是短期内的数据,而仅仅有短期内的数据是不够的,我们还需要参考更长时间内数据的总体走势。通常使用一条曲线对该趋势进行拟合来反应曲线的走势,如果新的数据打破了这种趋势,使曲线变得不平滑,则该点就出现了异常。曲线拟合的方法有很多,比如回归、moving average 等等。在这篇文章中,我们使用EWMA,即指数权重移动平均方法来拟合曲线。在EWMA种,下一点的平均值是由上一点的平均值,加上当前点的实际值修正而来。对于每一个EWMA值,每个数据的权重是不一样的,最近的数据将拥有越高的权重。有了平均值之后,我们就可以使用3-sigma理论来判断新的input是否超过了容忍范围。比较实际的值是否超出了这个范围就可以知道是否可以告警了。expAverage = pd.stats.moments.ewma(data, com=50)stdDev = pd.stats.moments.ewmstd(data, com=50)if abs(data.values[-1] - expAverage.values[-1]) > 3 * stdDev.values[-1] : print "异常"同比(chain)很多监控项都具有一定的周期性,其中以一天为周期的情况比较常见,比如lvs流量在早上4点最低,而在晚上11点最高。为了将监控项的周期性考虑进去,我们选取了某个监控项过去14天的数据。对于某个时刻,将得到14个点可以作为参考值,我们记为xi,其中i=1,...,14。我们先考虑静态阈值的方法来判断input是否异常(突增和突减)。如果input比过去14天同一时刻的最小值乘以一个阈值还小,就会认为该输入为异常点(突减);而如果input 比过去14天同一时刻的最大值乘以一个阈值还大,就会认为该输入为异常点(突增)。if new_value > max(过去14天同一时刻的值) * max_threshold: print "突增"if new_value
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 会员注册

本版积分规则

QQ|手机版|心飞设计-版权所有:微度网络信息技术服务中心 ( 鲁ICP备17032091号-12 )|网站地图

GMT+8, 2024-12-27 00:32 , Processed in 0.627954 second(s), 25 queries .

Powered by Discuz! X3.5

© 2001-2024 Discuz! Team.

快速回复 返回顶部 返回列表