我们不一样!告诉你百度是如何做智能流量异常检测的

640?wx_fmt=gif

作者简介

牧之    百度云高级研发工程师

640?wx_fmt=png

负责百度云Noah智能异常检测算法相关工作,在自动异常检测、智能故障诊断等方向有广泛的实践经验。



干货概览

流量,是系统的黄金指标之一,它直观反映系统的运行状态。健康的系统流量通常平稳波动变化,当流量突然上涨或者下降时可能预示系统中存在故障。例如系统的外部网络链路出现故障时,外部用户的访问流量无法到达我们的系统,流量会出现突降异常。当系统模块出现问题无法响应用户的请求时,此时的流量同样会出现突降异常。除了导致流量突降类的故障,当系统被爬虫爬取或者攻击时,流量会出现突升异常。所以流量的突升、突降常常表示系统中发生了某种故障或者异常行为。因此,流量异常检测对发现系统故障、维护系统的稳定性十分重要,它也成为了AIOps智能运维中的一个典型场景问题。

今天我们将从流量异常检测难点入手,分析常见流量检测方法存在的问题,然后重点介绍百度云智能运维产品(Noah)所使用的一类智能异常检测算法,基于鲁棒回归与泊松分布的流量异常检测算法。文章最后也附上了百度云Noah智能异常检测算法试用申请地址,欢迎大家试用。

我们不一样!告诉你百度是如何做智能流量异常检测的_第1张图片

流量异常检测的难点

流量异常检测主要有以下三个难点:

  1. 流量的大小会随着用户行为发生变化。对于大部分百度云上的业务,白天的访问流量较高,深夜的访问流量较低。这使得流量水位值存在上下文相关性,白天水位高,夜晚水位低,不断波动变化。这就需要算法能够区分流量的正常波动变化与异常波动变化,准确的检测异常流量。

  2. 对于所有百度云上用户而言,运维工程师关心系统本身的故障,需要及时检测到流量的突降异常,而安全工程师关心攻击、抓取和爬虫,更多地关心流量是否存在突升异常。这就要求算法有能力区分当前流量的异常类型,精准地给出流量的预测值。

  3. 流量也会受到业务逻辑调整的影响,流量水位会出现上涨或者下跌后不恢复的现象。需要算法能够及时适应这种变化,否则就会导致持续的误报。

流量异常检测模型

我们从上述难点出发,将流量异常检测分为预测与检测两个阶段。预测阶段需要克服异常流量的影响,对流量进行精准预测,检测阶段需要计算真实值与预测值之间的差异,当差异显著大于通常情况时,即可判定当前实际流量出现了异常。

我们不一样!告诉你百度是如何做智能流量异常检测的_第2张图片

常见预测算法的问题

比较简单的预测算法是移动平均算法

时序流量数据定义为640?wx_fmt=pngt代表不同的时刻。移动平均算法使用当前窗口内w个数据的均值作为窗口内最后一个点的预测值640?wx_fmt=jpeg,即640?wx_fmt=png。如下图所示,棕色线是移动平均算法的预测结果,蓝色线是原始的流量曲线。可以看到移动平均算法的预测趋势落后于实际的趋势,对于上涨过程中的突降可能会造成漏报。

我们不一样!告诉你百度是如何做智能流量异常检测的_第3张图片

另外,在下降过程中,移动平均算法会认为数据一直存在下跌,下降过程中又容易造成误报。

我们不一样!告诉你百度是如何做智能流量异常检测的_第4张图片

移动平均算法简单地将窗口内数据的均值作为下一个点的预测值,没有考虑到窗口内的数据趋势,导致预测的趋势总是滞后于实际趋势,预测的结果不准确。

观察流量数据能够发现局部窗口内符合线性趋势,因此,我们考虑使用线性回归的方法预测流量值。局部窗口内的线性表达式为640?wx_fmt=png,其中640?wx_fmt=png为窗口内每个点的预测值,t为不同时刻,kb为直线的斜率和截距。对于窗口内n个数据点640?wx_fmt=png使用最小二乘法来最小化损失函数640?wx_fmt=jpeg,可以求得kb参数,然后即可预测窗口内最后一个点的流量值。

我们不一样!告诉你百度是如何做智能流量异常检测的_第5张图片

实验发现,线性回归方法容易受到异常点的影响。上图中蓝色曲线为某一个窗口内的数据,窗口内后半部分出现了突升异常。理想的拟合结果应该不受突增异常影响,如图中粉色直线所示。而线性回归的拟合结果受到了异常点的影响,预测水位偏高,如图中红色直线所示。当曲线中的异常值较多时,线性回归的预测结果会出现如下图棕色线所示的不符合预期的波动。由于线性回归的损失函数是二次函数,所以异常点带来的影响被放大,导致拟合的结果偏离理想结果。

我们不一样!告诉你百度是如何做智能流量异常检测的_第6张图片

鲁棒回归算法

由于线性回归的二次损失函数放大了异常点的影响,因此我们考虑了将二次函数缩小为一次函数,减弱异常点影响。将损失函数改成如下:

640?wx_fmt=png

640?wx_fmt=png不可导,没有确定的解析解,可以使用

Interatively reweighted least squares

(https://en.wikipedia.org/wiki/Iteratively_reweighted_least_squares)

优化方法得到相对的最优解。这样在预测过程中就可以弱化突增、突降等异常点的影响,得到比较理想的预测结果。

如下图所示,图中蓝色曲线为原始流量曲线,红色曲线为鲁棒回归算法的预测结果,黑色曲线为移动平均算法的预测结果。可以看到原始流量存在较多的突增异常,移动平均算法受异常点的影响预测效果较差,异常流量位置的预测值偏离理想值。从箭头所指向的局部拟合效果图中可以看到,鲁棒回归算法没有受到这些异常点的影响,在流量的突升、突降位置都能够给出理想的预测值。

我们不一样!告诉你百度是如何做智能流量异常检测的_第7张图片

常见检测算法的问题

有了精准的预测结果,接下来需要根据预测结果检测流量是否出现异常。最简单的检测算法是直接计算真实值与预测值之间的残差640?wx_fmt=png,得出真实值与预测值的绝对误差,以此来表征流量是否出现了异常。然而此检测方法没有考虑流量本身大小的因素,例如当残差为-100时,如果此时流量的预期值为200,意味着系统很可能出现了故障;如果流量预期为10000,那么-100的残差可能只是观测白噪声。所以使用基于残差的检测方法,需要我们针对不同的系统流量设置不同的阈值。

基于残差的方法没有考虑到不同系统流量的差异,因此也有人对流量的残差进行归一化,计算相对残差,即640?wx_fmt=png,但此方法仍然存在一定的问题。例如百度大部分系统服务白天流量大,相对波动小,下跌10%可能意味着比较严重的问题,而深夜流量小,相对波动大,下跌30%才有可能意味着系统存在故障。所以基于相对残差的检测方法也不能够设置统一的阈值来检测异常。

泊松分布检测算法

由于基于残差与相对残差的检测方法都不能够设置统一的检测阈值,所以我们考虑从概率的角度来设置恒定的检测阈值。系统大部分时间都处于正常状态,正常流量出现的概率远远大于异常流量,可以通过流量出现的概率大小来检测异常流量。

要计算流量出现的概率,首先要找到合适的分布来描述流量。我们知道流量是系统一段时间内接受到的请求次数,而泊松分布是描述单位时间内随机事件发生次数的概率分布,因此可以用泊松分布对流量进行建模。泊松分布的概率函数为640?wx_fmt=png,其中640?wx_fmt=png是t时刻的真实流量值,640?wx_fmt=jpeg是鲁棒回归预测出的t时刻的流量值。当检测640?wx_fmt=png是否为突降异常时,可以根据泊松分布计算流量值小于等于640?wx_fmt=png的概率640?wx_fmt=png,当此概率小于设定的概率阈值时,我们认为此时发生了突降异常。但这个概率的计算涉及阶乘求和等操作,会耗费较多的计算资源,需要简化计算过程。我们知道当640?wx_fmt=jpeg较大时,可以用正态分布640?wx_fmt=png近似表示泊松分布,此时640?wx_fmt=png。然后可以计算统计量640?wx_fmt=png,对统计量z设置恒定的检测阈值m来判断是否存在突降异常。

突降异常的检测结果如下图所示,第一幅图中蓝色曲线为原始流量数据,橘色曲线为鲁棒回归算法预测结果,红色点为检测出的突降异常,第二幅图中蓝色线是根据真实流量与预测流量计算出的z统计量值,红色直线为设置的检测阈值。从图中可以看到,在z统计量上设置恒定阈值即可检测异常流量。

我们不一样!告诉你百度是如何做智能流量异常检测的_第8张图片

目前,本文的算法已经在百度云Noah智能运维系列产品之霍莉(Horae)异常检测平台上开放试用,Horae覆盖时序数据异常检测实验运行的整个生命周期,包含数据标注、算法实验、离线评估、后验评估等过程。欢迎大家申请试用,申请地址http://aiops.baidu.com/#/product/intelligentProduct。

总结展望

本文介绍了AIOps智能运维领域中的一个典型场景——智能流量异常检测。在分析其背景和难点,并对比介绍了一些常见的流量预测、检测方法之后,我们为大家重点介绍了百度云智能运维产品(Noah)中的一种智能异常检测算法——基于鲁棒回归与泊松分布的时序流量异常检测算法。一方面,基于鲁棒回归的预测算法,可以不受异常点的影响,精准地预测流量水位值;另一方面,基于泊松分布的检测算法,可以从概率的角度对流量建模,能够使用简单的恒定阈值来精准地检测流量异常。

当然,每类智能异常检测算法都有其场景特征和局限性:

(1)   该算法对相对平缓的异常趋势变化不敏感,因为我们每次是对局部窗口的数据进行鲁棒回归来预测窗口最后一个点流量值,没有使用足够的历史数据来判断当前的平缓趋势变化是否正常。

(2)   如果异常持续时间超过鲁棒回归窗口长度,可能会出现误报。例如,检测突降异常时,当突增的持续时间超过拟合窗口时,鲁棒回归算法会跟随上这种突增变化,这样就容易在突增恢复正常时造成突降的误报。

当然,为了解决上述问题,我们在霍莉(Horae)异常检测平台中,还实现了智能同比检测等算法,在后续的文章中会详细介绍,敬请期待!

我们不一样!告诉你百度是如何做智能流量异常检测的_第9张图片

我们不一样!告诉你百度是如何做智能流量异常检测的_第10张图片

↓↓↓ 点击"阅读原文" 【了解更多精彩内容】 

你可能感兴趣的:(我们不一样!告诉你百度是如何做智能流量异常检测的)