流量异常检测之算法选择器

640?wx_fmt=gif

作者简介

时祎瑜    百度高级研发工程师

640?wx_fmt=png

负责百度智能运维产品(Noah)的策略研发工作,在异常检测方向有大量实践经验。

人体就像是一个布满了传感器的监控系统,每时每刻监控着身体各个部分的运作情况。一旦身体出现严重的问题我们立马能感受到,提示我们去医院进行检查。同样,为了掌握公司各业务运行的稳定性,我们会有监控系统充当传感器的角色,采集关键的业务指标(请求数、响应时间等)实时分析它们的波动状态。一旦指标数据发生异常波动,监控系统会立刻通知运维工程师进行处理。

流量,也就是请求数,作为系统的四大黄金指标之一,它的波动变化能够反映系统大多数的运行问题。比如流量短时间出现大幅度突降可能表示网络出现中断导致服务不可用;流量的大幅突升说明此时系统可能受到了外部攻击;流量的上下浮动也能反映服务中策略的调整是否出现了非预期的情况。接下来我们要研究的是如何对流量指标的波动进行异常检测,辅助分析当前系统的运行情况。

判断异常这件事听起来容易,但实际上不同业务的流量曲线有截然不同的波动特性,我们需要对不同的波动类型定义对应的异常情况。比如图1的流量曲线只在固定值附近小范围波动,而图2中的流量曲线会出现缓慢的上涨和下跌。

流量异常检测之算法选择器_第1张图片

图1  流量数据示例1

640?wx_fmt=png

图2  流量数据示例2

如果考虑两者都出现流量缓慢下跌,对于第一种类型的流量来说大概率是出现了异常,但对于第二种数据可能只是流量预期内的正常变化。

因此,面对大规模的业务流量数据,我们无法采用同一种算法进行异常检测,而是需要先确定流量数据的波动类型,再采用相应的异常检测算法进行异常判断。今天这篇文章将介绍对流量进行异常判断的第一步,我们是如何对流量数据进行分类并且设计分类算法自动完成数据分类任务的。

为了对不同类型的流量数据进行定制化的异常检测,第一步我们得对数据进行分类,并且明确各种类型的数据出现怎样的波动状态属于异常情况。

一般我们可以按照波动模式将数据分为三类:平稳数据、周期数据、非周期数据。

  • 平稳数据

640?wx_fmt=png

图3  平稳指标数据示例

图3是某服务的流量曲线,横轴是时间,纵轴是流量大小。可以看出曲线中每一时刻流量的波动程度不完全相同,但曲线整体不存在变化趋势,基本围绕某一固定的值波动

这种存在少量白噪声但整体呈线状波动的特性在后端服务的流量中比较常见。对于这类数据,正常状态下流量值比较稳定,当发现数据波动明显超出了常态的波动范围,此时大概率是发生了某些异常情况。

  • 周期性数据

除去波动平稳的流量以外,我们还会遇到随时间上下浮动的流量数据。这类流量由于受到用户行为的影响会在一天中出现大幅的上涨和下跌。

比如下图4展示了某应用近4天的流量曲线。可以看出其中包含了4个类似驼峰的形状,每天的波峰位置是白天时刻,此时用户行为活跃因此流量会处于较高的水平;波谷位置是夜晚时刻,夜晚用户逐渐休息流量则会对应地慢慢回落。用户行为的变化使得一天中流量出现大幅度的波动,并且这样的波动会每天重复出现,因此流量曲线整体会呈现出周期性的特征。

640?wx_fmt=png

图4  周期性数据示例

这类曲线因为本身有周期性的特点,所以我们会参考历史曲线的波动形状对每天每一时刻可能出现的变化趋势给出大致的判断,当某段时间的数据与历史相同时刻的取值或是变化趋势相差较大时,我们会认为出现了异常。

  • 非周期性数据

最后一类数据如下图5所示,数据的上下浮动没有周期性,或者虽然表现出一定的周期性,但是不同周期的差异比较大。这一类数据中大多数是发展型应用的流量。这类应用每天的访问流量一方面受到用户行为的影响会出现忙闲时的波动变化,另一方面应用本身的策略调整或其他原因也会引起流量的改变,因此导致周期特性比较弱。

640?wx_fmt=png

图5  非周期性数据示例

对于这类数据,我们可以根据数据变化的连续性来判断是否出现异常。正常运行状态下流量随时间的变化是平缓和连续的,因此我们可以对比当前时刻与最近时刻数据的变化趋势来进行异常判断。比如对于一段正在平稳上升的数据,如果从某时刻开始数据突然出现下跌,即与前一段时间的变化趋势相反,我们认为从该时刻开始发生了预期之外的异常情况。

经过第二节的介绍,我们明白数据按照波动特征对应了不同的异常场景,需要采用不同的检测算法进行异常判断。所以在正式开始异常检测之前,我们首先需要一个分类器,能够判别出流量数据的类型,再采用数据所属检测场景对应的算法进行异常检测。

根据上节对于三类的数据波动特征的描述,我们设计了一个决策树解决分类问题。首先,我们判断数据的波动是否平稳,如果数据波动呈线状或带状,说明属于第一类平稳数据;如果不是则进一步判断数据是否存在明显周期性,如果数据具有周期性,则属于周期性数据,否则就认为数据是非周期数据。以下是分类过程的示意图。

流量异常检测之算法选择器_第2张图片

图6  数据分类算法示意图

  • 判断数据是否平稳波动

通常平稳类型的数据会围绕某一固定值波动,曲线整体呈现为线状或带状。对于这样的波动特征,我们可以通过对比曲线每一小段数据的局部波动情况和曲线整体的波动情况来判断。当数据的局部波动与全局波动相似时,我们认为数据属于波动平稳类型。在决策树的第一步判断中,我们会分别计算定量指标来描述数据的全局波动和局部波动,综合起来进行比较。

标准差是一种常见的全局波动度量方法,它可以描述数据围绕均值波动程度的大小,标准差越大表示数据波动越厉害。因此可以通过计算标准差作为量化评价数据整体波动情况的指标。

对局部数据的波动度量,我们采用了小波变换的方法来提取数据中的局部波动信息。对数据进行小波变换可以获得数据的低频信息和高频信息,其中低频信息代表了数据局部的平均值,综合起来能够描述整段数据的近似轮廓;高频信息反映了数据局部的波动情况,能够描述信号的细节信息。图7的两幅图分别是某应用流量的原始曲线以及小波变换后的高频信息。可以看出高频曲线反映了原始数据细节的波动情况。因此我们可以用小波变换结果高频部分的标准差来表征数据的局部波动程度。

流量异常检测之算法选择器_第3张图片

图7  小波变换结果示例

最后,我们通过计算全局波动指标与局部波动指标的比值来描述两者的差异。

流量异常检测之算法选择器_第4张图片

其中,640?wx_fmt=png是原始数据的标准差,表示全局波动情况,640?wx_fmt=png为小波变换结果高频部分的标准差,表示局部波动情况。而全局波动总是比局部波动剧烈,因此640?wx_fmt=png为大于1的值,640?wx_fmt=png越大表示全局波动与局部波动的差距越大。最后可以通过对640?wx_fmt=png设置阈值来判断数据是否属于平稳数据类型,如果640?wx_fmt=png大于阈值表示数据不属于平稳类型。阈值大小可以参考历史数据设定,阈值越大表示可以接受平稳数据波动的程度越大,阈值越小表示判定数据为平稳类型的要求更严格。

  • 判断数据是否具有周期性

通常判断数据周期性的方法是对数据进行傅里叶变换。假设数据长度为L,具备周期性且周期为T,则数据的频率640?wx_fmt=png。在傅立叶变换产出的频谱曲线中,频率640?wx_fmt=png及其整数倍位置的位置640?wx_fmt=png会出现明显高于其他位置的能量高峰。因此对于数据的周期性判断,我们只需要观察数据傅里叶变换后的频谱结果,如果640?wx_fmt=png位置的能量都显著大于其它位置的能量值,就说明数据具有周期性。

但实际上,频谱曲线中这些整数倍位置640?wx_fmt=png的能量会随着倍数的增加而逐渐下降,导致大整数倍位置的能量不能满足“大于其它位置能量”的条件。因此我们只选择了640?wx_fmt=png两个位置的能量进行判断,如果它们同时满足条件,则判断数据具有周期性。

以图8为例,图8包含了某产品线13天的流量曲线。按照上述分析,如果图8数据具有天级别的周期性特征,则傅里叶变换的频谱曲线在横坐标为13整数倍的位置应该出现能量高峰。图9为图8流量曲线的傅里叶变换结果。可以看出在横坐标13、26的位置的能量值明显高于其他位置的能量,13正是图8中曲线包含的周期数,也就是天数,满足周期性判断的条件,因此图9的结果说明该曲线具有周期性特征。

流量异常检测之算法选择器_第5张图片

图8  周期性数据示例

流量异常检测之算法选择器_第6张图片

图9  傅里叶变换结果

知道了周期性数据傅里叶变换频谱结果的特点后,下一步就需要判断频谱结果中640?wx_fmt=png位置的能量是否高于其他位置。

观察图9我们发现,13和26位置的存在与其他98个数据点对比显得异常突兀。相比其他的点来说,他们的出现不是常态,属于小概率事件。因此我们可以从概率的角度来描述能量异常大的情况:观察整个频谱能量值的取值,如果发现能量出现大于某个值的情况很少,我们可以判定这个值在当前的能量取值范围中是一个异常大值。

上述过程可以用数学公式进行描述。设频谱能量为随机变量X,概率640?wx_fmt=png表示随机变量X大于能量值640?wx_fmt=png的概率,如果640?wx_fmt=png较小,说明640?wx_fmt=png是一个异常大的能量值。对于640?wx_fmt=png我们可以采用比较简单的方法计算得到。我们将频谱曲线所有的能量值从小到大进行排序,对于其中任意一个能量640?wx_fmt=png640?wx_fmt=png可以由大于640?wx_fmt=png的能量点个数与频谱曲线总的能量点个数之比近似得到。

这样,我们可以对640?wx_fmt=png设置阈值来控制寻找异常大能量值的程度,比如设置阈值为5%表示我们认为大于整个频谱曲线中95%能量的值是异常大的。因此我们可以对整数倍位置640?wx_fmt=png的能量640?wx_fmt=png进行判断,计算该位置能量对应的概率640?wx_fmt=png,如果概率640?wx_fmt=png小于阈值,表示640?wx_fmt=png是一个异常大的能量值。

本文主要介绍了对流量进行智能异常检测之前的数据准备工作。首先会根据流量数据的波动特征定义不同的异常情况;然后设计分类算法对流量数据按照波动模式进行分类。接下来将继续介绍针对不同类型的流量数据,我们是如何设计算法来进行异常检测的,敬请期待~

640?wx_fmt=jpeg

640?wx_fmt=gif

你可能感兴趣的:(流量异常检测之算法选择器)