百度網絡監控實戰 | 多維度分析方法

640?wx_fmt=gif

作者簡介

李聰    百度高級研發工程師

640?wx_fmt=png

負責百度智能運維產品(Noah)監控數據分析相關工作,重點關注故障定位、異常檢測等相關領域技術。


乾貨概覽

在前一篇文章《百度網絡監控實戰 | 多維度分析應用場景》中,我們簡單介紹了一種多維度分析方法,用於預選疑似故障區域,可以大幅減少網絡監測的誤報。在本文中,我們會結合網絡監測數據的特點,詳細介紹這種多維度分析方法的實現細節

逐層下鑽分析

我們要尋找的維度組合具有貢獻度高、一致性好兩個特點,在尋找這些目標維度組合的時候,最直接的方式是逐個維度組合進行檢測,但是網絡監控裏有幾百萬個維度組合,逐個檢查會消耗很多時間。

我們可以從全局數據出發,選擇最能區分成功、失敗探測樣本的維度進行下鑽。在下鑽的過程中,我們可以選擇把數據按照所選維度的各個取值拆成多份(如:源機房=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”

640?wx_fmt=png

圖1  按照所選維度的各個取值拆成多份下鑽的樣例

640?wx_fmt=png

圖2  按照所選維度取值拆成兩份下鑽的樣例

這種分層下鑽的方法能夠找到貢獻度高、一致性好的目標維度組合,同時減少了需要分析的維度組合數量,比逐個維度組合進行檢查可以少花很多時間

基於決策樹的自動分析

可以看到,這種分層下鑽的過程和決策樹生成的過程是比較類似的。

決策樹生成算法會從全局數據出發,選擇最能區分正例負例的屬性進行劃分,然後對子數據集遞歸地進行劃分,直到繼續劃分不太能區分正例和負例。所以前面的分層下鑽相當於把探測樣本的結果作爲類別、維度取值作爲屬性,構建了一棵二叉分類決策樹。

首先,把一個探測樣本作爲一條數據,探測樣本的結果作爲類別,把成功記作正例,失敗記作負例。這樣,最能區分正例、負例的屬性也就是最能區分成功、失敗樣本的屬性。

接下來,對探測樣本進行One-Hot編碼,每個維度取值展開成一個屬性。前面提到的“源機房=A”對應一個屬性,屬性有兩個取值“源機房=A”、“源機房!=A”,類似地,“目標機房=B”、“源ToR=1”等維度取值也分別對應一個屬性。這樣,對數據集進行劃分時使用的屬性就是用來把數據拆分成兩份的維度取值。

數據經過預處理之後,接下來的下鑽過程可以藉助決策樹生成算法完成。

如圖3,從全局數據出發,在各個屬性(“源機房=A”、“目標機房=B”、“源ToR=1”……)中選擇一個最能區分正例(成功樣本)和負例(失敗樣本)的屬性(“源機房=A”)進行劃分,之後繼續對子數據集遞歸地進行劃分,直到子集(“源機房=A”)使用各個屬性劃分的區別都不大。

640?wx_fmt=png

圖3  二叉分類決策樹生成樣例

在生成的決策樹中,每一個葉子結點的成功、失敗探測樣本都是分佈比較均勻的,一致性較好,所以,成功率顯著低於正常情況的葉子結點就是需要報告的故障區域。

640?wx_fmt=png

圖4  二叉分類決策樹上進行檢測的樣例

這樣分析得到的目標維度組合排除了直接判定法誤報的情況,所返回的維度組合基本上能夠正確反應網絡故障影響的區域範圍。

屬性選擇方法

對於決策樹的每個節點,在選擇屬性進行劃分的時候,我們的候選屬性是所有維度取值,比如“源ToR=1”、“源ToR=8”、“源機房=A”、“源機房=H”、“目標機房=A”、“目標機房=H”等等,針對每個候選屬性,會使用一個函數進行打分,描述區分正負例樣本的效果,最後選擇分數最高的一個屬性。

常見的決策樹生成算法在正負例樣本不平衡的時候表現比較差,而網絡監測中失敗樣本(負例)的數量遠少於成功樣本(正例),讓這個問題變得比較明顯。

我們修改了選擇屬性時的度量函數,避免比較成功樣本和失敗樣本之間的相對大小,而是比較成功樣本在各子節點的分佈和失敗樣本在各子節點的分佈。

在把全局數據劃分爲“源機房=A”、“源機房!=A”的時候,成功樣本在兩個子集的分佈是640?wx_fmt=png,我們把這個分佈記作640?wx_fmt=png,失敗樣本在兩個子集的分佈是640?wx_fmt=png,記作640?wx_fmt=png,那麼,分佈P和Q差異最大的屬性也就是最能區分成功樣本和失敗樣本的屬性。

我們選擇了640?wx_fmt=png海林格距離)來描述這兩個分佈的差異。把全局數據劃分爲“源機房=A”、“源機房!=A”的得分:

640?wx_fmt=png

類似地,可以計算其他屬性的海林格距離:

640?wx_fmt=png

可以看到,使用源機房A進行拆分的海林格距離最大,所以選擇按源機房A這個屬性把數據拆成兩份,這個劃分結果和人工下鑽時的感受是一致的。


總  結

本文提出的這種多維度分析方法考慮了很多內網質量監測的特點。考慮到維度組合非常多,我們在尋找目標維度組合的過程中進行了剪枝;考慮到目標維度組合可能是多個,我們選擇的剪枝方案是二叉決策樹;考慮到成功樣本比失敗樣本多很多,我們在生成決策樹時使用海林格距離選擇屬性。

在其他場景中,數據可能沒有這樣的特點,這些情況下,需要選擇什麼指標描述一致性,選擇什麼方法進行剪枝,有的已經有了一些實踐經驗,有的還在嘗試,需要進一步探索。歡迎大家留言交流相關場景和問題。

RECOMMEND推薦閱讀

640?wx_fmt=jpeg

640?wx_fmt=png

640?wx_fmt=png

640?wx_fmt=jpeg

640?wx_fmt=gif

↓↓ 點擊"閱讀原文" 【瞭解更多精彩內容】

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章