女主宣言

本文出自于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 < min(过去14天同一时刻的值) *  min_threshold:

print "突减"

静态阈值的方法是根据历史经验得出的值,实际中如何给max_threshold和min_threshold是一个需要讨论的话题。根据目前动态阈值的经验规则来说,取平均值是一个比较好的思路。

同比振幅(CA)

同比的方法遇到下图的现象就不能检测出异常。比如今天是11.18日,过去14天的历史曲线必然会比今天的曲线低很多。那么今天出了一个小故障,曲线下跌了,相对于过去14天的曲线仍然是高很多的。这样的故障使用方法二就检测不出来,那么我们将如何改进我们的方法呢?一个直觉的说法是,两个曲线虽然不一样高,但是“长得差不多”。那么怎么利用这种“长得差不多”呢?那就是振幅了。

怎么计算t时刻的振幅呢? 我们使用x(t) – x(t-1) 再除以 x(t-1)来表示振幅。举个例子,例如t时刻的流量为900bit,t-1时刻的是1000bit,那么可以计算出掉线人数是10%。如果参考过去14天的数据,我们会得到14个振幅值。使用14个振幅的绝对值作为标准,如果m时刻的振幅[m(t) – m(t-1)]/m(t-1)大于amplitudethreshold并且m时刻的振幅大于0,则我们认为该时刻发生突增,而如果m时刻的振幅大于amplitudethreshold并且m时刻的振幅小于0,则认为该时刻发生突减。


算法组合

上面介绍了四种方法,这四种方法里面,SS和LS是针对非周期性数据的验证方法,而chain和CA是针对周期性数据的验证方法。那这四种方法应该如何选择和使用呢?下面我们介绍两种使用方法:

一、根据周期性的不同来选择合适的方法。这种方法需要首先验证序列是否具有周期性,如果具有周期性则进入左边分支的检测方法,如果没有周期性,则选择进入右分支的检测方法。


上面涉及到了如何检测数据周期的问题,可以使用差分的方法来检测数据是否具有周期性。比如取最近两天的数据来做差分,如果是周期数据,差分后就可以消除波动,然后结合方差阈值判断的判断方法来确定数据的周期性。当然,如果数据波动范围比较大,可以在差分之前先对数据进行归一化(比如z-score)。

二、不区分周期性,直接根据“少数服从多数”的方法来去检测,这种方法比较好理解,在此就不说明了。


3

总结

这篇文章介绍了我们在lvs异常检测中使用的方法,也许这些方法还不够解决所有的场景,你还需要在此基础上去不断丰富算法,才能达到比较好的效果。所谓,理论结合实际,具体的问题需要具体的分析,才能将理论应用于实践。

参考文献:


1.https://jiroujuan.wordpress.com/2013/10/09/skyline-anomalous-detect-algorithms/ 

2.http://chuansong.me/n/2032667

3.http://blog.csdn.net/g2V13ah/article/details/78474370


扫描下方
二维码
了解更多内容

时间序列异常检测机制的研究相关推荐

  1. 基于GAN框架的时间序列异常检测研究综述

    一项综述类的课程作业 Anomaly detection with generative adversarial networks for multivariate time series. MAD- ...

  2. 论文学习——基于集成LSTM-AE的时间序列异常检测方法

    文章目录 0 封面 1 标题 2 摘要 3 结语 4 引言 4.1 一个问题 4.1 新方向 5 实验设计 写在前面:<华中科技大学学报(自然科学版)>:主办单位:华中科技大学:中文核心: ...

  3. 【阅读论文】基于统计特征的无监督时间序列异常检测方法

    文章目录 摘要 1.介绍 2.相关工作 3.问题描述 4.方法 4.1 统计特征 4.2提取特征总结 4.3 学习阶段算法 4.4测试阶段算法 5.结果 5.1 YOB评价:单变量 5.3对合成数据集 ...

  4. 【时间序列异常检测】Anomaly-Transformer

    论文链接:https://arxiv.org/pdf/2110.02642.pdf 来自 ICLR 2022 Anomaly-Transformer:基于关联差异(Association Discre ...

  5. R语言用LOESS(局部加权回归)季节趋势分解(STL)进行时间序列异常检测

    全文下载链接:http://tecdat.cn/?p=22632 这篇文章描述了一种对涉及季节性和趋势成分的时间序列的异常点进行建模的方法. 相关视频 我们将对一种叫做STL的算法进行研究,STL是 ...

  6. 论文学习——多维时间序列异常检测算法综述

    文章目录 0 封面 1 标题(title) 2 作者(author) 3 摘要(abstract) 4 结论(conclusion) 4.1 维数约减 4.2 时间序列模式表示 4.3 异常模式发现 ...

  7. KDD Cup 2021:时间序列异常检测问题开源方案

    KDD Cup 2021:时间序列异常检测 本次赛题的数据为时序数据,针对每条时序记录,需要选手完成具体的异常点定位. 文件的命名即分割了训练集和测试集,如下所示 <id>_<nam ...

  8. 聚类dbi指数_一种基于DBI-PD聚类算法的异常检测机制

    一种基于 DBI-PD 聚类算法的异常检测机制 丁姝郁 [期刊名称] <电脑开发与应用> [年 ( 卷 ), 期] 2015(000)002 [摘要] 分析了网络数据维数和检测准确度之间的 ...

  9. 离群点检测方法_干货 :时间序列异常检测

    异常检测(Anomaly detection)是目前时序数据分析最成熟的应用之一,定义是从正常的时间序列中识别不正常的事件或行为的过程.有效的异常检测被广泛用于现实世界的很多领域,例如量化交易,网络安 ...

最新文章

  1. python学习手册条件-Python学习手册(第4版)pdf
  2. 【Android 安全】DEX 加密 ( 多 DEX 加载 | 65535 方法数限制和 MultiDex 配置 | PathClassLoader 类加载源码分析 | DexPathList )
  3. MYSQL出错代码和出错信息对照表
  4. Redis Client Lettuce 5 GA发布
  5. 架构师学习笔记(持续更新)
  6. hadoop入门学习教程--DKHadoop完整安装步骤
  7. 计算机考试属于相对性评价还是绝对性评价,【易错检测】查漏补缺第46天 — 相对性评价与绝对性评价...
  8. C# 委托与事件(delegate)
  9. mavros常用消息类型表
  10. 如何将虚拟机中的内网IP设置成固定的
  11. Team Foundation Server 开发流程管理管理研讨会
  12. 智能车基于RT1064+无线串口透传模块利用MATLAB辅助调节PID参数
  13. 16种床上动作的内涵图,你都看懂了吗?
  14. s22服务器未响应,王者荣耀资源包升级失败怎么办_王者荣耀S22资源包升级失败解决办法_玩游戏网...
  15. 为什么达芬奇能“艺工结合”,要从“T型设计”说起
  16. activiti学习之排他网关
  17. python加密安装方法_安装Python加密错误
  18. 如果重新学习计算机,你的学习路线是什么?
  19. gerrit 评审 报错“Submit including parents”
  20. Enable密码丢失的解决方法

热门文章

  1. twitter中处理网页被iframe方式
  2. Java-WAS的Hello world
  3. VUE自学日志02-应用与组件实例
  4. spring中@Value的使用(读取配置文件信息)
  5. ProtoBuf3语法指南(Protocol Buffers)_上
  6. m6000查看端口状态_M6000常用命令
  7. mysql not default_MySQL的not null default
  8. python找出有向图的所有环,Python:有向图中的所有简单路径
  9. 个人作业-Week1
  10. oracle job有定时执行的功能,可以在指定的时间点或每天的某个时间点自行执行任务。...