簡易的內存監控系統
本文需要有一定的python和前端基礎,如果沒基礎的,請關注我后續的基礎教程系列博客
文章源地址,還可以看到具體的代碼,喜歡請加個星星
騰訊視頻鏈接錄制中間網出問題了,重啟了一下,所以有兩部分
視頻1
視頻2
本文的目的在于,盡可能用簡單的代碼,讓大家了解內存監控的原理
主題思路
獲取內存信息
存儲信息
展現
后續擴展
加主機名,monitor部署在多臺機器,不直接插數據庫
通過http請求的方式,一臺機器起flask專門存數據monitor
思路圖
其實所有的監控項,包括內存數據,都是從文件中讀取的,大家執行以下 cat /proc/meminfo就可以看到關于內存的信息,我們關注的是前四行,總內存,空閑內存,緩沖和緩存大小
計算內存占用量公式:
(總內存-空閑內存-緩沖-緩存)/1024Mb
代碼呼之欲出 monitor.py
用with打開文件,可以自動關閉,比直接open優雅那么一丟丟
def getMem(): with open("/proc/meminfo") as f: total = int(f.readline().split()[1]) free = int(f.readline().split()[1]) buffers = int(f.readline().split()[1]) cache = int(f.readline().split()[1]) mem_use = total-free-buffers-cache print mem_use/1024 while True: time.sleep(1) getMem()
執行文件 python monitor.py,每一秒打印一條內存信息
[woniu@teach memory]$ python mointor.py 2920 2919 2919 2919 2919
我們可以寫個很搓的測試代碼,占用一點內存,看看數據會不會變
執行下面代碼,能看到內存使用量明顯多了幾M
# test.py s = "akdsakjhdjkashdjkhasjkdhasjkdhkjashdaskjhfoopnnm,ioqouiew"*100000 for i in s: for j in s: s.count(j)
獲取內存數據done!
第二步存儲數據庫 我們選用mysql新建表格,我們需要兩個字段,內存和時間 sql呼之欲出,簡單粗暴
create memory(memory int,time int)
我們的 monitor.py就不能只打印內存信息了,要存儲數據庫啦,引入mysql模塊,代碼如下
import time import MySQLdb as mysql db = mysql.connect(user="reboot",passwd="reboot123",db="memory",host="localhost") db.autocommit(True) cur = db.cursor() def getMem(): with open("/proc/meminfo") as f: total = int(f.readline().split()[1]) free = int(f.readline().split()[1]) buffers = int(f.readline().split()[1]) cache = int(f.readline().split()[1]) mem_use = total-free-buffers-cache t = int(time.time()) sql = "insert into memory (memory,time) value (%s,%s)"%(mem_use/1024,t) cur.execute(sql) print mem_use/1024 #print "ok" while True: time.sleep(1) getMem()
比之前的多了拼接sql和執行的步驟,具體過程見視頻,大家到數據庫里執行一下下面的sql,就能看到我們辛辛苦苦獲取的內存數據啦
select * from memory
我們的數據庫里數據越來越多,怎么展示呢
我們需要flask
我們看下文件結構
. ├── flask_web.py web后端代碼 ├── mointor.py 監控數據獲取 ├── static 靜態文件,第三方圖表庫 │?? ├── exporting.js │?? ├── highstock.js │?? └── jquery.js ├── templates │?? └── index.html 展示前端頁面 └── test.py 占用內存的測試代碼
flask_web就是我們的web服務代碼,template下面的html,就是前端展示的文件,static下面是第三方庫
flask_web的代碼如下
提供兩個路由
根目錄渲染文件index.html
/data路由去數據庫插數據,返回json,供畫圖使用
from flask import Flask,render_template,request import MySQLdb as mysql con = mysql.connect(user="reboot",passwd="reboot123",host="localhost",db="memory") con.autocommit(True) cur = con.cursor() app = Flask(__name__) import json @app.route("/") def index(): return render_template("index.html") @app.route("/data") def data(): sql = "select * from memory" cur.execute(sql) arr = [] for i in cur.fetchall(): arr.append([i[1]*1000,i[0]]) return json.dumps(arr) if __name__=="__main__": app.run(host="0.0.0.0",port=9092,debug=True)
前端index.html
highstock的demo頁面,copy過來,具體過程見視頻
51reboot hello world
具體觀察數據結構的過程,見視頻和demo鏈接,我們做的 就是把數據庫里的數據,拼接成前端畫圖需要的數據,展現出來
這時候前端就能看到圖表啦
我們并不僅限于此,如果想實時的看到內存,應該怎么搞呢查詢數據時候增加一個時間戳當限制條件,再次查詢時,只返回兩次查詢之間的增量數據
前端動態添加增量結點數據到圖表中
代碼呼之欲出
python
tmp_time = 0 @app.route("/data") def data(): global tmp_time if tmp_time>0: sql = "select * from memory where time>%s" % (tmp_time/1000) else: sql = "select * from memory" cur.execute(sql) arr = [] for i in cur.fetchall(): arr.append([i[1]*1000,i[0]]) if len(arr)>0: tmp_time = arr[-1][0] return json.dumps(arr)
前端,3秒查一次增量數據
$.getJSON("/data", function (data) { // Create the chart $("#container").highcharts("StockChart", { chart:{ events:{ load:function(){ var series = this.series[0] setInterval(function(){ $.getJSON("/data",function(res){ $.each(res,function(i,v){ series.addPoint(v) }) }) },3000) } } }, rangeSelector : { selected : 1 }, title : { text : "AAPL Stock Price" }, series : [{ name : "AAPL", data : data, tooltip: { valueDecimals: 2 } }] }); });
done!兩個文件都搞定,double kill!
效果
最終代碼直接下載那個木看也行
監控文件monitor.py
import time import MySQLdb as mysql db = mysql.connect(user="reboot",passwd="reboot123",db="memory",host="localhost") db.autocommit(True) cur = db.cursor() def getMem(): f = open("/proc/meminfo") total = int(f.readline().split()[1]) free = int(f.readline().split()[1]) buffers = int(f.readline().split()[1]) cache = int(f.readline().split()[1]) mem_use = total-free-buffers-cache t = int(time.time()) sql = "insert into memory (memory,time) value (%s,%s)"%(mem_use/1024,t) cur.execute(sql) print mem_use/1024 #print "ok" while True: time.sleep(1) getMem()
flask
from flask import Flask,render_template,request import MySQLdb as mysql con = mysql.connect(user="reboot",passwd="reboot123",host="localhost",db="memory") con.autocommit(True) cur = con.cursor() app = Flask(__name__) import json @app.route("/") def index(): return render_template("index.html") tmp_time = 0 @app.route("/data") def data(): global tmp_time if tmp_time>0: sql = "select * from memory where time>%s" % (tmp_time/1000) else: sql = "select * from memory" cur.execute(sql) arr = [] for i in cur.fetchall(): arr.append([i[1]*1000,i[0]]) if len(arr)>0: tmp_time = arr[-1][0] return json.dumps(arr) if __name__=="__main__": app.run(host="0.0.0.0",port=9092,debug=True)
前端
51reboot hello world
代碼沒有特別注意細節,希望大家喜歡。
歡迎大家關注個人公共號,高品質運維開發
文章版權歸作者所有,未經允許請勿轉載,若此文章存在違規行為,您可以聯系管理員刪除。
轉載請注明本文地址:http://specialneedsforspecialkids.com/yun/37648.html
簡易的內存監控系統 本文需要有一定的python和前端基礎,如果沒基礎的,請關注我后續的基礎教程系列博客 文章源地址,還可以看到具體的代碼,喜歡請加個星星 騰訊視頻鏈接 錄制中間網出問題了,重啟了一下,所以有兩部分 視頻1 視頻2 本文的目的在于,盡可能用簡單的代碼,讓大家了解內存監控的原理主題思路 獲取內存信息 存儲信息 展現 后續擴展 加主機名,monitor部署在多臺機器,不直接插...
摘要:背景近鄰算法的概述近鄰算法的簡介近鄰算法是屬于一個非常有效且易于掌握的機器學習算法,簡單的說就是采用測量不同特征值之間距離的方法對數據進行分類的一個算法。完美的分類器的錯誤率為,而最差的分類器的錯誤率則為。 1 背景 1.1 k近鄰算法的概述 (1)k近鄰算法的簡介 k-近鄰算法是屬于一個非...
摘要:性能測試除了需要監控內存占用流量等,還需要獲取的電量數據,測試在可接受范圍內,避免出現過度消耗電量的現象。這一欄顯示了不同的充電方式對電量使用的影響。 本文由作者張迎貞授權網易云社區發布。 APP性能測試除了需要監控PCU、內存占用、流量等,還需要獲取APP的電量數據,測試在可接受范圍內,避免APP出現過度消耗電量的現象。手機有很多硬件模塊:CPU,藍牙,GPS,顯示屏,Wifi,射頻...
摘要:在本次課程中,著重講解的是傳統的機器學習技術及各種算法。回歸對連續型數據進行預測趨勢預測等除了分類之外,數據挖掘技術和機器學習技術還有一個非常經典的場景回歸。 摘要: 什么是數據挖掘?什么是機器學習?又如何進行Python數據預處理?本文將帶領大家一同了解數據挖掘和機器學習技術,通過淘寶商品案例進行數據預處理實戰,通過鳶尾花案例介紹各種分類算法。 課程主講簡介:韋瑋,企業家,資深IT領...
閱讀 2628·2021-11-19 09:56
閱讀 874·2021-09-24 10:25
閱讀 1632·2021-09-09 09:34
閱讀 2195·2021-09-09 09:33
閱讀 1052·2019-08-30 15:54
閱讀 542·2019-08-29 18:33
閱讀 1264·2019-08-29 17:19
閱讀 505·2019-08-29 14:19