QCon 演讲火热征集中,快来分享技术实践与洞见! 了解详情
写点什么

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

  • 2019-11-28
  • 本文字数:2932 字

    阅读完需:约 10 分钟

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

本文提出了一种高效的 LVS 流量异常检测算法,帮助 ops 同事更加精准的判断业务流量突增突减等非正常状态。希望该文章能给大家对异常检测的理解有所启发,后续会有作者对机器学习落地运维创新的系列文章,敬请期待。

前言

双十一刚过,阿里还有京东就在疯狂地 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 异常检测中使用的方法,也许这些方法还不够解决所有的场景,你还需要在此基础上去不断丰富算法,才能达到比较好的效果。所谓,理论结合实际,具体的问题需要具体的分析,才能将理论应用于实践。


本文转载自公众号 360 云计算(ID:hulktalk)。


原文链接:


https://mp.weixin.qq.com/s/3KNekJqDmIMsvh1wpDtBxg


2019-11-28 18:281624

评论

发布
暂无评论
发现更多内容

高效能ScrumMaster的三大权利

ShineScrum

Scrum ScrumMaster

山东布谷科技iOS端分析直播app源码秒开技术(二):缓冲功能

山东布谷科技

软件开发 ios 开发 首帧秒开 缓冲 直播APP源码

SUSECON 深圳 2023 创新峰会开启报名

Rancher

“数智新应用”不再是口号,看汽车、医药、制造企业如何突出重围?

Kyligence

数智化转型

Sprint Boot学习路线4

小万哥

Java spring 微服务 Spring Cloud Spring Boot

基于无监督训练SimCSE+In-batch Negatives策略有监督训练的语义索引召回

汀丶人工智能

人工智能 自然语言处理 语义搜索 搜索推荐系统

语义检索系统:基于Milvus 搭建召回系统抽取向量进行检索,加速索引

汀丶人工智能

自然语言处理 nlp 搜索推荐系统 语义搜索系统 向量搜索

2023-08-02:给定一棵树,一共有n个点, 每个点上没有值,请把1~n这些数字,不重复的分配到二叉树上, 做到 : 奇数层节点的值总和 与 偶数层节点的值总和 相差不超过1。 返回奇数层节点分配

福大大架构师每日一题

福大大架构师每日一题

火山引擎DataLeap的Data Catalog系统搜索实践 (上)

字节跳动数据平台

数据中台 数据治理 数据安全 数据研发 企业号 8 月 PK 榜

Amazon Aurora Serverless v2 正式发布:针对要求苛刻的工作负载的即时扩展

亚马逊云科技 (Amazon Web Services)

MySQL

阿里云出品—高分计算机好书推荐榜

穿过生命散发芬芳

计算机图书

打包自己的Python应用并上传到PYPI

Rayzh

Python

香港云主机的优势,为何成为新一代网站托管首选?

一只扑棱蛾子

云主机 香港云主机

既要增长又要人效,零售人准备好接受老板的灵魂拷问了吗

Kyligence

数据分析 零售行业

Gartner首发中国数据、分析与人工智能技术成熟度曲线,柏睿数据入选实时数据管理典型厂商

新消费日报

「2023最新版」Java基础、中级、高级面试题总结(1000道题含答案解析)

架构师之道

Java 面试

文本 Embedding 基本概念和应用实现原理

Dify

技术分享 Embedding word embedding

重磅更新 | 大幅提升数据集命中预期;AI 联网搜索能力也来了!

Dify

AI技术 开源软件 LLMOps

Dify.AI 用户直面会总结:Embedding 技术与 Dify 数据集设计/规划

Dify

开源项目 AI技术实践 LLMOps

语义检索系统之排序模块:基于ERNIE-Gram的Pair-wise和基于RocketQA的CrossEncoder训练的单塔模型

汀丶人工智能

人工智能 自然语言处理 排序算法 语义搜索 搜索推荐系统

云智慧x统信软件:智能化IT服务管理,提升客户服务价值

云智慧AIOps社区

ITSM IT运维 智能运维AIOps 工单管理系统

基于YonGPT 的智能招聘,全新的数智化招聘体验!

用友BIP

企业服务大模型 YonGPT

GPU 容器虚拟化新能力发布和全场景实践

百度Geek说

人工智能 企业号 8 月 PK 榜

《云管理产品与服务图谱(2023)》发布!MIAOYUN荣登【运维平台】板块

MIAOYUN

云计算 运维平台 云管理平台 云管理 云管理产品与服务图谱

语义检索系统:基于无监督预训练语义索引召回:SimCSE、Diffcse

汀丶人工智能

自然语言处理 nlp 向量检索 语义检索 搜索推荐系统

JMeter笔记17 | JMeter逻辑控制器简介

测试 单元测试 Jmeter 性能测试 接口测试

专家论道: 唐贤香云纱塑造中国非遗国际品牌

Geek_2d6073

时间序列异常检测机制的研究_文化 & 方法_籍鑫璞_InfoQ精选文章