用根因定位法,让运维效率再高一点!
??
作者 |?中國農業銀行研發中心 王哲
頭圖 | 下載于視覺中國
出品 | CSDN云計算(ID:CSDNcloud)
隨著業務不斷發展,微服務架構越來越受到各大企業的青睞,隨之也給傳統運維帶來更大的挑戰,多維KPI指標數量繁多、相互之間關系復雜,要想在故障發生后,第一時間定位到故障性能指標,只依靠人力排查的難度可想而知。
在幾代運維人的不懈努力下,故障定位的方法也由傳統的查日志、匹配歷史解決方案,晉升為利用機器學習、深度學習等更加智能快捷的方法,進行異常檢測、時序分析、根因定位,快速定位異常,極大縮短故障搶修時間,從而快速恢復服務。本文將從異常檢測算法、相關性系數以及格蘭杰因果分析三種方法出發,對故障根因進行初步的探索和實踐。
異常檢測算法——孤立森林和RRCF
根因定位問題的目標其實是要定位到某個網元發生的某種指標異常,那么將異常檢測算法直接運用到根因定位問題中也是有效可行的,本章節將介紹孤立森林和Robust Random Cut Forest兩種異常檢測算法的應用。
眾所周知,孤立森林(Isolation Forest)是一種高效的異常檢測算法,它和隨機森林比較相似,不同點在于每次選擇劃分屬性和劃分值時都是隨機的,而不是根據信息增益或者基尼指數來選擇。在構建樹的過程中,如果一些樣本很快就到達了葉子節點(即葉子到根的距離很短),那么就被認為很有可能是異常點。比如下圖中,共有a,b,c,d四個指標,b和c的高度為3,a的高度為2,d的高度為1,d就有可能是異常,因為其最早就被孤立了。
下面展示該方法的代碼實現:
import?numpy?as?np import?pandas?as?pd import?matplotlib.pyplot?as?plt from?sklearn.ensemble?import?IsolationForest? from?scipy?import?stats#?讀入數據 df?=?pd.read_csv(‘a.csv’) rng?=?np.random.RandomState(42) #定義樣本總數 n_samples=10?? #?訓練模型 clf?=?IsolationForest(max_samples=n_samples,?random_state=rng,?contamination=0.33)??#contamination為異常樣本比例 clf.fit(df.values) scores_pred?=?clf.decision_function(df.values) #?測試 clf.predict(df.values)RRCF(Robust Random Cut Forest)是以孤立森林為基礎改造而來的,由于數據是持續產生的,那么數據時序特征也是不可忽視的重要特征,RRCF的優勢就在于能更好地適用于流式數據。
大致的算法流程如下:首先對數據流進行采樣,為保證數據的實效性,采用蓄水池采樣策略判斷出當前數據點是否參與異常檢測建模,同時指定一個時間窗口長度,當建模的數據過期后,應該從模型中剔除掉;然后構建森林,人為指定采樣點數量(如果使用RRCF的默認值,將會構建出一個由100棵樹構成的森林,每棵樹都從上一步的池中隨機采樣256個數據點);在森林構造完成后,將待處理的樣本點放入森林中并計算異常分數,每個樣本的異常分數代表包含或不包含該點的情況下,導致模型發生變化的程度,計算公式如下:
在無法很好的確定故障根因的情況下,可以考慮計算各個時間序列指標特征的RRCF異常分數,然后對其進行排序,得到的TOPN作為根因的候選值,再結合其他方法能夠得到比較好的異常定位效果。
相關性系數
要進行故障診斷,完成根因定位,計算不同指標的相關系數勢必會產生一定的幫助。比如在觀測到響應時間、交易量等業務指標異常時,可以計算這一段時間內,與該業務指標相關性較高的的性能指標,這些高相關性的性能指標很有可能是引發這次故障的根因。當然,在實際使用時,需要結合實際情況或者前期訓練的結果,設置相應的權重,決定其是否為真正根因。
計算相關性系數的方法有很多,例如Person相關、時間滯后互相關(TLCC)計算兩個信號之間的方向性,動態時間扭曲(DTW)同步長度不同的信號、還有瞬時相位同步等方法,不同的方法將適用于不同的數據場景。本章節將以常用的Person相關為例展開實驗,展現相關性系數的魅力。
兩個連續變量(X,Y)的pearson相關性系數等于它們之間的協方差cov(X,Y)除以它們各自標準差的乘積(σX,σY),系數的取值總是在-1到1之間,數字 -1(負相關)、0(不相關)和 1(完全相關)表示出它們之間的線性關系,相關系數的絕對值越大,相關性越強,也就是說,相關系數越接近于1或-1,相關度越強,相關系數越接近于0,相關度越弱。
下面展示一個在一段時間內不同指標之間的Person相關系數的方法,并根據兩兩指標間的系數大小,排序輸出topn進行結果展示。
#?計算相關系數并進行可視化 def?plot_corr(new_metric1):columns?=?[column?for?column?in?new_metric1]col_dic?=?{}for?i?in?range(len(columns)):col_dic[columns[i]]?=?new_metric1[columns[i]]df?=?pd.DataFrame(col_dic)#畫出曲線趨勢圖ax?=?df.plot()ax.legend(loc=2,?bbox_to_anchor=(1.05,1.0),borderaxespad?=?0.)plt.show()#?計算相關系數df_corr?=?df.corr()#?對相關系數排序輸出sort_res?=?sort_corr(df_corr)#?可視化?cmap:YlGnBu?RdPuimport?matplotlib.pyplot?as?mp,?seabornseaborn.heatmap(df_corr,?center=0,?annot=True,?cmap='YlGnBu')mp.show()return?df_corr,?sort_res下圖1展示的是不同指標在一段時間內的趨勢,圖2展示的是這些指標之間的相關性系數熱力圖,并對相關系數設定一定的閾值,得到大于閾值的強相關性指標集。
['system.load.1',? 'system.load.1.pct',? 'system.cpu.pct_usage',? 'system.cpu.user',? 'system.load.norm.1',? 'system.cpu.i_dle']格蘭杰因果分析
格蘭杰因果關系作為一種可以衡量時間序列之間相互影響關系的方法,近十幾年備受業界青睞。如果想知道兩個序列之間是否具有因果性,可以用格蘭杰因果檢驗(Granger causality test)進行分析。
格蘭杰因果關系檢驗的是“統計學意義上”的因果性(時間上的先后),和我們日常語言邏輯中的因果關系并不能同一而論。從統計的角度上講,因果關系是通過概率或者分布函數的角度體現出來的,在宇宙中所有其它事件的發生情況固定不變的條件下,如果一個事件 A 的發生與會對于另一個事件 B 的發生造成一定的影響,并且這兩個事件在時間上又是先后發生的(A 前 B 后),那么我們便可以說 A 是 B 的原因。
舉個生活中的例子:在下雷雨前往往會天氣悶熱,有“螞蟻搬家”的現象發生,從統計學角度來講,“螞蟻搬家”和“下雷雨”之間存在因果關系,但并不能說“螞蟻搬家”是“下雷雨”的原因,按照我們通常的邏輯來講,“下雷雨”反而是“螞蟻搬家”的原因。因此在使用該方法前,要明確格蘭杰因果關系檢驗的是“統計學意義上”因果性的內涵。
下面展示使用Python的statsmodels中的grangercausalitytests實踐,代碼如下:
from?statsmodels.tsa.stattools?import?grangercausalitytests import?pandas?as?pd import?numpy?as?np#生成數據 df?=?pd.DataFrame(np.random.randint(0,?100,?size=(10,?2)),?columns=['a',?'b']) #格蘭杰因果檢驗 grangercausalitytests(df[['a',?'b']],?maxlag=2)執行的結果為:
Granger?Causality number?of?lags?(no?zero)?1 ssr?based?F?test:?????????F=5.7509??,?p=0.0534??,?df_denom=6,?df_num=1 ssr?based?chi2?test:???chi2=8.6264??,?p=0.0033??,?df=1 likelihood?ratio?test:?chi2=6.0496??,?p=0.0139??,?df=1 parameter?F?test:?????????F=5.7509??,?p=0.0534??,?df_denom=6,?df_num=1Granger?Causality number?of?lags?(no?zero)?2 ssr?based?F?test:?????????F=1.6759??,?p=0.3246??,?df_denom=3,?df_num=2 ssr?based?chi2?test:???chi2=8.9380??,?p=0.0115??,?df=2 likelihood?ratio?test:?chi2=6.0010??,?p=0.0498??,?df=2 parameter?F?test:?????????F=1.6759??,?p=0.3246??,?df_denom對結果解讀如下:
?number of lags (no zero) 1:當lags為1時的檢測結果
?ssr based F test:殘差平方和F檢驗
?ssr based chi2 test:殘差平方和卡方檢驗
?likelihood ratio test:似然比檢驗結果
?parr F testamete:參數 F 檢驗結果
根因定位在日常運維工作中起到的重要作用可以說是不言而喻,本文介紹了孤立森林和RRCF、相關性分析以及格蘭杰因果關系三種根因定位的方法,也做了初步的算法探索與實踐。相信隨著研究的進一步深入,根因定位在智能運維領域的應用會更加廣泛,我們也將為快速定位異常,大力而做出不懈的努力。
60+專家,13個技術領域,CSDN?《IT 人才成長路線圖》重磅來襲!
直接掃碼或微信搜索「CSDN」公眾號,后臺回復關鍵詞「路線圖」,即可獲取完整路線圖!
更多精彩推薦 ?5G、射頻、奧特曼,這仨有聯系嗎??再見 Nacos,我要玩 Service Mesh 了!?有沒有不用加班的程序員?如何衡量程序員的工作量?點分享點收藏點點贊點在看?
?
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的用根因定位法,让运维效率再高一点!的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 2021 ISC会上山石网科重磅发布智能
- 下一篇: 全民直播,半年“用云量”暴涨五倍