软件开发架构师

百度网络监控实战:多维度分析方法-InfoQ

运维 11 2019-09-02 23:18

干货概览

在前一篇文章《百度网络监控实战 | 多维度分析应用场景》中,我们简单介绍了一种多维度分析方法,用于预选疑似故障区域,可以大幅减少网络监测的误报。在本文中,我们会结合网络监测数据的特点,详细介绍这种多维度分析方法的实现细节

逐层下钻分析

我们要寻找的维度组合具有贡献度高、一致性好两个特点,在寻找这些目标维度组合的时候,最直接的方式是逐个维度组合进行检测,但是网络监控里有几百万个维度组合,逐个检查会消耗很多时间。

我们可以从全局数据出发,选择最能区分成功、失败探测样本的维度进行下钻。在下钻的过程中,我们可以选择把数据按照所选维度的各个取值拆成多份(如:源机房 =A、源机房 =B、源机房 =C……),也可以选择把数据按照是否包含所选维度取值拆成两份(如:源机房 =A、源机房!=A)。在网络质量监测中,拆成两份的方案要比拆成多个的方案更好。

我们用一个例子来说明原因。假设在某一时刻内网同时发生了两个故障,分别是机房 A 出口故障和机房 B 入口故障。在这个情况下,正确的输出应当包含两个维度组合,分别是“源机房 =A”、“目标机房 =B”。

从全局数据出发,如果我们按照源机房的各个取值把数据拆成多份,如图 1,“目标机房 =B”这个维度组合无法出现,因为它在按照“源机房”维度拆分时已经被拆成“源机房 =B,目标机房 =B”、“源机房 =C,目标机房 =B”等多个小维度组合。这样一来,“目标机房 =B”这个故障将输出为多个子维度组合的故障,不能准确体现故障范围

而如果我们按照数据是否包含源机房 A 把数据拆成两份,如图 2,“目标机房 =B”可以更加完整地包含在“源机房!=A”的分支中,再经过一次拆分即可得到“源机房!=A,目标机房 =B”这一维度组合。这个维度组合应当解释为,在我们认为“源机房 =A”存在故障的情况下,把受到这个故障干扰的数据去掉后 (“源机房!=A”),“目标机房 =B”存在故障,所以“源机房!=A,目标机房 =B”可以上升为我们的目标维度组合“目标机房 =B”。

百度网络监控实战:多维度分析方法-InfoQ-1

图 1 按照所选维度的各个取值拆成多份下钻的样例

百度网络监控实战:多维度分析方法-InfoQ-2

图 2 按照所选维度取值拆成两份下钻的样例

这种分层下钻的方法能够找到贡献度高、一致性好的目标维度组合,同时减少了需要分析的维度组合数量,比逐个维度组合进行检查可以少花很多时间

基于决策树的自动分析

可以看到,这种分层下钻的过程和决策树生成的过程是比较类似的。

决策树生成算法会从全局数据出发,选择最能区分正例负例的属性进行划分,然后对子数据集递归地进行划分,直到继续划分不太能区分正例和负例。所以前面的分层下钻相当于把探测样本的结果作为类别、维度取值作为属性,构建了一棵二叉分类决策树。

首先,把一个探测样本作为一条数据,探测样本的结果作为类别,把成功记作正例,失败记作负例。这样,最能区分正例、负例的属性也就是最能区分成功、失败样本的属性。

接下来,对探测样本进行 One-Hot 编码,每个维度取值展开成一个属性。前面提到的“源机房 =A”对应一个属性,属性有两个取值“源机房 =A”、“源机房!=A”,类似地,“目标机房 =B”、“源 ToR=1”等维度取值也分别对应一个属性。这样,对数据集进行划分时使用的属性就是用来把数据拆分成两份的维度取值。

数据经过预处理之后,接下来的下钻过程可以借助决策树生成算法完成。

如图 3,从全局数据出发,在各个属性(“源机房 =A”、“目标机房 =B”、“源 ToR=1”……)中选择一个最能区分正例(成功样本)和负例(失败样本)的属性(“源机房 =A”)进行划分,之后继续对子数据集递归地进行划分,直到子集(“源机房 =A”)使用各个属性划分的区别都不大。

百度网络监控实战:多维度分析方法-InfoQ-3

图 3 二叉分类决策树生成样例

在生成的决策树中,每一个叶子结点的成功、失败探测样本都是分布比较均匀的,一致性较好,所以,成功率显著低于正常情况的叶子结点就是需要报告的故障区域。

百度网络监控实战:多维度分析方法-InfoQ-4

图 4 二叉分类决策树上进行检测的样例

这样分析得到的目标维度组合排除了直接判定法误报的情况,所返回的维度组合基本上能够正确反应网络故障影响的区域范围。

属性选择方法

对于决策树的每个节点,在选择属性进行划分的时候,我们的候选属性是所有维度取值,比如“源 ToR=1”、“源 ToR=8”、“源机房 =A”、“源机房 =H”、“目标机房 =A”、“目标机房 =H”等等,针对每个候选属性,会使用一个函数进行打分,描述区分正负例样本的效果,最后选择分数最高的一个属性。

常见的决策树生成算法在正负例样本不平衡的时候表现比较差,而网络监测中失败样本(负例)的数量远少于成功样本(正例),让这个问题变得比较明显。

我们修改了选择属性时的度量函数,避免比较成功样本和失败样本之间的相对大小,而是比较成功样本在各子节点的分布和失败样本在各子节点的分布。

在把全局数据划分为“源机房 =A”、“源机房!=A”的时候,成功样本在两个子集的分布是 $\frac{80}{640},\frac{560}{640}$,我们把这个分布记作 $P(p_1,p_2)$,失败样本在两个子集的分布是 $\frac{16}{30},\frac{14}{30}$,记作 $Q(q_1,q_2)$,那么,分布 P 和 Q 差异最大的属性也就是最能区分成功样本和失败样本的属性。

我们选择了 $H(P,Q)=\sqrt{1-\sum\nolimits^h_{i=1}\sqrt{p_iq_i}}$(海林格距离)来描述这两个分布的差异。把全局数据划分为“源机房 =A”、“源机房!=A”的得分:

百度网络监控实战:多维度分析方法-InfoQ-5

类似地,可以计算其他属性的海林格距离:

百度网络监控实战:多维度分析方法-InfoQ-6

可以看到,使用源机房 A 进行拆分的海林格距离最大,所以选择按源机房 A 这个属性把数据拆成两份,这个划分结果和人工下钻时的感受是一致的。

总结

本文提出的这种多维度分析方法考虑了很多内网质量监测的特点。考虑到维度组合非常多,我们在寻找目标维度组合的过程中进行了剪枝;考虑到目标维度组合可能是多个,我们选择的剪枝方案是二叉决策树;考虑到成功样本比失败样本多很多,我们在生成决策树时使用海林格距离选择属性。

在其他场景中,数据可能没有这样的特点,这些情况下,需要选择什么指标描述一致性,选择什么方法进行剪枝,有的已经有了一些实践经验,有的还在尝试,需要进一步探索。欢迎大家留言交流相关场景和问题。

作者介绍

李聪

百度高级研发工程师,负责百度智能运维产品(Noah)监控数据分析相关工作,重点关注故障定位、异常检测等相关领域技术。

本文转载自公众号 AIOps 智能运维(ID:AI_Ops)

原文链接

https://mp.weixin.qq.com/s?__biz=MzUyMzA3MTY1NA==&mid=2247485107&idx=1&sn=51ea71c2882f3ed93dfb72f8c3699473&chksm=f9c37f7aceb4f66c0161ce303fcf775ec6e25b6fa0bfe892c07330ae883ba6ed2a61d874e3c7&scene=27#wechat_redirect

文章评论