徐志斌,葉 晗,王 晗,郜義浩
1(北京市首都公路發展集團有限公司,北京 100161)
2(北京云星宇交通科技股份有限公司,北京 100078)
隨著現實業務規模的擴大,對應的信息系統也變得越來越復雜.另一方面,業務人員對于系統穩定性的要求卻越來越高,這對運維的質量提出了很高的挑戰.一旦業務系統發生故障,運維人員很難精準定位故障發生的原和快速修復系統.傳統監控系統通常難以發現潛在的故障,因為在業務系統非常復雜的情況下,每一時刻都會產生大量有關或無關的運行狀態數據、日志數據,使得通過規則編碼或者人工排查進行故障預警變得越來越不顯示.
本文通過兩個步驟完成基于日志的系統故障預警工作的研究.包括:
(1)借助ELK平臺收集匯總各個系統中的日志,實現日志的集中化管理.這樣一方面可以方便運維人員的日常查詢、搜索、管理日志,提高運維效率.另一方面也可提供后續研究打下數據基礎,為日志預警模型篩選出確實有效的原始數據.
(2)基于LSTM模型,通過對原始數據的清洗、規范化等工作,結合歷史環境下系統相關告警信息,進而訓練得到基于日志的故障預警模型.
研究內容對于發現潛在故障,快速定位故障來源,準確識別故障原因,縮短故障恢復時間,提高運維人員工作效率都具有一定的幫助.
傳統上通常直接使用Shell或者Python 腳本對單機日志進行分析.當這種方式不能滿足海量日志分析要求的時候,分布式的日志采集、分析系統應運而生,并且逐漸成為了各大互聯網企業的標準配置[1].
當前主流的日志管理系統通常由采集端和服務端兩部分構成.采集端通常為在各主機安裝的代理(agent)或客戶端應用(client),這些代理或客戶端將采集到的日志數據推送到服務端.服務端則實現方式眾多,有的單純提供存儲、查詢功能,也有提供存儲、計算分析、查詢等復雜功能的龐大的分布式系統[2,3].
常見的日志管理系統有Cloudera 開源的Flume[4],Elastic[5]公司開源的ELK Facebook 開源的Scribe[6]和Apache的Chukwa[7]等.本文選用Elastic公司開源的ELK 套件來實現日志的采集、查詢和管理.
深度學習(deep learning)是機器學習的分支,是一種以人工神經網絡為架構,對數據進行表征學習的算法.其最大的好處是使用無監督或半監督的特征學習和分層特征提取算法來替代手工獲取特征,從而大大減少研究人員對研究領域知識的依賴.
當前深度學習中有很多成功的模型,例如深度神經網絡、卷積神經網絡、循環神經網絡等等.這些模型廣泛應用于多個研究領域,在計算機視覺、語音識別、自然語言處理以及生物信息學等領域都取得了極好的效果.
針對各種成熟的深度學習模型,研究者們提出了多種不同的框架,目前使用最廣泛的包括TensorFlow、Caffe、Keras、PyTorch 等.其中TensorFlow 由Google公司出品,TensorFlow框架更新維護頻繁,同時具備python與C++接口,同時具備完整教程,收到了廣大開發工作者和學術人員的青睞,目前已經成為深度學習框架中最受歡迎的選擇.本文所有模型訓練工作均采用TensorFlow框架完成.
(1)CNN
CNN 開始普遍用于圖像識別中,Yoon Kim在2014年提出了TextCNN,將卷積神經網絡CNN應用于文本分類中,利用多個不同size的Kernel 來提取句子中的關鍵信息.但CNN 有個最大問題是固定filter_size的視野,filter_size的超參調節很繁瑣.另外由于CNN的特性,TextCNN 對詞的順序很不敏感,無法從上下文中獲取信息.
(2)RNN
RNN模型結構最大的特點在于會將上一時刻的結果作為當前時刻的輸入,基本模型結構可以用以下公式表示:

其中,ht為當前時刻輸出,ht?1為上一時刻輸出,xt為當前時刻輸入,W即為需要訓練的權重[8].
RNN相比于CNN在文本上最大的優勢在于考慮到了上文的信息.從公式中可以看出,t時刻的輸出與1,2,···,t?1全部有關,但這也同時導致ht是由一系列W連乘得到的,進而引發梯度消失和梯度爆炸的問題.因此,當文本的篇幅比較長的時候,RNN的缺點就會凸顯出來.日志信息往往攜帶者一連串的報錯文本,RNN難以滿足當前要求[9].
(3)LSTM
LSTM (Long Short-Term Memory)可以認為是RNN的一種特殊形式,模型結構如圖1所示.

圖1 LSTM網絡模型結構
LSTM模型通過門控狀態來對信息進行選擇性的記憶,滿足了需要長時間記憶信息和遺忘信息的需求.
LSTM彌補了RNN在長文本中存在的缺點,即可以選擇性遺忘不重要的信息,在長文本中只保留重要信息的關聯性.本文基于日志的故障預測模型就是以LSTM為基礎完成的.
深度學習模型構建可以簡化為4部分內容,即模型結構的選擇、激活函數的選擇、損失函數的選擇以及下降梯度的選擇.本文在模型上使用標準的LSTM模型,在模型結構上不需要進行額外設定.
模型在損失函數上采用Softmax,即交叉熵損失,相比于范數損失、均方誤差等,交叉熵損失在分類上收斂速度要更加迅速.

圖2 日志文件信息
模型在梯度下降上采用SGD的方式.需要提及的是這里分別使用過Adam算法、AdaDelta算法和幾種GD方法.Adam與AdaDelta方法雖然收斂速度更快,但是由于訓練數據本身的質量一般,最終模型的準確率往往很差,而GD的收斂速度雖然最慢,但最終得到的效果要優于其他幾項,為了避免GD出現局部最優的現象,最終選定SGD方法.
本文選取首發集某業務系統作為試點,實現系統基于日志的故障預測完整流程,包括日志分析、日志處理、模型訓練與驗證工作.
該業務系統的不同日志文件中,雖然告警內容的格式也有所不同,但告警信息內容的結構基本上是相同的.
如圖2所示,所有告警日志基本包含以下幾部分內容.
(1)ERROR_time:告警日志產生的時間
(2)ERROR_label:告警標簽,顯示當前錯誤的類別,這個類別信息是日志自己生成的,而非通過告警產生的人工標簽.
(3)ERROR_label_detection:部分告警會有簡單的描述或解釋,這一部分信息不是必須的.
(4)ERROR_content:告警內容本身,這是用于模型訓練的關鍵數據.
(1)數據準備
本文總共選取了18年1整年的tomcat告警日志作為訓練數據,日志每天產生告警信息20~50條不等,共計訓練數據8000多條.同時通過采集到的告警信息對日志數據進行標定,將數據分為產生預警和不產生預警兩類.
(2)數據處理
對日志數據進行處理,包括結構化、時間格式標準化、日志格式轉化、文本序列化、文本長度截取等工作,最終得到可以直接進入模型的訓練數據.
(3)參數調整
模型主要需要調整的參數包括隱層數量、遺忘門偏置(drop值)、最大序列化值(embedding_size)以及最大文本長度.
隱層數量決定模型可以識別內容的復雜程度上限,層數越多可以完成的分類越復雜,但是耗費的時間與資源也會相應增加,經過調整,隱層數量為40時已經可以滿足模型預測目標.
遺忘門偏置一般要求大于等于1.0即可,當模型容易陷入局部最優時可以適當增大,本文在構建模型時已經選擇了不易出現局部最優的SGD 梯度,因此設置為1.0即可.
embedding_size的合理大小是需要在模型訓練過程中不斷去調整的,值過大會導致加入很多干擾項,影響模型準確率;值過小則進入訓練的數據信息太小,同樣會造成模型準確率下降.經過反復調試,故障預警模型的embedding_size在800~1000之間準確率最高,目前模型的embedding_size值為1000.
最大文本長度同樣會影響最終訓練模型的質量,一般情況下的最大文本長度可以設置為最長文本的60%到70%左右,但對于日志文件來說不同文件間的長度差異過大,需要反復多次試驗才能得到最佳值,本次故障預警模型使用的最大文本長度為500.
對于不同模型也需要對上述參數反復調整,最終保證訓練模型達到最優.
(3)模型訓練
模型開始訓練后會輸出運算步數以及loss值,作為準確率參考依據,如圖3所示.

圖3 訓練過程樣例
當step增加到一定程度后,模型的loss值就不再下降了,一般情況下需要經過3W-5W次的迭代.模型訓練最終生成文件樣例如圖4.
模型訓練完成后隨機選取4096條未進行訓練的數據進行故障預警模型測試.
測試結果如圖5所示.

圖5 故障預測模型測試集準確率
圖5中左側表示日志實際分類狀態,右側表示日志預測分類狀態,測試數據共計4096條,其中識別正確的數據為3376條,故障預測模型最終準確率為82%.
本文首先采用ELK工具實現了日志采集、存儲工作,為后續故障識別與模型訓練提供基礎.之后,使用這些日志在TensorFlow框架中對標準LSTM模型進行訓練,最終實現故障識別模型.經測試,障預測模型最終準確率為82%,準確性良好.
本文采用的整套流程具備很強的可操作性,可用于實際系統相關的故障預測工作,可為運維人員提供工作效率、保障業務系統穩定性提供一定幫助.同時也存在一些不足,例如尚未考慮日志與日志、告警與告警之間的關聯性問題,模型訓練中未對詞匯表的進一步研究與調整工作等,這些都可以作為后續的研究內容,幫助進一步提升模型的準確率.