文章系列链接
摘要与背景
虽然计算机软硬件的快速发展已经极大提高了应用程序的可靠性,但是在大型集群中仍然存在大量的软件错误和硬件故障。系统要求7x24小时不间断运行,因此,对这些系统进行持续监控至关重要。这就要求我们就被从系统中持续采集系统运行日志,业务运行日志的能力,并能快速的分析和监控当前状态曲线的异常,一旦发现异常,能第一时间将信息送到相关人员手中。因此,使用机器学习和数据挖掘的手段对系统自动化进行异常检测至关重要。
让我们来看时序数据的一些常见异常:
- 延时的毛刺:在对读写敏感的场景中,经常会有IO毛刺问题困扰,这些毛刺往往被平均难以通过肉眼或P99等监控方法发现
2.业务系统调用量异常:以云服务提供的API为例,因各种原因会有一个短暂的Burst和下降。对于重要接口可以在监控系统上发现,但当我们面向几百个接口的监控时也会力不从心
3.水位上升:新版本发布后,各个指标的形态与历史吻合,但是整体的平均水位有拔高
当业务组合(B)复杂,部署规模(N)变大后,依靠传统的人眼+依赖同比环比等绝对值算法来判断就捉襟见肘了,以下我们提供对这一类问题的分类与解法。
$$ Scale = B * N * NumberOfSeriesData $$
异常类型概述
通常说的异常大致分为异常值、波动值、异常时间序列等几种情况:
-
异常值(Outlier)
- 给定输入时间序列x,异常值是时间戳值对$(t,x_t)$,其中观测值$x_t$与该时间序列的期望值$(E(x_t))$不同。
-
波动点(Change Point)
- 给定输入时间序列x,波动点是指在某个时间t,其状态在这个时间序列上表现出与t前后的值不同的特性。
-
断层异常(Breakout)
- 时序系统中某一时刻的值比前一时刻的值陡增或者陡降很多。
-
异常时间序列(Anomalous Time Series)
- 给定一组时间序列$X={x_i}$,异常时间序列$x_i \in X$是在X上与大多数时间序列值不一致的部分。
PS:上述归纳的异常均是针对单条时序曲线的形态异常,在工作交流中,发现网络流量的同学不仅要关注流量数值的大小异常、增量异常,同时还要考虑在一定的窗口期内,针对单业务线的各个网络包成分的异常,这些特定场景的异常需要设计特定的算法进行判别。在此不展开讨论,做异常的同学可以私下钉钉我,多多交流!
开源异常检测系统
- 这里添加了一些我在调研中找到的异常检测算法包,有Java版本、R版本供各位同学参考使用
算法 | 具体描述 |
---|---|
EGADS ExtremeLow 密度模型异常值 | EGADS基于密度的异常检测 |
EGADS CP | EGADS中波动点检测 |
EGADS KSigmaModel 异常值 | EGADS中经典的KSigma模型 |
Extreme R异常值 | 开源的异常值检测、阈值绝对值和残差检测异常 |
Twitter Outliter | 基于广义的ESD方法的Twitter R语言异常检测库 |
BreakOut Twitter CP | Twitter一个基于ESD统计检测来实现变点检测的R语言库 |
Change Pt1-2-3 R | R语言版本的变点 |