徐志斌,葉 晗,王 晗,郜義浩
1(北京市首都公路發(fā)展集團有限公司,北京 100161)
2(北京云星宇交通科技股份有限公司,北京 100078)
隨著現(xiàn)實業(yè)務(wù)規(guī)模的擴大,對應(yīng)的信息系統(tǒng)也變得越來越復(fù)雜.另一方面,業(yè)務(wù)人員對于系統(tǒng)穩(wěn)定性的要求卻越來越高,這對運維的質(zhì)量提出了很高的挑戰(zhàn).一旦業(yè)務(wù)系統(tǒng)發(fā)生故障,運維人員很難精準(zhǔn)定位故障發(fā)生的原和快速修復(fù)系統(tǒng).傳統(tǒng)監(jiān)控系統(tǒng)通常難以發(fā)現(xiàn)潛在的故障,因為在業(yè)務(wù)系統(tǒng)非常復(fù)雜的情況下,每一時刻都會產(chǎn)生大量有關(guān)或無關(guān)的運行狀態(tài)數(shù)據(jù)、日志數(shù)據(jù),使得通過規(guī)則編碼或者人工排查進行故障預(yù)警變得越來越不顯示.
本文通過兩個步驟完成基于日志的系統(tǒng)故障預(yù)警工作的研究.包括:
(1)借助ELK平臺收集匯總各個系統(tǒng)中的日志,實現(xiàn)日志的集中化管理.這樣一方面可以方便運維人員的日常查詢、搜索、管理日志,提高運維效率.另一方面也可提供后續(xù)研究打下數(shù)據(jù)基礎(chǔ),為日志預(yù)警模型篩選出確實有效的原始數(shù)據(jù).
(2)基于LSTM模型,通過對原始數(shù)據(jù)的清洗、規(guī)范化等工作,結(jié)合歷史環(huán)境下系統(tǒng)相關(guān)告警信息,進而訓(xùn)練得到基于日志的故障預(yù)警模型.
研究內(nèi)容對于發(fā)現(xiàn)潛在故障,快速定位故障來源,準(zhǔn)確識別故障原因,縮短故障恢復(fù)時間,提高運維人員工作效率都具有一定的幫助.
傳統(tǒng)上通常直接使用Shell或者Python 腳本對單機日志進行分析.當(dāng)這種方式不能滿足海量日志分析要求的時候,分布式的日志采集、分析系統(tǒng)應(yīng)運而生,并且逐漸成為了各大互聯(lián)網(wǎng)企業(yè)的標(biāo)準(zhǔn)配置[1].
當(dāng)前主流的日志管理系統(tǒng)通常由采集端和服務(wù)端兩部分構(gòu)成.采集端通常為在各主機安裝的代理(agent)或客戶端應(yīng)用(client),這些代理或客戶端將采集到的日志數(shù)據(jù)推送到服務(wù)端.服務(wù)端則實現(xiàn)方式眾多,有的單純提供存儲、查詢功能,也有提供存儲、計算分析、查詢等復(fù)雜功能的龐大的分布式系統(tǒng)[2,3].
常見的日志管理系統(tǒng)有Cloudera 開源的Flume[4],Elastic[5]公司開源的ELK Facebook 開源的Scribe[6]和Apache的Chukwa[7]等.本文選用Elastic公司開源的ELK 套件來實現(xiàn)日志的采集、查詢和管理.
深度學(xué)習(xí)(deep learning)是機器學(xué)習(xí)的分支,是一種以人工神經(jīng)網(wǎng)絡(luò)為架構(gòu),對數(shù)據(jù)進行表征學(xué)習(xí)的算法.其最大的好處是使用無監(jiān)督或半監(jiān)督的特征學(xué)習(xí)和分層特征提取算法來替代手工獲取特征,從而大大減少研究人員對研究領(lǐng)域知識的依賴.
當(dāng)前深度學(xué)習(xí)中有很多成功的模型,例如深度神經(jīng)網(wǎng)絡(luò)、卷積神經(jīng)網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等等.這些模型廣泛應(yīng)用于多個研究領(lǐng)域,在計算機視覺、語音識別、自然語言處理以及生物信息學(xué)等領(lǐng)域都取得了極好的效果.
針對各種成熟的深度學(xué)習(xí)模型,研究者們提出了多種不同的框架,目前使用最廣泛的包括TensorFlow、Caffe、Keras、PyTorch 等.其中TensorFlow 由Google公司出品,TensorFlow框架更新維護頻繁,同時具備python與C++接口,同時具備完整教程,收到了廣大開發(fā)工作者和學(xué)術(shù)人員的青睞,目前已經(jīng)成為深度學(xué)習(xí)框架中最受歡迎的選擇.本文所有模型訓(xùn)練工作均采用TensorFlow框架完成.
(1)CNN
CNN 開始普遍用于圖像識別中,Yoon Kim在2014年提出了TextCNN,將卷積神經(jīng)網(wǎng)絡(luò)CNN應(yīng)用于文本分類中,利用多個不同size的Kernel 來提取句子中的關(guān)鍵信息.但CNN 有個最大問題是固定filter_size的視野,filter_size的超參調(diào)節(jié)很繁瑣.另外由于CNN的特性,TextCNN 對詞的順序很不敏感,無法從上下文中獲取信息.
(2)RNN
RNN模型結(jié)構(gòu)最大的特點在于會將上一時刻的結(jié)果作為當(dāng)前時刻的輸入,基本模型結(jié)構(gòu)可以用以下公式表示:
其中,ht為當(dāng)前時刻輸出,ht?1為上一時刻輸出,xt為當(dāng)前時刻輸入,W即為需要訓(xùn)練的權(quán)重[8].
RNN相比于CNN在文本上最大的優(yōu)勢在于考慮到了上文的信息.從公式中可以看出,t時刻的輸出與1,2,···,t?1全部有關(guān),但這也同時導(dǎo)致ht是由一系列W連乘得到的,進而引發(fā)梯度消失和梯度爆炸的問題.因此,當(dāng)文本的篇幅比較長的時候,RNN的缺點就會凸顯出來.日志信息往往攜帶者一連串的報錯文本,RNN難以滿足當(dāng)前要求[9].
(3)LSTM
LSTM (Long Short-Term Memory)可以認(rèn)為是RNN的一種特殊形式,模型結(jié)構(gòu)如圖1所示.
圖1 LSTM網(wǎng)絡(luò)模型結(jié)構(gòu)
LSTM模型通過門控狀態(tài)來對信息進行選擇性的記憶,滿足了需要長時間記憶信息和遺忘信息的需求.
LSTM彌補了RNN在長文本中存在的缺點,即可以選擇性遺忘不重要的信息,在長文本中只保留重要信息的關(guān)聯(lián)性.本文基于日志的故障預(yù)測模型就是以LSTM為基礎(chǔ)完成的.
深度學(xué)習(xí)模型構(gòu)建可以簡化為4部分內(nèi)容,即模型結(jié)構(gòu)的選擇、激活函數(shù)的選擇、損失函數(shù)的選擇以及下降梯度的選擇.本文在模型上使用標(biāo)準(zhǔn)的LSTM模型,在模型結(jié)構(gòu)上不需要進行額外設(shè)定.
模型在損失函數(shù)上采用Softmax,即交叉熵?fù)p失,相比于范數(shù)損失、均方誤差等,交叉熵?fù)p失在分類上收斂速度要更加迅速.
圖2 日志文件信息
模型在梯度下降上采用SGD的方式.需要提及的是這里分別使用過Adam算法、AdaDelta算法和幾種GD方法.Adam與AdaDelta方法雖然收斂速度更快,但是由于訓(xùn)練數(shù)據(jù)本身的質(zhì)量一般,最終模型的準(zhǔn)確率往往很差,而GD的收斂速度雖然最慢,但最終得到的效果要優(yōu)于其他幾項,為了避免GD出現(xiàn)局部最優(yōu)的現(xiàn)象,最終選定SGD方法.
本文選取首發(fā)集某業(yè)務(wù)系統(tǒng)作為試點,實現(xiàn)系統(tǒng)基于日志的故障預(yù)測完整流程,包括日志分析、日志處理、模型訓(xùn)練與驗證工作.
該業(yè)務(wù)系統(tǒng)的不同日志文件中,雖然告警內(nèi)容的格式也有所不同,但告警信息內(nèi)容的結(jié)構(gòu)基本上是相同的.
如圖2所示,所有告警日志基本包含以下幾部分內(nèi)容.
(1)ERROR_time:告警日志產(chǎn)生的時間
(2)ERROR_label:告警標(biāo)簽,顯示當(dāng)前錯誤的類別,這個類別信息是日志自己生成的,而非通過告警產(chǎn)生的人工標(biāo)簽.
(3)ERROR_label_detection:部分告警會有簡單的描述或解釋,這一部分信息不是必須的.
(4)ERROR_content:告警內(nèi)容本身,這是用于模型訓(xùn)練的關(guān)鍵數(shù)據(jù).
(1)數(shù)據(jù)準(zhǔn)備
本文總共選取了18年1整年的tomcat告警日志作為訓(xùn)練數(shù)據(jù),日志每天產(chǎn)生告警信息20~50條不等,共計訓(xùn)練數(shù)據(jù)8000多條.同時通過采集到的告警信息對日志數(shù)據(jù)進行標(biāo)定,將數(shù)據(jù)分為產(chǎn)生預(yù)警和不產(chǎn)生預(yù)警兩類.
(2)數(shù)據(jù)處理
對日志數(shù)據(jù)進行處理,包括結(jié)構(gòu)化、時間格式標(biāo)準(zhǔn)化、日志格式轉(zhuǎn)化、文本序列化、文本長度截取等工作,最終得到可以直接進入模型的訓(xùn)練數(shù)據(jù).
(3)參數(shù)調(diào)整
模型主要需要調(diào)整的參數(shù)包括隱層數(shù)量、遺忘門偏置(drop值)、最大序列化值(embedding_size)以及最大文本長度.
隱層數(shù)量決定模型可以識別內(nèi)容的復(fù)雜程度上限,層數(shù)越多可以完成的分類越復(fù)雜,但是耗費的時間與資源也會相應(yīng)增加,經(jīng)過調(diào)整,隱層數(shù)量為40時已經(jīng)可以滿足模型預(yù)測目標(biāo).
遺忘門偏置一般要求大于等于1.0即可,當(dāng)模型容易陷入局部最優(yōu)時可以適當(dāng)增大,本文在構(gòu)建模型時已經(jīng)選擇了不易出現(xiàn)局部最優(yōu)的SGD 梯度,因此設(shè)置為1.0即可.
embedding_size的合理大小是需要在模型訓(xùn)練過程中不斷去調(diào)整的,值過大會導(dǎo)致加入很多干擾項,影響模型準(zhǔn)確率;值過小則進入訓(xùn)練的數(shù)據(jù)信息太小,同樣會造成模型準(zhǔn)確率下降.經(jīng)過反復(fù)調(diào)試,故障預(yù)警模型的embedding_size在800~1000之間準(zhǔn)確率最高,目前模型的embedding_size值為1000.
最大文本長度同樣會影響最終訓(xùn)練模型的質(zhì)量,一般情況下的最大文本長度可以設(shè)置為最長文本的60%到70%左右,但對于日志文件來說不同文件間的長度差異過大,需要反復(fù)多次試驗才能得到最佳值,本次故障預(yù)警模型使用的最大文本長度為500.
對于不同模型也需要對上述參數(shù)反復(fù)調(diào)整,最終保證訓(xùn)練模型達(dá)到最優(yōu).
(3)模型訓(xùn)練
模型開始訓(xùn)練后會輸出運算步數(shù)以及l(fā)oss值,作為準(zhǔn)確率參考依據(jù),如圖3所示.
圖3 訓(xùn)練過程樣例
當(dāng)step增加到一定程度后,模型的loss值就不再下降了,一般情況下需要經(jīng)過3W-5W次的迭代.模型訓(xùn)練最終生成文件樣例如圖4.
模型訓(xùn)練完成后隨機選取4096條未進行訓(xùn)練的數(shù)據(jù)進行故障預(yù)警模型測試.
測試結(jié)果如圖5所示.
圖5 故障預(yù)測模型測試集準(zhǔn)確率
圖5中左側(cè)表示日志實際分類狀態(tài),右側(cè)表示日志預(yù)測分類狀態(tài),測試數(shù)據(jù)共計4096條,其中識別正確的數(shù)據(jù)為3376條,故障預(yù)測模型最終準(zhǔn)確率為82%.
本文首先采用ELK工具實現(xiàn)了日志采集、存儲工作,為后續(xù)故障識別與模型訓(xùn)練提供基礎(chǔ).之后,使用這些日志在TensorFlow框架中對標(biāo)準(zhǔn)LSTM模型進行訓(xùn)練,最終實現(xiàn)故障識別模型.經(jīng)測試,障預(yù)測模型最終準(zhǔn)確率為82%,準(zhǔn)確性良好.
本文采用的整套流程具備很強的可操作性,可用于實際系統(tǒng)相關(guān)的故障預(yù)測工作,可為運維人員提供工作效率、保障業(yè)務(wù)系統(tǒng)穩(wěn)定性提供一定幫助.同時也存在一些不足,例如尚未考慮日志與日志、告警與告警之間的關(guān)聯(lián)性問題,模型訓(xùn)練中未對詞匯表的進一步研究與調(diào)整工作等,這些都可以作為后續(xù)的研究內(nèi)容,幫助進一步提升模型的準(zhǔn)確率.