本文僅僅是對負載預警的簡單嘗試,可以預測的場景也比較有限,可是做爲預測工做的開始已經比較可以說明問題了。前端
利用collectd, influxdb和grafana進行監控系統搭建能夠參考這篇文章Monitoring hosts with CollectD, InfluxDB and Grafana grafana的操做比nagios和cacti真的友好不少,可定製的能力也強不少。python
雖然grafana有必定的報警能力(在grafana4.0版本以後,alert模塊直接繼承進來,因此推薦4.0的版本),可是可以提早十幾分鍾對於集羣負載超標進行預警,一直是咱們的一個小目標。因此在這裏,咱們就開始爲這個小目標作了一點小努力。ios
在實際運行中,咱們安裝了這個小插件。它可以對應用負載進行批量的顯示,節約了好多體力活。git
經過分析,咱們能夠看到如下幾種負載github
簡單趨勢型web
週期型flask
規律不明顯型後端
而對於週期型咱們也能夠看到在短時間是能夠看到必定趨勢的。服務器
在這裏咱們僅採用線性迴歸對簡單趨勢進行預測。這點對於python很好實現機器學習
from datetime import datetime from influxdb import DataFrameClient import numpy as np from scipy import stats if __name__ == "__main__": host = 'localhost' port = 8086 user = 'root' password = 'root' dbname = 'collectd' client = DataFrameClient(host, port, user, password, dbname) print("Create pandas DataFrame") start_time = datetime(2016, 11, 17, 3,10).timestamp() end_time = datetime(2016, 11, 17, 8,50).timestamp() query = "select * from load_midterm where host='web153' and time > " + str(int(start_time)) + "s and time < " \ + str(int(end_time)) + "s" df = client.query(query) slope, intercept, r_value, p_value, std_err = stats.linregress(range(df['load_midterm'].shape[0]), df['load_midterm']['value'].values) print(slope) print(intercept) print(r_value) print(p_value)
在這裏咱們用的是統計模塊獲得斜率和截距。須要注意的是,咱們還要對R2,p值以及方差進行評價。通常來講r^2 >0.7, p<0.05, std_err<0.1
在這裏,爲何沒有采用一些更復雜的機器學習方法呢?
不管採用什麼模型,關鍵是要提取一些關鍵feature。我觀察過簡單的應用服務器的其餘指標,包括tcp鏈接數,cpu,磁盤io等,與load的協同性比較高,很難成爲15min後load的先導預測feature。若是從服務器集羣的總體角度去找feature的話,也許是能夠作的,將來會關注這塊。
在具體實現上,後端基於python flask編寫一個預測服務器,而前端開發能夠基於grafana的clock插件進行開發:clock-panel