DoctorStarange背景介紹
為了保證360公司內部的私有云平臺的穩定性和可靠性,我們部門開發了監控系統–wonder來監控系統的狀態.但是隨著業務量的增加,通過設置單純的閾值來監控報警是遠遠不夠的.而且這種被動式的觸發報警很多時候需要人工去處理.
我們提出來DoctorStarange,它是一個智能的預測和處理系統,能夠提前預測出一些監控項的報警,并提前處理預測的報警,最大程度減少報警次數;它是一個關聯不同報警項的系統,能夠幫助運維人員去更快地排查報警;它還是一個對機器各個維度進行檢測的系統,能夠優化機器資源.
下面我們將分三個部分對該系統進行介紹:
首先介紹智能預測與處理系統,然后介紹報警關聯分析,最后引入機器健康度的概念,來及時了解機器的運行狀況,最大化機器資源的利用率.
智能預測與處理系統
我們對監控項的歷史數據進行分析后就會發現,有些監控項的歷史趨勢的增長(或下降)趨勢趨于穩定,如磁盤空間使用率等,而有些監控項的趨勢就波動的比較厲害,如cpu、網卡流量等.對于這兩種趨勢,我們需要使用不同的預測模型對未來一段時間的趨勢進行預測.預測只是第一步,如果預測后能讓機器自動處理一些危險的監控項,就可以最大程度上減少人工干預.
下圖是我們智能預測與處理系統的框架圖
趨勢穩定的監控項的預測與自動化處理
應用系統出現故障通常不是突然癱瘓造成的,而是一個漸變的過程.本節我們將結合磁盤空間使用率來說明我們的系統如何做到智能預測與處理.很明顯,磁盤預測工作應該分為兩部分,一部分是預測,另一部分是處理,下圖是具體的流程:
首先說一下預測.系統長時間運行,數據會持續寫入存儲,存儲空間逐漸變少,最終磁盤被寫滿而導致系統故障.由此可見,在不考慮人為因素的影響時,存儲空間隨時間變化存在很強的關聯性,且歷史數據對未來的發展存在一定的影響.所以可以采用時間序列分析法對磁盤容量進行預測分析.
我們使用ARIMA模型來處理時間序列,ARIMA涉及到三個參數:p(自相關系數),q(偏自相關系數)以及d(差分次數).差分次數可以使用ACF函數來檢測差分后該序列是否為平穩序列,而p和q可以使用AIC或者BIC準則來得到使AIC或者BIC信息量達到最小的模型階數.
有人可能會問這個系統可能依賴于預測模型的準確率.為了驗證模型的準確率,我們提出來兩個概念來說明效果:
- 預測準確率:預測準確率=預測報警且具有報警趨勢的機器數/預測報警的機器數
- 報警減少率:預測覆蓋率=預測報警且真正報警的機器數/報警的機器數
我們對線上20000+臺機器未來24小時的走勢進行預測,跟蹤了將近一個月的預測結果.可以發現我們的模型預測準確率能夠達到100%,報警減少率能夠達到70%左右,這說明我們的模型能夠獲得比較好的效果.
接下來將重點介紹在預測磁盤使用率將要達到閾值后,我們如何自動處理的過程.用戶可以根據自己的意愿選擇處理類型:一種是自動處理,一種是通知郵件.
如果是自動處理類型,我們會清理100%可以確定刪除的日志文件,比如allweb文件以及一些歸檔的日志文件.雖然我們有一定的目錄規范和定期的日志輪轉,但是因為有些程序編寫的不規范,業務訪問量的增長,還是會有磁盤被寫滿的情況,所以單純依靠自動清理會有一定的風險,所以我們還有一種是通知郵件,我們會定期將掃描出來的占用空間比較大的文件信息發送給用戶,由用戶自己去處理.
波動劇烈的監控項的預測與故障定位
和磁盤這種趨勢穩定的監控項不同的是,波動劇烈的監控項由于歷史數據變化情況比較復雜,采用傳統的ARIMA或者指數平滑的方法很難達到比較好的效果,因為他們很難捕捉到以前從未出現過的情況.相反,神經網絡模型由于輸入的是非線性方程,可以處理更復雜的時間序列.對于cpu預測,我們也分了兩個過程:預測以及故障定位.
本節采用神經網絡模型去預測cpu的走勢,提前預測出將要發生報警的機器,盡可能將具有隱患的故障扼殺在搖籃中,提高系統的可靠性和可用性.
建立神經網絡模型,首先要確定輸入、隱藏和輸出層的神經元個數.由于我們的線上業務具有天的周期性,所以我們將輸入層的個數設為24(當然這個值也可以通過求自回歸系數來求得),隱藏層的個數一般為輸入層個數乘以2再加1,所以輸出層為49,輸出層的個數為1,,我們根據此規則建立模型.
和趨勢穩定的監控項的預測準確率和報警減少率一樣,我們也預測了波動劇烈的監控項的未來一個小時的趨勢,同樣的機器數量,我們的預測準確率能夠達到80%左右,報警減少率能夠維持在50%.由于波動劇烈的項相比于趨勢穩定的項來說,不太容易預測,能夠一定程度減少報警也說明我們的預測模型可以達到比較好的效果.
接下來說明預測報警后,如何進行故障定位.我們會根據top值來找到占比比較高的進程,由于直接處理占比比較高的進程會有風險,所以我們只會郵件通知負責人以及運維人員.
以上我們以磁盤使用率和cpu為例子介紹兩種不同趨勢的監控項的預測以及處理工作,其他具有此特征的監控項的思路類似,在此就不一一展開.
報警關聯分析
隨著監控系統監控項的數目越來越多,報警的次數也會隨之暴增.不同報警項他們之間并非孤立的,而是存在著千絲萬縷的聯系.我們分析出某一時間段內協同發生變化的監控項,能夠幫助我們排查出問題,找到問題的根源.
報警關聯分析系統主要做了兩件事情:
- 報警系統:加入報警合并算法,能夠減少報警次數;
- 實時報警分析:找到存在因果關系的監控項,幫助排查問題;
下圖是我們報警關聯分析系統的框架圖:
怎樣去找到關聯項呢?我們根據自相關系數來獲得該段時間內發送波動的監控項.一起發生波動的項可能非常多,通過求曲線斜率的方法來獲得各個波動項的波動劇烈程度,并按照波動劇烈程度排序.利用均值波動法獲得波動持續的時間.在綜合考慮波動劇烈程度和持續時間后,我們可以給每個波動項賦予一定的權值,并由此得出正關聯和負關聯的項.
現實場景中,單純依靠當前的數據來得到相關聯的項可能不太準確,這時候我們就需要一個自學習的關聯分析系統,通過老case和人工經驗的加入,該模型得到不斷地修正和補充,因而會獲得比較好的效果.
對于報警系統,我們主要找到正關聯系數比較高的監控項,來合并一些報警之后,以最少的報警次數通知給用戶.而對于實時報警分析,我們就可以通過輸入一個波動項(原因),找到由此原因導致的其他波動的項(結果).
機器資源優化方案
面對不同業務的機器使用程度不同的問題,如何在不影響業務的同時,最大化機器資源利用率越來越成為業界比較關注的話題.我們不能使機器使用率過高,同樣也不能使機器利用率過低,因此我們提出來一個“機器健康度”的概念,該值會反映出該機器過去一段時間內重要指標的使用情況.
首先,如何選擇機器指標?在我們的方案中,我們選擇cpu空閑率、內存使用率、網卡流入流量、網卡流出流量和狀態連接數作為考量因素.之所以選擇這幾個指標是因為這幾個監控項能夠總體反映出機器的負載情況.
我們分別通過閾值的方法為這六個監控項設置上限和下限后,針對于每個監控項我們得到了四個值:歷史數據的均值上限、歷史數據的均值下限、預測數據的均值上限和預測數據的均值下限.
經過一個公式計算后,我們將得到一個-1到1區間內的一個值,即為健康度.如果該值越接近于-1,則說明機器比較空閑,如果該值越接近于1,表明機器使用率比較高.
下圖說明了我們方案實施的具體流程:
健康度的概念畢竟是一個學術的東西,我們如何將此概念應用到實際的場景中呢?下面將介紹我們具體的應用場景:
- 場景一 動態擴容和縮容
設置cron任務,比如每隔一周全量跑一次線上的機器,將有問題的機器錄入到數據庫中. 該數據庫可以用于以下方面:
- 資源回收的依據(關注健康度值為-1的機器)
- 業務擴容的依據(關注健康度值為1的機器)
- 場景二 機房物理拓撲(及時了解機房機器的健康狀況)
場景二是我們針對于運維人員經常不能了解線上機房機器的運行狀況做得一個拓撲圖.在該拓撲圖里面,運維人員可以更方便知道機器的總體運行狀況.而我們可以以上面提到的“機器健康度”來表示每個機器現在的運行狀態.如下圖是我們一個簡單機房的物理拓撲,在圖中,白色的機器表示該機器運行良好,紅色的機器表示該機器使用率過高,而灰色的機器則表示該機器使用率過低.
轉載請注明本頁網址:
http://www.snjht.com/jiaocheng/4327.html