溫粉蓮
(中國移動(dòng)通信集團(tuán)廣東有限公司,廣州 510623)
隨著移動(dòng)通信的發(fā)展,云計(jì)算、大數(shù)據(jù)、虛擬化等技術(shù)的大量應(yīng)用,業(yè)務(wù)系統(tǒng)和網(wǎng)絡(luò)架構(gòu)變得越來越復(fù)雜,給運(yùn)維人員帶來了更高的挑戰(zhàn)。如何有效的管理和監(jiān)控海量的數(shù)據(jù)來保障系統(tǒng)的穩(wěn)定、減少宕機(jī)時(shí)間,是系統(tǒng)運(yùn)營和運(yùn)維成功與否的關(guān)鍵所在。通過自動(dòng)化的采集、監(jiān)控各類設(shè)備指標(biāo)數(shù)據(jù)和用戶行為數(shù)據(jù),運(yùn)維人員能有效的掌握系統(tǒng)運(yùn)行狀況,異常檢測是有效發(fā)現(xiàn)系統(tǒng)潛在故障和用戶異常行為的重要方法。Chandola[1]等人及Numenta[3]公司對異常檢測方法進(jìn)行了全面的調(diào)研,目前常用的異常檢測方法有:
(1)固定閾值法:通常根據(jù)業(yè)務(wù)專家或者運(yùn)維專家的經(jīng)驗(yàn)知識(shí)設(shè)定閾值范圍。該方法優(yōu)點(diǎn)是簡單,缺點(diǎn)是需要大量依賴人工經(jīng)驗(yàn),不適用于周期性變化的數(shù)據(jù),維護(hù)困難。
(2)基于統(tǒng)計(jì)學(xué)方法:如累計(jì)和控制圖(CUSUM)and指數(shù)加權(quán)移動(dòng)平均法(EWMA)[1],這種方法的優(yōu)點(diǎn)是效率比較高,缺點(diǎn)是需要預(yù)先定義時(shí)間窗口,準(zhǔn)確性依賴于參數(shù)設(shè)置。
(3)基于機(jī)器學(xué)算法:E.Keogh[2]提出了檢測時(shí)間序列中異常值的方法。異常檢測在不同的領(lǐng)域也有不同的應(yīng)用,M.Szmit[4]等人提出了異常檢測在網(wǎng)絡(luò)流量上的異常檢測方法,宋海濤[5,6]等人也提出了用戶異常行為的檢測。當(dāng)前流行的異常檢測算法有:基于分類,基于聚類,基于最近鄰,基于信息理論,這些方法應(yīng)用到不同領(lǐng)域的異常檢測中,能有效提高檢測的準(zhǔn)確度。
本文設(shè)計(jì)了一種混合模型的時(shí)序數(shù)據(jù)異常檢測算法,將歷史數(shù)據(jù)按照時(shí)間進(jìn)行劃分,再用grubbs算法剔除歷史數(shù)據(jù)中的異常點(diǎn),得到不同時(shí)段的動(dòng)態(tài)閾值,再使用曲線擬合和ARIMA對數(shù)據(jù)進(jìn)行訓(xùn)練得到相應(yīng)的模型。當(dāng)對新指標(biāo)進(jìn)行異常判斷時(shí),首先通過動(dòng)態(tài)閾值進(jìn)行判異,如果輸出為異常,則運(yùn)用曲線擬合模型計(jì)算預(yù)測值,與判定值進(jìn)行比較,如果輸出為異常則進(jìn)行第三層的判異,即使用ARIMA模型的預(yù)測值比較來判斷異常。經(jīng)過三層判斷為異常的值經(jīng)過確認(rèn)后會(huì)以事件方式通知告警處理模塊,被判斷為正常的值則直接加入歷史數(shù)據(jù)中。這種方法不僅提高了準(zhǔn)確性,也提高了效率,無需事先進(jìn)行人工標(biāo)注,同時(shí)自動(dòng)形成異常檢測的閉環(huán),對周期性、非周期性變化的指標(biāo)數(shù)據(jù)都適用,具有很強(qiáng)的通用性。
本文將指標(biāo)“異常”定義如下:當(dāng)指標(biāo)數(shù)據(jù)的變化偏離了該時(shí)間點(diǎn)的絕大多數(shù)數(shù)據(jù)分布范圍并且不符合某種趨勢變化的凸點(diǎn)或者凹點(diǎn),認(rèn)為是異常。
該方法包含以下幾個(gè)步驟:
(1)對歷史的時(shí)間序列數(shù)據(jù)進(jìn)行預(yù)處理和特征提取。
(2)利用K-means對數(shù)據(jù)初步的劃分。
(3)使用Grubbs Test方法剔除每個(gè)劃分后的孤立點(diǎn),生成動(dòng)態(tài)基線。
(4)使用曲線擬合法對歷史數(shù)據(jù)進(jìn)行訓(xùn)練,得到模型1。(5)使用ARIMA算法對歷史數(shù)據(jù)進(jìn)行訓(xùn)練,得到模型2。
(6)獲取判斷值,預(yù)處理后與該時(shí)刻的閾值進(jìn)行比較,如果不在基線內(nèi),則判斷為異常并進(jìn)行第2層的判斷,如果超過3個(gè)標(biāo)準(zhǔn)差,則判斷為異常,再進(jìn)行第3層的判斷,三層判斷均為異常的情況下,最終判斷為異常,否則為正常。
異常檢測系統(tǒng)的結(jié)構(gòu)圖如圖1所示,該系統(tǒng)包含的核心模塊包含:預(yù)處理、分類、模型訓(xùn)練、動(dòng)態(tài)閾值生成、異常檢測和異常處理。
圖1 指標(biāo)數(shù)據(jù)異常檢測系統(tǒng)框架
假設(shè)某類指標(biāo)數(shù)據(jù)的采集頻率為d分鐘一次,每天產(chǎn)生m個(gè)記錄,使用n天的歷史數(shù)據(jù)作為訓(xùn)練庫,一共有n*m個(gè)記錄作為歷史數(shù)據(jù)。將這些數(shù)據(jù)的時(shí)間進(jìn)行歸一化處理,即去掉日期信息,只保留時(shí)、分、秒,再將時(shí)、分轉(zhuǎn)換成小時(shí),得到0-24之間的數(shù)值,經(jīng)過歸一化處理后,得到n個(gè)維度為m的向量。
經(jīng)過預(yù)處理和特征提取后,我們可以運(yùn)用聚類算法對數(shù)據(jù)進(jìn)行劃分,K-means是最常用的基于劃分的方法,它的原理簡單,計(jì)算代價(jià)小,聚類效果好,本文采用二分k-means算法來劃分?jǐn)?shù),可以解決一般的k-means算法收斂于局部最小值的問題。
采用格拉布斯方法,通常取置信概率為95%,其判別方法如下:先將呈正態(tài)分布的等精度多次測量的樣本按從小到大排列,統(tǒng)計(jì)臨界系數(shù)G(a,n)的值為G0,然后分別計(jì)算出G1、Gn:G1=(X-X1)/σ,Gn=(Xn-X)/σ (1) 若G1≥Gn且G1>G0,則X1應(yīng)予以剔除;若Gn≥G1且Gn>G0,則Xn應(yīng)予以剔除;若G1<G0且Gn<G0,則不存在“壞值”。然后用剩下的測量值重新計(jì)算平均值和標(biāo)準(zhǔn)偏差,還有G1、Gn和G0,重復(fù)上述步驟繼續(xù)進(jìn)行判斷,依此類推。
通過上述的算法我們將歷史數(shù)據(jù)中的異常值剔除,再計(jì)算剩下正常值中的最小、最大和平均值作為該聚類的閾值。
曲線擬合是一種較常用的數(shù)據(jù)擬合方法,用來找到數(shù)據(jù)的規(guī)律和模式,系統(tǒng)運(yùn)行產(chǎn)生的時(shí)間序列數(shù)據(jù)通常滿足某種模式,使用曲線擬合來找到這種模式有利于異常判斷和發(fā)現(xiàn),本文的曲線擬合采用的是最小二乘法,它使用簡單,高效,易于理解。
這里,假設(shè)樣本點(diǎn)的分布不為直線,我們可用多項(xiàng)式曲線擬合,即擬合曲線方程為n階多項(xiàng)式[14]。
采用的是迭代法的梯度下降法求解,其中目標(biāo)公式定義如下:
采用隨機(jī)梯度下降的方法對參數(shù)向量求導(dǎo),使得梯度為0,然后得到參數(shù)變量的迭代更新公式。實(shí)際實(shí)現(xiàn)中,我們采用python的機(jī)器學(xué)習(xí)包numpy進(jìn)行計(jì)算,得到模型。
由于時(shí)間序列具有非線性、非平穩(wěn)化、快速變化并且包含噪聲干擾的特點(diǎn),許多學(xué)者對時(shí)間序列進(jìn)行了深入研究,提出了不同的預(yù)測模型。本文采用ARIMA算法進(jìn)行模型的訓(xùn)練。
算法步驟包括:
(1)對時(shí)序數(shù)據(jù)進(jìn)行平穩(wěn)化處理,可選的有:移動(dòng)平均法,加權(quán)移動(dòng)平均法,對數(shù)處理,差分處理,分解處理。
(2)在設(shè)定最大的AR延遲數(shù)max_ar和最大的MA延遲數(shù)max_ma后,通過BIC準(zhǔn)則進(jìn)行模型的定階,本文采用的是python的arma_order_select_ic進(jìn)行自動(dòng)定階,確定p,q值。
(3)對平滑處理后的模型進(jìn)行訓(xùn)練得到擬合參數(shù)。
(4)對模型進(jìn)行還原處理得到模型。
將檢測點(diǎn)時(shí)間作為上述ARIMA模型的變量計(jì)算上述兩個(gè)模型的預(yù)測值,
?2=|ρ2-y2|,其中,?2是根據(jù)ARIMA模型計(jì)算出來的殘差,如果?2>2σ2,則判斷為異常,σ2為近期時(shí)序數(shù)據(jù)的標(biāo)準(zhǔn)差。
本文采用的混合模型算法的第一步是對指標(biāo)進(jìn)行粗略的劃分,其中,訪問量的變化是呈一定規(guī)律的,劃分為4類,數(shù)據(jù)庫的活動(dòng)會(huì)話數(shù)值在統(tǒng)計(jì)區(qū)間變化很小,大部分的數(shù)據(jù)集中在20以下,因此只是分為2類,內(nèi)存數(shù)值和CPU數(shù)值隨業(yè)務(wù)變化不大,都被分為3類。第二步,對劃分后的數(shù)據(jù)應(yīng)用grubbs算法剔除異常值,計(jì)算正常數(shù)值集的最大、最小值,得到每一劃分后的閾值。
圖2 使用KMeans結(jié)合grubbs算法進(jìn)行劃分并剔除異常
本地測試所使用的硬件環(huán)境為一臺(tái)i5-6200U 2.3GHz,內(nèi)存:16GB,64位操作系統(tǒng),Windows7版本,使用的語言是Python3.6.
3.2.1 時(shí)間序列算法性能
在本實(shí)驗(yàn)中使用的訓(xùn)練數(shù)據(jù)是1個(gè)半月的指標(biāo)數(shù)據(jù),采集粒度為5分鐘,一共12,683條數(shù)據(jù),訓(xùn)練數(shù)據(jù)10,139條,占總數(shù)據(jù)的比例為80%,預(yù)測數(shù)據(jù)占總數(shù)據(jù)的比例為20%,如果預(yù)測值與實(shí)際值之差超過3個(gè)標(biāo)準(zhǔn)差,則認(rèn)為是異常。
圖3 使用ARIMA算法檢測異常
從圖3可以看到,在相對平穩(wěn)的時(shí)間序列使用ARIMA算法預(yù)測可以得到比較準(zhǔn)確的判斷結(jié)果。
通信設(shè)備商在實(shí)際的系統(tǒng)運(yùn)維過程中,會(huì)對多項(xiàng)用戶指標(biāo)數(shù)據(jù)和設(shè)備指標(biāo)數(shù)據(jù)進(jìn)行監(jiān)控以便及時(shí)發(fā)現(xiàn)潛在的故障和缺數(shù)問題,目前的問題是:系統(tǒng)網(wǎng)絡(luò)架構(gòu)復(fù)雜多樣,涉及的指標(biāo)多,使用固定閾值會(huì)導(dǎo)致漏告、錯(cuò)告等問題,為了減少無效告警,提高告警準(zhǔn)確率,本文設(shè)計(jì)了一套混合模型的時(shí)間序列指標(biāo)異常檢測算法,將歷史數(shù)據(jù)按實(shí)際分布進(jìn)行粗略的聚類,再使用Grubbs算法剔除聚類后的各數(shù)據(jù)集的異常值,得到動(dòng)態(tài)的閾值基線作為初步判斷的依據(jù),接下來使用曲線擬合和ARIMA算法對近期的歷史數(shù)據(jù)(t-5t時(shí)間窗口內(nèi)的數(shù)據(jù))進(jìn)行訓(xùn)練,用來預(yù)測下一窗口的值(5t-6t),如果預(yù)測值與實(shí)際值的差值超過設(shè)定的閾值則產(chǎn)生一個(gè)事件,發(fā)送給告警處理模塊進(jìn)行告警處理,確認(rèn)為異常的值會(huì)使用預(yù)測值填入歷史數(shù)據(jù),通過不停的迭代,剔除了異常數(shù)據(jù),確保了訓(xùn)練數(shù)據(jù)的準(zhǔn)確性。混合模型的異常檢測算法結(jié)合了統(tǒng)計(jì)學(xué)算法的高性能,曲線擬合對某一類數(shù)據(jù)的準(zhǔn)確擬合,及ARIMA算法的自動(dòng)擬合的優(yōu)點(diǎn),兼顧性能和準(zhǔn)確性,能很好的對不同趨勢的數(shù)據(jù)進(jìn)行預(yù)測和遺產(chǎn)檢測。本算法在真實(shí)系統(tǒng)運(yùn)維場景中使用的結(jié)果表明,查全率可以達(dá)到100%,平均差準(zhǔn)率可以達(dá)到95.7%,算法的性能滿足系統(tǒng)要求,通過運(yùn)用算法將某系統(tǒng)的告警從每天754條壓縮到40條,有效地壓縮了無效告警,提高了問題發(fā)現(xiàn)率。