本文共 7354 字,大约阅读时间需要 24 分钟。
虽然计算机软硬件的快速发展已经极大提高了应用程序的可靠性,但是在大型集群中仍然存在大量的软件错误和硬件故障。系统要求7x24小时不间断运行,因此,对这些系统进行持续监控至关重要。这就要求我们就被从系统中持续采集系统运行日志,业务运行日志的能力,并能快速的分析和监控当前状态曲线的异常,一旦发现异常,能第一时间将信息送到相关人员手中。因此,使用机器学习和数据挖掘的手段对系统自动化进行异常检测至关重要。
让我们来看时序数据的一些常见异常:
2.业务系统调用量异常:以云服务提供的API为例,因各种原因会有一个短暂的Burst和下降。对于重要接口可以在监控系统上发现,但当我们面向几百个接口的监控时也会力不从心
3.水位上升:新版本发布后,各个指标的形态与历史吻合,但是整体的平均水位有拔高
当业务组合(B)复杂,部署规模(N)变大后,依靠传统的人眼+依赖同比环比等绝对值算法来判断就捉襟见肘了,以下我们提供对这一类问题的分类与解法。
$$ Scale = B * N * NumberOfSeriesData $$
通常说的异常大致分为异常值、波动值、异常时间序列等几种情况:
异常值(Outlier)
波动点(Change Point)
断层异常(Breakout)
异常时间序列(Anomalous Time Series)
PS:上述归纳的异常均是针对单条时序曲线的形态异常,在工作交流中,发现网络流量的同学不仅要关注流量数值的大小异常、增量异常,同时还要考虑在一定的窗口期内,针对单业务线的各个网络包成分的异常,这些特定场景的异常需要设计特定的算法进行判别。在此不展开讨论,做异常的同学可以私下钉钉我,多多交流!
算法 | 具体描述 |
---|---|
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语言版本的变点检测库 |
对时序曲线进行大致的归纳整理后,可以发现,单条曲线形态大致可以分成如下三个场景:
本文围绕着异常检测、变点检测、断层检测这三个主题进行展开,这一期主要利用基于预测的方法进行异常检测。这其中主要展开关于ARMA、Holt Winters和STL模型集中讨论。
针对单条时序数据,可以利用这篇文章中的方法进行建模预测,根据预测出来的时序曲线和历史数据求出时序的残差,对残差序列建模,利用KSigma或者分位数等方法进行异常检测。
以网络流量曲线为例,该曲线局部都懂的很厉害,若对原始数据建模,则会吸收很很大的噪音,影响模型的效果,可以先用平滑函数对数据进行平滑处理。下图中,蓝色曲线是原始的网络流量数据,紫色是经过长度为5的矩形窗口平滑之后的结果。
* | select ts_smooth_fir( stamp, val, 'rectangle', 5, 1, 'avg') limit 1000
为了让大家有对比的看清楚平滑的效果,上图中两条曲线是画在不同的Y轴坐标系下的。先将两条曲线绘制在同一个Y轴下面,计算对应的点的残差序列,可以较好的找到异常的点。如下图中的红色圆圈标记出来的结果。
$$ \hat{x}(t) = \frac{x_t + x_{t-1} + ... + x_{t-w+1}}{w} $$
假设数据集由一个正太分布产生,该分布可以用 $N(\mu,\sigma)$ 表示,其中$\mu$是序列的均值,$\sigma$是序列的标准差,数据落在$(\mu-3\sigma, \mu+3\sigma)$之外的概率仅有0.27%,落在$(\mu-4\sigma, \mu+4\sigma)$之外的区域的概率仅有0.01%,可以根据对业务的理解和时序曲线,找到合适的K值用来作为不同级别的异常报警。
箱型图,是一种用作显示一组数据分散情况资料的统计图。主要用于反映原始数据分布的特征,还可以进行多组数据分布特征的比较,其绘制方法是:先找出一组数据的最大值、最小值、中位数和上下两个四分位数。通过不同分位数来划分异常值和疑似异常值。
* | select ts_predicate_simple(stamp, val, 6, 1, 'avg') from log limit 500* | select ts_predicate_arma(stamp, val, 5, 2, 6, 1, 'avg') from log limit 500
$$ z_t = \begin{cases} \mu_1 & if 1 \leq t \leq \tau_1 \\ \mu_2 & if \tau_2 < \leq \tau_2 \\ ... & ... \\ \mu_{k+1} & if \tau_k < t \leq \tau_{k+1} = n \end{cases} $$
假设,时间序列的分布遵循如下模型:
$$ Z_t|\theta_t \sim N(\theta_t, 1) $$
其中,$\theta_t$可以使用一个分段函数进行描述,设计相关的算法找到分段函数的分段点。我们使用如下模型进行求解:
$$ LR = \max \limits_{\tau}\{ l(z_{1:\tau}) + l(z_{\tau+1:n}) - l(z_{1:n}) \} $$
给定一个惩罚系数,当$LR > \lambda$时,去求取如下参数:
$$ \tau = argmax \{ l(z_{1:\tau}) + l(z_{\tau+1:n}) - l(z_{1:n}) \} $$
假设,时序数据中存在多个变点,这里假设为k个,$\tau = (\tau_0, \tau_1, ... , \tau_{k+1})$,这里$\tau_0 = 0$,$\tau_{k+1}=n$,可以得到如下定义:
$$ \min \limits_{k, \tau} \lgroup \sum_{i=1}^{k+1} \lbrack-l(z_{\tau_{i-1}:\tau_{i}}) \rbrack + \lambda f(k) \rgroup $$
针对上述问题,其解空间巨大:
针对上述流程图的说明:
$$ \hat{x}(t) = \frac{x_t + x_{t-1} + ... + x_{t-w+1}}{x_{t-w} + x_{t-w-1} + ... + x_{t-2w+1}} $$
EDM算法是由Twitter在2014年提出来,具体细节介绍请见论文《Leveraging Cloud Data to Mitigate User Experience from ‘Breaking Bad’》。这里仅仅简单的描述下该算法的特点和原理。
算法特点
算法原理
for $i \leq i \leq \sigma$ do
for $i+1 \leq j \leq \sigma$ do
for $1 \leq i \leq \sigma$ do
for $1 \leq j \leq \sigma$ do
while $\tau \leq n - \sigma$ do
if forwardMove = 1 then
else
PELT算法是优化有了由Yao和Jackson提出的最优划分方法(The Optimal Partitioning Method),该方法的目标是最小化如下目标:
$$ \sum_{i=1}^{m+1}\lbrack C(y_{(\tau_{i-1}+1) : \tau_{i}}) + \beta) \rbrack $$
令$F(s)$等于上式,对于$y_{1:s}$序列中,存在$\Gamma_s = \{ \tau : 0 = \tau_0 < \tau_1 < \tau_1 < ... < \tau_m < \tau_{m+1} = s \}$是待检测出来的变点集合,令$F(0) = - \beta$,可以得到如下的表达式:
$$ F(s) = \min \limits_{\tau \in \Gamma_s} \{ \sum_{i=1}^{m+1} \lbrack C(y_{ (\tau_{i-1} + 1 : \tau_{i}) }) + \beta \rbrack \} $$
$$ F(s) = \min \limits_{t} \{ \min \limits_{\tau \in \Gamma_{t}} \sum_{i=1}^{m} \lbrack C(y_{(\tau_{i-1} + 1):\tau_i}) + \beta + C(y_{(t+1):n}) + \beta \} $$
$$ F(s) = \min \limits_{t} \{ F(t) + C(y_{(t+1):n}) + \beta \} $$
根据上述公式推导,得到如下的算法描述(Optimal Partitioning)
Input
Initialise:
Interate for $\tau^{*} = 1, 2, ..., n$
在物理学中,折点是不可导点,这表明该店没有切线,所以也不会有速度,在到折点之前,必定要经过一个减速阶段,将速度变成零,然后在向另一个方向加速。
在时序描述中,要发现数据中的尖刺点,同时也要发现时序中的断层点(或者解释成突增、突降点检测)。
将原始时序数据$x(t)$经过平滑后,求序列的一阶差分序列$x_{diff}(t)$,利用如下方法寻找异常值:
给定检测窗口长度$w$,通过下式可以计算$t \in \{2w, N\}$之前每个点的均值漂移值。
$$ r(t) = \frac{x_{t} + x_{t-1} + ... + x_{t-w+1}}{x_{t-w} + x_{t-w-1} + ... + x_{t-2w+1}} $$
根据检测出来$r(t)$值,利用KSigma异常检测方法,可以较好的得到时序中的断层点信息。
* | select ts_cp_detect(stamp, val, 1.0, 1, 'avg') limit 500* | select ts_breakout_detect(stamp, val, 5, 1, 'avg') limit 500
说明
阿里云日志服务针对日志提供了完整的解决方案,以下相关功能是日志进阶的必备良药:
更多日志进阶内容可以参考:。
纠错或者帮助文档以及最佳实践贡献,请联系:悟冥
问题咨询请加钉钉群:转载地址:http://mzonl.baihongyu.com/