異常檢測(cè)
說說我認(rèn)為的異常
身處在每天調(diào)用量很大的業(yè)務(wù)系統(tǒng)的團(tuán)隊(duì)中庆杜,開發(fā)同學(xué)常常要關(guān)注于系統(tǒng)是否正常。說的簡(jiǎn)單點(diǎn)碟摆,就是當(dāng)前調(diào)用是否正常晃财,機(jī)器有沒有Down機(jī),又或者是用戶是否可以正常的進(jìn)行交易典蜕。
而以上說的這些就是我認(rèn)為的異常断盛。
檢測(cè)異常最好的方式
檢測(cè)異常最好的方式,我認(rèn)為是每個(gè)開發(fā)同學(xué)直接盯著自己的一個(gè)接口看愉舔,TP99钢猛,TP999,錯(cuò)誤率等等指標(biāo)在每分鐘轩缤,或者每秒鐘是否正常命迈,有沒有陡然升高的情況,人的判斷是比較準(zhǔn)確地典奉,但是受限于工作年限躺翻,線上處理異常的經(jīng)驗(yàn)。并且最重要的卫玖,人還是需要休息嘛公你!所以需要機(jī)器替代人做這件事情。讓機(jī)器幫助人做這件事情假瞬。
數(shù)據(jù)的分類
說到異常檢測(cè)陕靠,就要了解我們需要對(duì)什么來檢測(cè)異常迂尝,當(dāng)然這句話是廢話啦,身處于業(yè)務(wù)系統(tǒng)中剪芥。我們就要對(duì)業(yè)務(wù)數(shù)據(jù)做一些異常檢測(cè)垄开,那就必須將業(yè)務(wù)數(shù)據(jù)分為幾類,目前我們接觸到的業(yè)務(wù)數(shù)據(jù)有如下幾種:
機(jī)器指標(biāo)數(shù)據(jù)(CPU税肪,Memory等)溉躲、接口性能數(shù)據(jù)(AVG,TP99等)益兄、業(yè)務(wù)數(shù)據(jù)(下單量锻梳,交易成功數(shù)等)、
機(jī)器指標(biāo)數(shù)據(jù)
機(jī)器指標(biāo)顧名思義就是净捅,關(guān)于機(jī)器的一些指標(biāo)數(shù)據(jù)疑枯,例如CPU占用、MEMORY占用蛔六、網(wǎng)絡(luò)帶寬占用荆永,因?yàn)槲覀兊姆?wù)肯定是部署在某臺(tái)機(jī)器上的,這些機(jī)器的相關(guān)指標(biāo)国章,會(huì)直接影響到我們服務(wù)運(yùn)行的狀況具钥。
性能數(shù)據(jù)
性能數(shù)據(jù)顧名思義,就是業(yè)務(wù)系統(tǒng)的吞吐量相關(guān)的數(shù)據(jù)捉腥,例如我們常常說的QPS(每秒請(qǐng)求數(shù))氓拼,AVG(平均響應(yīng)時(shí)間),失敗率(分鐘失敗率)抵碟,MAX(分鐘最大請(qǐng)求時(shí)間),TP90坏匪,TP95拟逮,TP99,TP999等适滓。
業(yè)務(wù)數(shù)據(jù)
業(yè)務(wù)數(shù)據(jù)敦迄,顧名思義就是反應(yīng)業(yè)務(wù)上面的一些指標(biāo)了,對(duì)于一個(gè)交易系統(tǒng)來說凭迹,分鐘交易數(shù)罚屋。對(duì)于一個(gè)訂單系統(tǒng)來說,訂單交易數(shù)嗅绸。都是一個(gè)業(yè)務(wù)數(shù)據(jù)脾猛,在一個(gè)訪問量均勻的系統(tǒng)來說(每天訪問系統(tǒng)的用戶基本上是有規(guī)律的)這些數(shù)據(jù)也是有規(guī)律的,這些數(shù)據(jù)可以反映出來系統(tǒng)的健康狀況鱼鸠。
數(shù)據(jù)分類與異常檢測(cè)方式分析
數(shù)據(jù)分為性能數(shù)據(jù)和業(yè)務(wù)數(shù)據(jù)猛拴,當(dāng)然針對(duì)不同的數(shù)據(jù)羹铅,檢測(cè)異常的方式肯定也不是特別的相同了。 下面就為大家分析一下不同的數(shù)據(jù)如何檢測(cè)他的異常愉昆。
我們首先分析一下三種數(shù)據(jù)的特性:
機(jī)器指標(biāo)數(shù)據(jù)
針對(duì)于機(jī)器指標(biāo)數(shù)據(jù)职员,例如CPU.BUSY、網(wǎng)絡(luò)流量等跛溉,我們一般的操作是設(shè)置指定的閾值焊切,例如如果超過多少值就直接進(jìn)行報(bào)警,例如Memory或者硬盤占用芳室,Swap占用专肪,超過一個(gè)指定值的時(shí)候就要進(jìn)行預(yù)警了。都是可以用數(shù)值進(jìn)行衡量的渤愁。性能數(shù)據(jù)
性能數(shù)據(jù)的話牵祟,包括AVG,失敗率抖格,MAX诺苹,TP系列的指標(biāo)當(dāng)然是越小越好了,一般這些數(shù)據(jù)都是穩(wěn)定的雹拄,例如平均接口的響應(yīng)時(shí)間收奔,在調(diào)用量正常的情況下是穩(wěn)定的,TP系列的數(shù)據(jù)也是相對(duì)穩(wěn)定的滓玖,失敗率正常是維持在0左右坪哄。
如果接口或者某段代碼執(zhí)行的流程出現(xiàn)問題后,這些數(shù)據(jù)就會(huì)猛然提升势篡,例如失敗率一直是0翩肌,突然程序發(fā)生問題,那么失敗率一定是會(huì)陡然升高的禁悠。AVG和TP系列的指標(biāo)也是相同的效果念祭。業(yè)務(wù)數(shù)據(jù)
業(yè)務(wù)數(shù)據(jù),業(yè)務(wù)數(shù)據(jù)常常是和業(yè)務(wù)場(chǎng)景綁定的碍侦,例如團(tuán)購相關(guān)的業(yè)務(wù)粱坤,周末肯定數(shù)量會(huì)比平時(shí)多很多。例如導(dǎo)航相關(guān)的業(yè)務(wù)瓷产,可能周末也會(huì)升高站玄。外賣相關(guān)的業(yè)務(wù)會(huì)在中午和晚上兩個(gè)吃飯的點(diǎn)數(shù)量偏高。
這些業(yè)務(wù)數(shù)據(jù)濒旦,會(huì)和一定的現(xiàn)實(shí)情況綁定株旷,有升有降,沒有一個(gè)簡(jiǎn)單的辦法去判斷業(yè)務(wù)是否異常疤估。
例如一種簡(jiǎn)單的情況灾常,一個(gè)電商系統(tǒng)霎冯,會(huì)有很多的折扣活動(dòng),每一種活動(dòng)在后臺(tái)的業(yè)務(wù)系統(tǒng)對(duì)應(yīng)不同的規(guī)則钞瀑,如果系統(tǒng)異常的時(shí)候沈撞,可能只會(huì)導(dǎo)致某些折扣活動(dòng)發(fā)生異常,而不會(huì)一下全部影響所有的業(yè)務(wù)數(shù)據(jù)雕什。這種就是業(yè)務(wù)數(shù)據(jù)異常檢測(cè)的一個(gè)難點(diǎn)了缠俺。
異常檢測(cè)方式
上面一節(jié)已經(jīng)分析了異常的數(shù)據(jù),下面介紹一下針對(duì)于不同的異常數(shù)據(jù)贷岸,對(duì)應(yīng)的檢測(cè)方式壹士。
機(jī)器指標(biāo)數(shù)據(jù)
像文章之前提到的機(jī)器指標(biāo)的數(shù)據(jù)一般可以直接使用閾值進(jìn)行異常檢測(cè),
閾值判斷
需要檢測(cè)的指標(biāo) > 指定的閾值
滿足上面的公式則認(rèn)為是異常點(diǎn)偿警。
性能數(shù)據(jù)
針對(duì)性能數(shù)據(jù)轰绵,這種陡然升高的數(shù)據(jù)我們就可以認(rèn)為就是異常數(shù)據(jù)堕油。
例如某個(gè)時(shí)間點(diǎn)纯陨,失敗率陡然上升了艇劫,這個(gè)時(shí)候就要引發(fā)我們的注意,了解一下是網(wǎng)絡(luò)抖動(dòng)(基本上沒見過啥因?yàn)榫W(wǎng)絡(luò)抖動(dòng)產(chǎn)生的異常)還是依賴服務(wù)(DB七嫌,MQ)導(dǎo)致的異常少办。
四分位檢測(cè)
針對(duì)于此類異常,一般使用四分位檢測(cè)算法诵原。簡(jiǎn)要說明一下四分位算法英妓,四分位算法主要依賴于4分位數(shù),
根據(jù)四分位查來判斷數(shù)據(jù)是否異常绍赛。
IQR(四分位查也叫四分位距) = Q75% - Q25%
一般通過幾倍的四分位距判斷數(shù)據(jù)是否異常蔓纠,例如一個(gè)數(shù)據(jù)已經(jīng)大于3倍IQR + Q25% 則可以認(rèn)定他是一個(gè)異常點(diǎn)。
具體操作方法吗蚌,會(huì)在后期的系列文章中體現(xiàn)贺纲。
孤立森林-Ioslation Forest
使用孤立森林進(jìn)行異常檢測(cè),孤立森林的檢測(cè)方式褪测。
簡(jiǎn)單說明下:主要在于在少量數(shù)據(jù)的情況下,構(gòu)建一顆樹型結(jié)構(gòu)潦刃,按照數(shù)據(jù)大小侮措,進(jìn)行樹的左右分布,直到數(shù)據(jù)分布到子節(jié)點(diǎn)乖杠。異常點(diǎn)的數(shù)據(jù)因?yàn)榇嬖诘奶貏e少量分扎,所以會(huì)被快速的分配到葉子節(jié)點(diǎn),只要找出小于平均葉子幾點(diǎn)路徑的可以認(rèn)為就是異常點(diǎn)了胧洒。
s(x,n)就是記錄x在由n個(gè)樣本的訓(xùn)練數(shù)據(jù)構(gòu)成的iTree的異常指數(shù)畏吓,s(x,n)取值范圍為[0,1]墨状。歐拉常數(shù)值為0.5772156649。
對(duì)于s(x,n):
如果分?jǐn)?shù)越接近1菲饼,其是異常點(diǎn)的可能性越高肾砂;
如果分?jǐn)?shù)都比0.5要小,那么基本可以確定為正常數(shù)據(jù)宏悦;
如果所有分?jǐn)?shù)都在0.5附近镐确,那么數(shù)據(jù)不包含明顯的異常樣本。
具體的操作方法饼煞,會(huì)在后期的系列文章中體現(xiàn)源葫。
業(yè)務(wù)數(shù)據(jù)
業(yè)務(wù)數(shù)據(jù)相對(duì)于機(jī)器指標(biāo)數(shù)據(jù)和性能數(shù)據(jù),檢測(cè)異常的方式比較復(fù)雜砖瞧,不只是一個(gè)固定的指標(biāo)就可以衡量數(shù)據(jù)是否正常息堂。而且數(shù)據(jù)基于不同的業(yè)務(wù)場(chǎng)景,例如團(tuán)購是周末單量的块促,例如電商荣堰,可能是晚上單量比較高,例如直播系統(tǒng)也是晚上的觀看用戶比較高褂乍,數(shù)據(jù)是分時(shí)段的持隧,而且有明顯的業(yè)務(wù)高低峰。在不同的時(shí)間可能有不同的閾值逃片。并且可能在節(jié)假日的時(shí)候有明顯的流量區(qū)別屡拨。
根據(jù)業(yè)務(wù)數(shù)據(jù),我們需要采用不同的異常檢測(cè)算法褥实。
首先我們要有一個(gè)前提:
業(yè)務(wù)數(shù)據(jù)是按照時(shí)間順序記錄的一組數(shù)據(jù)呀狼,其中觀察的時(shí)間可以是年份、季度损离、月份或其他任何時(shí)間形式哥艇。
我們要想檢測(cè)業(yè)務(wù)數(shù)據(jù)的異常狀況,就需要對(duì)未來的業(yè)務(wù)數(shù)據(jù)做出一個(gè)預(yù)測(cè)僻澎,通過判斷預(yù)測(cè)值與實(shí)際值是否相符的(上下浮動(dòng)多少)的方式來進(jìn)行檢測(cè)異常貌踏。
常用的預(yù)測(cè)方法:
- 簡(jiǎn)單算術(shù)平均值
- 雙指數(shù)平滑(Holt-Linear)
- 三指數(shù)(Holt-Winters)
基于指數(shù)平滑的異常檢測(cè)
通過使用多個(gè)具有相同特性的時(shí)間段,通過雙指數(shù)或三指數(shù)的預(yù)測(cè)算法預(yù)測(cè)下一個(gè)周期的數(shù)據(jù)窟勃。計(jì)算數(shù)據(jù)的方差祖乳,通過K-Sigma的算法判斷下一個(gè)周期的數(shù)據(jù)是否在K-Sigma之內(nèi),從而判斷是否為異常
預(yù)測(cè)數(shù)據(jù) - 真實(shí)數(shù)據(jù) <=> K-Sigma
后期有系列文章
基于移動(dòng)均值的方式的異常檢測(cè)
移動(dòng)均值的檢測(cè)方式秉氧,主要應(yīng)用于在1:N眷昆,這種場(chǎng)景,例如我們有用戶的入口數(shù)據(jù),用戶請(qǐng)求APP的數(shù)據(jù)亚斋,系統(tǒng)的轉(zhuǎn)化率基本上是一個(gè)不怎么變化的值(如果是穩(wěn)定系統(tǒng))作媚,那么我們可以通過,請(qǐng)求數(shù)*轉(zhuǎn)化率帅刊,來判斷用戶下單數(shù)纸泡。如果某些場(chǎng)景下,部分業(yè)務(wù)系統(tǒng)有問題了厚掷,某些優(yōu)惠活動(dòng)出現(xiàn)系統(tǒng)BUG弟灼,無法計(jì)算優(yōu)惠。這樣請(qǐng)求數(shù)不會(huì)改變冒黑,但是單量就會(huì)改變田绑,此時(shí)請(qǐng)求轉(zhuǎn)化率會(huì)降低很多。通過降低的數(shù)值我們可以判斷異常抡爹。
請(qǐng)求量 * 轉(zhuǎn)化率 - 真實(shí)數(shù)據(jù) = 差值
差值采用K-Sigma算法進(jìn)行異常檢測(cè)掩驱。
后期有系列文章
基于相關(guān)度的方式進(jìn)行異常檢測(cè)
對(duì)于有指定轉(zhuǎn)化率的方式可以使用移動(dòng)均值的方式,但是在不同時(shí)間段轉(zhuǎn)化率不同的情況下冬竟,則不能使用移動(dòng)均值的方式進(jìn)行異常檢測(cè)了欧穴,這個(gè)時(shí)候就需要使用,相關(guān)度的方式泵殴。主要是看兩條曲線的相關(guān)度分?jǐn)?shù)涮帘。
使用相關(guān)度公式:
根據(jù)相關(guān)度的分?jǐn)?shù)進(jìn)行異常檢測(cè)。
后期有系列文章
基于角度的異常檢測(cè)
如果兩條曲線強(qiáng)相關(guān)笑诅,例如用戶訪問某個(gè)接口直接轉(zhuǎn)換為用戶單量调缨,則我們只需要進(jìn)行兩個(gè)數(shù)據(jù)的角度偏移就可以判斷數(shù)據(jù)是否異常了
這樣如果一個(gè)數(shù)據(jù)上升一個(gè)數(shù)據(jù)下降則夾角會(huì)非常大,可以快速了解到數(shù)據(jù)是否正常吆你∠乙叮可以通過tan等數(shù)據(jù)進(jìn)行異常判斷
此處只是一個(gè)想法
變點(diǎn)檢測(cè)
變點(diǎn)檢測(cè),主要應(yīng)用于與基于角度的異常檢測(cè)類似妇多,主要也是使用角度的方式來進(jìn)行異常判斷伤哺,只不過不需要另外一條參考線,變點(diǎn)檢測(cè)主要是看單條曲線上的角度變化(只適用于平滑者祖,數(shù)據(jù)量大的)情況立莉。
三種曲線的曲線夾角不同,當(dāng)夾角越小的時(shí)候說明變化抖動(dòng)越加的明顯七问。
基于STL的異常檢測(cè)
一個(gè)基于時(shí)間序列的數(shù)據(jù)可以被分解為:
加法模型(季節(jié)性變化不明顯):
時(shí)間序列(Time Series) = 季節(jié)數(shù)據(jù)(Seasonal) + 趨勢(shì)數(shù)據(jù)(Trend) + 噪點(diǎn)數(shù)據(jù)(Random | noise)
乘法模型(季節(jié)性變化明顯):
時(shí)間序列(Time Series) = 季節(jié)數(shù)據(jù)(Seasonal) * 趨勢(shì)數(shù)據(jù)(Trend) * 噪點(diǎn)數(shù)據(jù)(Random | noise)
將公式轉(zhuǎn)換:
噪點(diǎn)數(shù)據(jù) = 時(shí)間序列(Time Series) - 季節(jié)數(shù)據(jù)(Seasonal)(可得) - 趨勢(shì)數(shù)據(jù)(Trend)(可預(yù)測(cè))桃序;
這樣我們只要判斷噪點(diǎn)數(shù)據(jù)是否在可以接受的范圍之內(nèi)就可以判斷數(shù)據(jù)是否異常了。
后期有系列文章
需要注意
缺點(diǎn)補(bǔ)全
對(duì)于異常點(diǎn)的數(shù)據(jù)烂瘫,我們需要進(jìn)行去除,防止在下次計(jì)算中,異常點(diǎn)的數(shù)據(jù)對(duì)我們的數(shù)據(jù)有影響坟比。
而去除后芦鳍,需要對(duì)數(shù)據(jù)進(jìn)行補(bǔ)全處理,這個(gè)時(shí)候就需要運(yùn)用缺失值處理了
采用:插值法葛账,均值法或中位數(shù)進(jìn)行缺點(diǎn)補(bǔ)全柠衅。
人工反饋
有些異常情況,例如某些情況下的數(shù)據(jù)籍琳,肯定會(huì)有異常的情況菲宴,例如我去外賣上面買東西,但是那個(gè)時(shí)間點(diǎn)外賣店鋪關(guān)門了趋急,這個(gè)時(shí)候是由于既定實(shí)時(shí)導(dǎo)致的單量下降喝峦,此時(shí)需要把這個(gè)點(diǎn)的數(shù)值進(jìn)行人工反饋。由人工來進(jìn)行判斷是否需要報(bào)警呜达。
寫在最后
以上是目前的一些個(gè)人在工作中的總結(jié)和一些個(gè)人的想法谣蠢,接觸異常檢測(cè)方面的時(shí)間較少,有些專業(yè)名詞可能不是很對(duì)查近,希望同學(xué)可以指正眉踱。
后續(xù)有時(shí)間的時(shí)候會(huì)繼續(xù)把上面的相關(guān)算法計(jì)算方式補(bǔ)全。