簡(jiǎn)易的內(nèi)存監(jiān)控系統(tǒng)
本文需要有一定的python和前端基礎(chǔ),如果沒(méi)基礎(chǔ)的,請(qǐng)關(guān)注我后續(xù)的基礎(chǔ)教程系列博客
文章源地址,還可以看到具體的代碼,喜歡請(qǐng)加個(gè)星星
騰訊視頻鏈接錄制中間網(wǎng)出問(wèn)題了,重啟了一下,所以有兩部分
視頻1
視頻2
本文的目的在于,盡可能用簡(jiǎn)單的代碼,讓大家了解內(nèi)存監(jiān)控的原理
主題思路
獲取內(nèi)存信息
存儲(chǔ)信息
展現(xiàn)
后續(xù)擴(kuò)展
加主機(jī)名,monitor部署在多臺(tái)機(jī)器,不直接插數(shù)據(jù)庫(kù)
通過(guò)http請(qǐng)求的方式,一臺(tái)機(jī)器起flask專門(mén)存數(shù)據(jù)monitor
思路圖
其實(shí)所有的監(jiān)控項(xiàng),包括內(nèi)存數(shù)據(jù),都是從文件中讀取的,大家執(zhí)行以下 cat /proc/meminfo就可以看到關(guān)于內(nèi)存的信息,我們關(guān)注的是前四行,總內(nèi)存,空閑內(nèi)存,緩沖和緩存大小
計(jì)算內(nèi)存占用量公式:
(總內(nèi)存-空閑內(nèi)存-緩沖-緩存)/1024Mb
代碼呼之欲出 monitor.py
用with打開(kāi)文件,可以自動(dòng)關(guān)閉,比直接open優(yōu)雅那么一丟丟
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()
執(zhí)行文件 python monitor.py,每一秒打印一條內(nèi)存信息
[woniu@teach memory]$ python mointor.py 2920 2919 2919 2919 2919
我們可以寫(xiě)個(gè)很搓的測(cè)試代碼,占用一點(diǎn)內(nèi)存,看看數(shù)據(jù)會(huì)不會(huì)變
執(zhí)行下面代碼,能看到內(nèi)存使用量明顯多了幾M
# test.py s = "akdsakjhdjkashdjkhasjkdhasjkdhkjashdaskjhfoopnnm,ioqouiew"*100000 for i in s: for j in s: s.count(j)
獲取內(nèi)存數(shù)據(jù)done!
第二步存儲(chǔ)數(shù)據(jù)庫(kù) 我們選用mysql新建表格,我們需要兩個(gè)字段,內(nèi)存和時(shí)間 sql呼之欲出,簡(jiǎn)單粗暴
create memory(memory int,time int)
我們的 monitor.py就不能只打印內(nèi)存信息了,要存儲(chǔ)數(shù)據(jù)庫(kù)啦,引入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和執(zhí)行的步驟,具體過(guò)程見(jiàn)視頻,大家到數(shù)據(jù)庫(kù)里執(zhí)行一下下面的sql,就能看到我們辛辛苦苦獲取的內(nèi)存數(shù)據(jù)啦
select * from memory
我們的數(shù)據(jù)庫(kù)里數(shù)據(jù)越來(lái)越多,怎么展示呢
我們需要flask
我們看下文件結(jié)構(gòu)
. ├── flask_web.py web后端代碼 ├── mointor.py 監(jiān)控?cái)?shù)據(jù)獲取 ├── static 靜態(tài)文件,第三方圖表庫(kù) │?? ├── exporting.js │?? ├── highstock.js │?? └── jquery.js ├── templates │?? └── index.html 展示前端頁(yè)面 └── test.py 占用內(nèi)存的測(cè)試代碼
flask_web就是我們的web服務(wù)代碼,template下面的html,就是前端展示的文件,static下面是第三方庫(kù)
flask_web的代碼如下
提供兩個(gè)路由
根目錄渲染文件index.html
/data路由去數(shù)據(jù)庫(kù)插數(shù)據(jù),返回json,供畫(huà)圖使用
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頁(yè)面,copy過(guò)來(lái),具體過(guò)程見(jiàn)視頻
51reboot hello world
具體觀察數(shù)據(jù)結(jié)構(gòu)的過(guò)程,見(jiàn)視頻和demo鏈接,我們做的 就是把數(shù)據(jù)庫(kù)里的數(shù)據(jù),拼接成前端畫(huà)圖需要的數(shù)據(jù),展現(xiàn)出來(lái)
這時(shí)候前端就能看到圖表啦
我們并不僅限于此,如果想實(shí)時(shí)的看到內(nèi)存,應(yīng)該怎么搞呢查詢數(shù)據(jù)時(shí)候增加一個(gè)時(shí)間戳當(dāng)限制條件,再次查詢時(shí),只返回兩次查詢之間的增量數(shù)據(jù)
前端動(dòng)態(tài)添加增量結(jié)點(diǎn)數(shù)據(jù)到圖表中
代碼呼之欲出
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秒查一次增量數(shù)據(jù)
$.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!兩個(gè)文件都搞定,double kill!
效果
最終代碼直接下載那個(gè)木看也行
監(jiān)控文件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
代碼沒(méi)有特別注意細(xì)節(jié),希望大家喜歡。
歡迎大家關(guān)注個(gè)人公共號(hào),高品質(zhì)運(yùn)維開(kāi)發(fā)
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/91560.html
簡(jiǎn)易的內(nèi)存監(jiān)控系統(tǒng) 本文需要有一定的python和前端基礎(chǔ),如果沒(méi)基礎(chǔ)的,請(qǐng)關(guān)注我后續(xù)的基礎(chǔ)教程系列博客 文章源地址,還可以看到具體的代碼,喜歡請(qǐng)加個(gè)星星 騰訊視頻鏈接 錄制中間網(wǎng)出問(wèn)題了,重啟了一下,所以有兩部分 視頻1 視頻2 本文的目的在于,盡可能用簡(jiǎn)單的代碼,讓大家了解內(nèi)存監(jiān)控的原理主題思路 獲取內(nèi)存信息 存儲(chǔ)信息 展現(xiàn) 后續(xù)擴(kuò)展 加主機(jī)名,monitor部署在多臺(tái)機(jī)器,不直接插...
摘要:背景近鄰算法的概述近鄰算法的簡(jiǎn)介近鄰算法是屬于一個(gè)非常有效且易于掌握的機(jī)器學(xué)習(xí)算法,簡(jiǎn)單的說(shuō)就是采用測(cè)量不同特征值之間距離的方法對(duì)數(shù)據(jù)進(jìn)行分類(lèi)的一個(gè)算法。完美的分類(lèi)器的錯(cuò)誤率為,而最差的分類(lèi)器的錯(cuò)誤率則為。 1 背景 1.1 k近鄰算法的概述 (1)k近鄰算法的簡(jiǎn)介 k-近鄰算法是屬于一個(gè)非...
摘要:性能測(cè)試除了需要監(jiān)控內(nèi)存占用流量等,還需要獲取的電量數(shù)據(jù),測(cè)試在可接受范圍內(nèi),避免出現(xiàn)過(guò)度消耗電量的現(xiàn)象。這一欄顯示了不同的充電方式對(duì)電量使用的影響。 本文由作者張迎貞授權(quán)網(wǎng)易云社區(qū)發(fā)布。 APP性能測(cè)試除了需要監(jiān)控PCU、內(nèi)存占用、流量等,還需要獲取APP的電量數(shù)據(jù),測(cè)試在可接受范圍內(nèi),避免APP出現(xiàn)過(guò)度消耗電量的現(xiàn)象。手機(jī)有很多硬件模塊:CPU,藍(lán)牙,GPS,顯示屏,Wifi,射頻...
摘要:在本次課程中,著重講解的是傳統(tǒng)的機(jī)器學(xué)習(xí)技術(shù)及各種算法。回歸對(duì)連續(xù)型數(shù)據(jù)進(jìn)行預(yù)測(cè)趨勢(shì)預(yù)測(cè)等除了分類(lèi)之外,數(shù)據(jù)挖掘技術(shù)和機(jī)器學(xué)習(xí)技術(shù)還有一個(gè)非常經(jīng)典的場(chǎng)景回歸。 摘要: 什么是數(shù)據(jù)挖掘?什么是機(jī)器學(xué)習(xí)?又如何進(jìn)行Python數(shù)據(jù)預(yù)處理?本文將帶領(lǐng)大家一同了解數(shù)據(jù)挖掘和機(jī)器學(xué)習(xí)技術(shù),通過(guò)淘寶商品案例進(jìn)行數(shù)據(jù)預(yù)處理實(shí)戰(zhàn),通過(guò)鳶尾花案例介紹各種分類(lèi)算法。 課程主講簡(jiǎn)介:韋瑋,企業(yè)家,資深I(lǐng)T領(lǐng)...
閱讀 3190·2021-11-10 11:35
閱讀 1295·2019-08-30 13:20
閱讀 1117·2019-08-29 16:18
閱讀 2131·2019-08-26 13:54
閱讀 2155·2019-08-26 13:50
閱讀 955·2019-08-26 13:39
閱讀 2473·2019-08-26 12:08
閱讀 1951·2019-08-26 10:37