360 DoctorStarange:集預測、處理、關聯和資源優化於一體的智慧運維繫統
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的機器)
- 場景二 機房物理拓撲(及時瞭解機房機器的健康狀況)
場景二是我們針對於運維人員經常不能瞭解線上機房機器的執行狀況做得一個拓撲圖。在該拓撲圖裡面,運維人員可以更方便知道機器的總體執行狀況。而我們可以以上面提到的“機器健康度”來表示每個機器現在的執行狀態。如下圖是我們一個簡單機房的物理拓撲,在圖中,白色的機器表示該機器執行良好,紅色的機器表示該機器使用率過高,而灰色的機器則表示該機器使用率過低。