oracle单表空间预估,使用ARIMA和腾讯的Metis时序数据异常检测来预测系统空间容量变化趋势...
使用ARIMA時間序列算法+騰訊Metis開源的時間序列異常檢測學件預測系統容量變化趨勢
以Oracle數據庫表空間容量增長變化為例,用不同的數據分析算法來進行容量變化的預估,通過評估各種算法最終的效果,選用ARIMA算法和Metis的時間序列異常檢測學件預測的效果最好。原因有如下三點:
1 從回歸算法的評估指標來看,ARIMA+時間序列異常預測效果最好,使用的評價指標為R2 Score=0.72(擬合優度,越接近1,表明模型越好)和RMSE均方誤差根=110.2(預測值與真實值的誤差平方根的均值)。
2 空間容量的變化基本符合時間序列的特征。容量的變化應該呈現一種比較緩慢而長期的持續上升趨勢。有的情況下會出現周期性的變動。
時間序列中的指標值不具有可加性。
序列中每個指標數值的大小與其間隔時間長短沒有直接聯系。
序列中每個指標數值通常是通過定期的一次登記取得的。
3 Metis時序異常檢測使用了TSFRESH時序特征提取庫來獲取30多種時序特征,配合各種統計特征比如EWMA、68–95–99.7 Rule、多項式擬合等來判斷數據分布是否存在異常。最后通過XGBoost高效算法進行類別判斷。時間序列異常檢測學件在織云企業版本中已覆蓋 20w+ 服務器,承載了 240w+ 業務指標的異常檢測。經過了海量監控數據打磨,該學件在異常檢測和運維監控領域具有廣泛的應用性。
先給出ARIMA+Metis的容量趨勢預測結果圖:
存在的問題:
1 圖中兩個尖點,我理解應該算是一個異常值,但是Metis并沒有檢測出來。還有待研究一下
2 雖然藍色的預測曲線和黃色的真實值曲線大致吻合,但還是有些誤差的。同時,在測試過程中,ARIMA的參數需要不斷的調整,不同時段的數據對應的算法模型的參數不一致。說明算法的魯棒性查,抗干擾能力弱。主要原因是數據量少(目前數據只有三個月,幾千行樣本數據)、樣本類型單一等。有待研究改進。
下面把整個數據分析過程大概介紹一下,包括系統架構、數據采集、數據處理、數據分析幾個方面。有關算法和一些名詞的解釋在文檔后面有介紹。
一 系統架構
使用主流框架組合:Python+Django+Celery+BootStrap。后端數據庫為Mysql
數據分析過程分為數據采集、數據預處理、數據預測及算法評估三個部分。
1 數據采集
使用Celery每小時收集一次數據庫表空間變化數據。每次收集的數據特征為163維。全部為Oracle數據庫本身的特征。主要的數據源如下:
DBA_HIST_SYSMETRIC_SUMMARY
DBA_HIST_TBSPC_SPACE_USAGE
DBA_TABLESPACES
DBA_DATA_FILES
DBA_FREE_SPACE
DBA_TEMP_FILES
其他特征比如操作系統等暫時沒有收集。
下圖是Django中定時任務的配置信息:
2 數據預處理
對數據進行清理、格式化。以滿足后面數據分析使用,包括一下幾個部分:
1)因子分析
2)K-Means聚類
3)時序異常檢測
先用 Factor-analyze(FA)方法來轉換高維度的DBMS特征,將數據轉換為較低維度的數據。然后使用k-means聚類算法來聚集這個較低維度的數據成有意義的組。使用這些降維技術來減少數據中的“噪音”。提高聚類分析的魯棒性和質量。
用k-means聚類結果是30個組時,得到的系統特征如下 紅色標注的部分是我覺得和空間變化率有關的特征。
Total Sorts Per User Call, 用戶排序次數
Cell Physical IO Interconnect Bytes
Total PGA Allocated PGA大小
Physical Read Bytes Per Sec 每秒物理讀字節
Temp Space Used 臨時表空間使用大小
Total PGA Used by SQL Workareas 用于SQL語句的PGA大小
Physical Write Bytes Per Sec 每秒物理寫字節數 (感覺這個有些多余,下面的就可以代替)
Physical Write Total Bytes Per Sec, 每秒物理寫的總字節數
Cursor Cache Hit Ratio, cursor cache的命中率
Redo Generated Per Sec 每秒redo生成大小
Redo Generated Per Txn 每事務redo生成的大小
Consistent Read Gets Per Sec 每秒一致讀大小
Rows Per Sort 行排序大小
Physical Read Total Bytes Per Sec 每秒物理讀字節數
Logical Reads Per Txn 每事務邏輯讀
Network Traffic Volume Per Sec 每秒網絡流量
Physical Reads Direct Per Sec 每秒物理直接讀
Logical Reads Per User Call 每用戶的邏輯讀
DB Block Changes Per Sec, DB 塊每秒的變化大小
Logical Reads Per Sec, 每秒邏輯讀
Database Time Per Sec, 每秒DB time占多少
Physical Reads Per Sec, 每秒物理讀
Physical Read Total IO Requests Per Sec 每秒物理讀請求數
DB Block Changes Per Txn 每事務的DB 塊改變大小
Open Cursors Per Sec 每秒打開的游標數
Consistent Read Gets Per Txn 每事務一致讀大小
Response Time Per Txn 每事務相應時間
Physical Reads Per Txn, 每事務物理讀大小
Host CPU Utilization (%) 主機CPU利用率
這里采用Metis的最值檢測。適用于大多數KPI指標數據的檢測,使用無監督和有監督聯合檢測。
樣本的選取規則如下:
異常查詢的界面
下圖是本次樣本數據的檢測結果,可以看到藍色線是待檢測的數據,可以看到明顯的異常值。
下面簡單介紹一下Metis的異常檢測過程,這是我擼了一遍代碼大概總結出來的,后續還要繼續深入了解。
1)獲取樣本數據的時序特征。 分為三個部分:統計特征、擬合特征、分類特征
統計特征:用開源的時序數據特征提取工具包TSFRESH來提取。總共提取30個時序特征。包括最大最小值、均值、方差、中位數、唯一值比例、后續時間絕對差異的平均值、最長連續子序列的長度等時序特征。
擬合特征:包括移動平均差值、加權移動平均差值、指數移動平均差值、雙指數移動平均差值。同時還增加了統計特征中的一些特增值
分類特征:自相關性計算、變異系數計算、數據分布的特征統計等
2)利用時序特征通過統計的算法進行首層判決。下面三種算法來判斷數據分布是否存在異常,只要一種算法判斷數據分布異常,就進入XGboost算法進行異常值的判斷,
1、使用68-95-99.7規則(https://en.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7_rule) 。目的是在觀測樣本數據的分布。包括正態和非正態分布。
其主要目的就是為了看大部分數據分布在哪個范圍內,有些像異常值檢測。
在實驗科學中有對應正態分布的三西格馬定律(three-sigma rule of thumb),是一個簡單的推論,內容是“幾乎所有”的值都在平均值正負三個標準差的范圍內,也就是在實驗上可以將99.7%的機率視為“幾乎一定”[1]。不過上述推論是否有效,會視探討領域中“顯著”的定義而定,在不同領域,“顯著”(significant)的定義也隨著不同,例如在社會科學中,若置信區間是在正負二個標準差(95%)的范圍,即可視為顯著。但是在粒子物理中,若是發現新的粒子,置信區間要到正負五個標準差(99.99994%)的程度。
在不是正態分布的情形下,也有另一個對應的三西格馬定律(three-sigma rule),即使是在非正態分布的情形下,至少會有88.8%的機率會在正負三個標準差的范圍內,這是依照切比雪夫不等式的結果。若是單模分布(unimodal distributions)下,正負三個標準差內的機率至少有95%,若一些符合特定條件的分布,機率至少會到98%[2] 。
https://zh.wikipedia.org/wiki/68%E2%80%9395%E2%80%9399.7%E5%8E%9F%E5%89%87
代碼片段
3、多項式擬合分析(https://en.wikipedia.org/wiki/Polynomial_regression): 通過多項式回歸,逼近出曲線的大致形狀,然后按照偏離程度為后面的XGBoost算法做一些分析做準備。
代碼片段:
3) 用XgBoost算法進行分類預測。
XGBoost是近幾年利用機器學習領域內一個強有力的武器。執行速度要比傳統的GDBT實現要快。另外在結構化的數據集上,在分類\回歸\排序預測建模上表現很突出。官網地址:https://xgboost.readthedocs.io/en/latest/parameter.html
主要步驟如下:
1 根據三大特征,統計特征、擬合特征、分類特征。來對樣本數據進行特征擴展。
2 然后根據得到的特征開始訓練數據。
3 對數據進行分類預測。
得出的分類結果說明如下:
4 數據分析
使用數據分析算法對經過時序數據異常檢測后的樣本數據進行在線分析和評估。
本次測驗使用的數據分析算法由如下:
1)線性回歸 RIDGE算法。
最先想到的算法。經過特征降維后,得到有意義的分組,然后根據這些分組的樣本數據,用線性回歸算法來計算空間的變化大小,下圖是模型在測試數據集上的測試結果,可以看到預測的效果很不好
Ridge回歸預測的平均絕對誤差高達831.51。基本起不到預測趨勢的目的。
2)Adaboost算法
Adaboost選取的弱學習算法是決策回歸樹。預測的效果如下:
對比Ridge效果要好一些。圖中藍色的框在Ridge回歸預測中都沒有顯著的預測出趨勢。但是Adaboost的平均絕對誤差也高達600.15. 也基本上起不到預測趨勢的目的
3)ARIMA算法
下圖是模型的趨勢預測結果,藍色線未預測結果,黃色線是真是數據。RMSE差不多為230。 比之前的兩個算法RMSE有大幅度的降低。R2 score的值為0.67. 模型還是不很理想。但基本能夠預測出容量變化的趨勢。
存在的問題:
1 圖中兩個尖點,我理解應該算是一個異常值,但是Metis并沒有檢測出來。還有待研究一下
2 雖然藍色的預測曲線和黃色的真實值曲線大致吻合,但還是有些誤差的。同時,在測試過程中,ARIMA的參數需要不斷的調整,不同時段的數據對應的算法模型的參數不一致。說明算法的魯棒性查,抗干擾能力弱。主要原因是數據量少(目前數據只有三個月,幾千行樣本數據)、樣本類型單一等。有待研究改進。
5 名詞解釋
1 學件:
是一種性能良好的預訓練機器學習模型,其具有一套解釋模型意圖和/或特性的規約
2 ARIMA算法:
差分自回歸移動平均模型。是用于時間序列分析的算法。原理是將非平穩時間序列轉換為平穩時間序列然后將因變量僅對它的滯后值以及隨機誤差項的現值和滯后值進行回歸所建立的模型。是時間序列分析中常用的算法模型。
AR是自回歸。MA是移動平均。
三個參數:p為自回歸項 q為移動平均數。d為時間序列成為平穩時所做的差分次數
3 Metis時間序列異常檢測學件。
由騰訊開源出來的機器學習學件。時間序列異常檢測學件的實現思路是基于統計判決、無監督和有監督學習對時序數據進行聯合檢測。通過統計判決、無監督算法進行首層判決,輸出疑似異常,其次進行有監督模型判決,得到最終檢測結果。檢測模型是經大量樣本訓練生成,可根據樣本持續訓練更新。
4 TSFRESH時間序列特征提取庫
很有用的時間序列特征提取庫,一共有100+時間特征可以使用。在Metis中使用了30多種時序特征。 https://github.com/blue-yonder/tsfresh。 TSFRESH自動從時間序列中提取100多個個特征。這些特征描述了時間序列的基本特征,如峰值的數量、平均值或最大值或更復雜的特征,如時間反轉對稱統計量。
5 線性回歸
RIDGE: 用于共線性數據分析的回歸方法,用最小二乘線性回歸來估計。也叫先驗分布為高斯分布的貝葉斯估計
LASSO:用于共線性數據分析的回歸方法,用最小二乘線性回歸來估計,也叫先驗分布為拉普拉斯分布的貝葉斯估計。
6 因子分析
用于研究觀測變量變動的共同原因和特殊原因,從而達到簡化變量結構的目的的多元統計分析方法。兩個方面,以尋求變量的基本結構,簡化變量系統,二是用于分類。
7 K-Means聚類
基于距離、相似度的聚類算法。基本步驟如下:
1 給定數據
2 確定類別數,并初始化K個類的中心
3 對每個數據點,計算離其最近的類。
4 多每個類,計算其所有數據的中心,并更新為新的中心
5 重復3-4步。知道數據點所屬類別類不再改變
8 Adaboost算法
Boosting算法就是將弱學習器組合成強的分類器或者回歸算法。沒有先驗知識的情況下,初始的分布為等概分布,即訓練集如果有N個樣本,每個樣本的分布概率為1/N。
每次循環后提高誤分樣本的分布概率,誤分樣本在訓練集中所占權重增大,使得下一次循環的弱學習器能夠集中力量對這些誤分樣本進行判斷。
9 XGBoost算法
是由 Tianqi Chen http://homes.cs.washington.edu/~tqchen/ 最初開發的實現可擴展,便攜,分布式 gradient boosting (GBDT, GBRT or GBM) 算法的一個庫,可以下載安裝并應用于 C++,Python,R,Julia,Java,Scala,Hadoop,現在有很多協作者共同開發維護。不論從運行時間還是模型的性能上,XGBoost目前是機器學習領域一個強有力的工具,在各種競賽中都取得了很好的成績,可用于分類\回歸\排序的數學分析。
總結
以上是生活随笔為你收集整理的oracle单表空间预估,使用ARIMA和腾讯的Metis时序数据异常检测来预测系统空间容量变化趋势...的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: JAVA设计模式--代理模式(动态)(一
- 下一篇: js 获取伪类和css变量