巧用機器學習定位雲伺服器故障
歡迎大家前往騰訊雲+社群,獲取更多騰訊海量技術實踐乾貨哦~
導語
隨著騰訊雲業務的擴大,母機數量越來越多。為減少人力並實現母機故障的自動化定位,本文嘗試利用機器學習演算法,通過對歷史故障母機的日誌資料學習,訓練模型實現自動化分析定位母機故障原因。
背景
對於每一單母機故障我們都需要定位出背後真實的故障原因,以便對相應的部件進行更換以及統計各種部件故障率的情況,因此故障定位和分析消耗的人力也越來越多。希望能藉助機器學習的方法對歷史故障母機的日誌資料進行學習,沉澱出一些模型出來實現自動化的分析新的母機故障的原因,進而提高母機工單的處理效率解放人力,同時也能分析出故障的一些規律,進而實現對故障的預測等。
目標
1、對母機宕機故障進行自動化的分析,準確定位故障原因;
2、當故障分類準確率達到足夠準確之後,能夠不需要人工參與,實現自動化結單;
3、實時流式處理母機的各種資料,實現部分故障的預測。
資料
1、dmesg :機器宕機前的最後一屏,含有netconsole資料;
2、mcelog :系統檢查到硬體錯誤產生的日誌;
3、sel :系統事件日誌,是伺服器感測器收集資料發現異常產生的日誌。
方法步驟
主要步驟包括資料篩選、資料清洗、文字向量化、模型構建、結果分析等。
資料篩選
1)檢視三類日誌,分析是否每一種日誌對故障定位都有存價值。剔除無價值的日誌;
2)根據業務需求,選擇特定的故障類別。因為某些故障的工單數量特別少,難以建立機器學習模型做分類;
3)保留三種日誌不全為空的故障工單,完全無記錄的工單是無法利用的;
4)根據工單編號ticket_id將日誌及故障工單整合,工單和母機應該是一一對應的。
資料清洗
1)剔除特殊符號'#', '<', '>', '&', '@','!', '(', ')', '*', '_'等;
2)剔除日誌的無用資訊,如數字格式和英文格式的;
3)日誌分開清洗,當不同日誌的格式不一致時,需要區分對待分開清洗。
文字向量化
日誌資料一般為文字資料,在構建文件分類模型時,需要將文字型資料轉化成數值型資料。文字向量化(也叫做特徵權重計算)常用以下三種方法。
1)布林權重(Boolean vector),是最簡單的權重計算方法。
2)頻度權值(term frequence),是最直觀的權重計算方法。單詞在文字中出現的次數即為頻度權重。這種方法的思想是,出現次數越多的特徵單詞,其重要性越大。
3)Tf-idf(Term Frequency-Inverse Document Frequency, 詞頻-逆檔案頻率),是應用最廣泛的權值計算方法。單詞在一條工單的日誌中出現次數越多, 同時在所有工單中出現次數越少, 越能夠代表該故障工單。
相比於頻度權值,引入了IDF。IDF的主要思想是:如果包含詞條t的文件越少, IDF越大,則說明詞條具有很好的類別區分能力。計算公式如下,分母之所以要加1,是為了避免分母為0
模型構建
在已有資料(標記)的基礎上構造出一個分類函式/分類模型, 即為一個決策面。
1)資料劃分:隨機分層抽樣,劃分訓練集(70%)用於構建模型,測試集(30%)用於驗證模型效果;
2)資料預處理:資料整合、資料清洗、文字分詞等過程在訓練集和測試集上是同樣的處理方式,以確保最後的乾淨的訓練集和測試資料的格式是統一的;
3)文字向量化:採用tf-idf將文字向量化,選擇l2正則化,結合文件頻率df和最大詞頻tf進行特徵選擇,選出若干個關鍵詞;設定停用詞['is', 'not', 'this', 'the', 'do', 'in']等;
4)模型構建:選取分類問題常用的演算法構建模型,構建模型過程中不斷引數調優,構建最佳的模型。
注:對於數量特別少的故障型別,如果依靠專家知識分析已有的工單日誌能夠一一正確區分的話,那麼可以人為地抽象出獨一無二的故障特徵,並編寫模組實現自動化分類。
結果分析
故障診斷階段,將構建好的模型運用到測試集上,對故障診斷結果分析。以決策樹建立故障診斷模型,可見在訓練集上的效果可達98.94%,測試集上可達90.24%。
為進一步提高模型效能,一方面應具體分析訓練集和測試集上被錯誤分類的故障工單,檢視三種日誌的內容並查詢問題;另一方面,可增加更多的資料用於構建模型,一般而言,資料量越大,模型越接近。
不同演算法:嘗試採用不同的文字分類演算法用於故障分類,測試效果能反映出該演算法對當前問題的適用性。如下,筆者採用了8種演算法進行對比,並對結果進行總結分析。
關聯規則:左鍵 ->右鍵,左鍵的組合導致右鍵的發生。引入關聯規則挖掘,可進一步分析日誌中關鍵詞的出現,可以如何判定某一類故障的發生。譬如當{'TSC', 'CPU', 'Hardware', 'Error'}等詞同時出現時,可理解為當這些關鍵詞出現時,有89.1%的置信度人為發生了硬體故障-記憶體故障。
解決方案補充
從工程實踐的角度出發,筆者提出以下幾種可能的解決方案,以作為對上面方法步驟的補充:
1.故障分級:將故障劃分等級,如一級故障(硬體故障-軟體故障),二級故障為硬體故障下更具體的故障型別。當直接對所有二級故障做分類效果不理想時,可先考慮對一級故障做分類,再對二級故障做分類,實現故障分級的效果。
2.資料不平衡:即不同類別的故障工單在數量級上不一致,資料量上相差較大,使得分類模型偏向於數量多的故障。考慮到故障工單資料不平衡的問題,可考慮將數目少的歸總為一類——其他類。示例如下,九分類問題可被轉化為四分類問題。但是,在工單數量嚴重不平衡而且故障類別多的情況下,這種歸總少類樣本為其他類的方法,使得模型分類效果具有較大的隨機性。
3.多字特徵詞:原理即將文字內容按位元組流進行大小為N的滑動視窗操作,形成長度為N的位元組片段序列,以自動產生多字特徵詞。相比於分開存在,幾個單詞的連續出現可能會有產生不一樣的意義,對分類產生影響。
4.布林權重:CPU發生故障時,CPU多核故障和單核故障屬於同一類,但多核故障會記錄每一個核的情況,導致某些關鍵詞或者格式重複出現,使得模型對於兩者的相似性降低。此時,可考慮使用布林權重代替tf-idf進行文字向量化。
後續
由於文字分類涵蓋的內容較多,本文儘可能從簡出發,闡述母機日誌分析的大體流程,以及工程實踐上的解決方案,以供交流。對於文字分類特徵選擇,模型引數調優和資料不平衡的更為詳細的解決方法,筆者將在後續跟進。
以上內容基於roganhuang(黃榮庚) 在實習期間工作的總結。感謝運營開發組的小夥伴們的幫助,感謝學長@simbazhou,導師@lelandwu和學姐@mengnizhang給予的指導和幫助。
筆者不才。如有錯誤,歡迎指正!
參考連結
此文已由作者授權騰訊雲+社群釋出,更多原文請點選
搜尋關注公眾號「雲加社群」,第一時間獲取技術乾貨,關注後回覆1024 送你一份技術課程大禮包!
海量技術實踐經驗,盡在雲加社群!