首页 Linux网维 10min 手写一个内存监控系统

10min 手写一个内存监控系统

本文的目的在于,尽可能用简单的代码,让大家了解内存监控的原理,及思想更容易去理解Nagios、Zabbix、Ganglia监控原理,文章最后还有视频教程哦,从零敲出来的全过程思路分…

本文的目的在于,尽可能用简单的代码,让大家了解内存监控的原理,及思想更容易去理解Nagios、Zabbix、Ganglia监控原理,文章最后还有视频教程哦,从零敲出来的全过程思路分为下面几块:获取内存监控信息。

存储监控信息数据展现后续扩展 加主机名,monitor部署在多台机器,不直接插入数据库增加CPU,Disk监控通过HTTP请求的方式,启用一个单独的Flask专门存储monitor数据思路图:

10min 手写一个内存监控系统插图

第一步:获取内存信息我们通过读取 /proc/meminfo获取监控数据MemTotal、MemFree、Buffers、Cached,咱们常用free -m 其实也是读取的/pro/meminfo的数据,顺便说一下

对于操作系统来说,Buffers、Cached是已经被使用的MemFree=total-used对于应用程序来说MemFree=buffers+cached+free监控物理内存使用内存使用=MemTotal-MemFree-Buffers-Cached

开撸:monitor.py获取监控数据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/1024while True:time.sleep(1)getMem()测试:每秒打印一条数据[www.51reboot.com@teachmemory]$ python mointor.py

29202919291929192919希望内存多变好一些,写了一个很挫的测试代码# test.pys = www.51reboot.com*1000000for i in s: for j in s:

s.count(j)执行python test.py,会发现内存占用多了几M,说明咱们的代码是OK的第二步:存储监控信息(我们用MySQL)我们需要两个字段,内存和时间 sql呼之欲出,简单粗暴create database memory;

create memory(memory int,timeint)接下来我们把monitor.py的数据存储到数据库中,这用到了Python MySQLdb模块import timeimport 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/1024while True:time.sleep(1)getMem()暂时告一段落第三步:数据展现(Flask框架)代码结构.├── flask_web.py web后端代码

├── mointor.py 监控数据获取├── static 静态文件,第三方图表库│ ├── exporting.js│ ├── highstock.js│ └── jquery.js├── templates

│ └── index.html 展示前端页面└── test.py 占用内存的测试代码flask_web.py的代码如下提供两个路由 根目录渲染文件index.html/data路由去数据库查数据,返回json,供画图使用

from flask import Flask,render_template,requestimport MySQLdb as mysqlcon = 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 memorycur.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

$(function () {

// 使用当前时区,否则东八区会差八个小时Highcharts.setOptions({global: {useUTC: false}});$.getJSON(/data, function (data) {

// Create the chart$(#container).highcharts(StockChart, {rangeSelector : {selected : 1},title : {text : 内存数据

},series : [{name : 本机内存,data : data,tooltip: {valueDecimals: 2}}]});});});执行python flask_web.py,浏览器看数据www.51reboot.com:9092,

出图了

10min 手写一个内存监控系统插图1

我们并不仅限于此,如果想实时的看到内存,应该怎么搞查询数据时候增加一个时间戳当限制条件,只返回两次查询之间的增量数据前端动态添加增量结点数据到图表中修改flask_web.pytmp_time = 0@app.route(/data)

def data():global tmp_timeif tmp_time>0:sql = select * from memory where time>%s % (tmp_time/1000)else:

sql = select * from memorycur.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秒查一次增量数据,根据自己需求调整,修改index.html$.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! 效果

10min 手写一个内存监控系统插图2

后边改了这么多,大家可能糊涂了,现在给出完整代码:完整代码大家可以从Github下载https://github.com/shengxinjing/my_blog/issues/1视频下载地址:http://pan.baidu.com/s/1i4acpP7

录屏的时候网出问题了,所以录了两个在线视频1在线视频2

免责声明:文章内容不代表本站立场,本站不对其内容的真实性、完整性、准确性给予任何担保、暗示和承诺,仅供读者参考,文章版权归原作者所有。如本文内容影响到您的合法权益(内容、图片等),请及时联系本站,我们会及时删除处理。

作者: 3182235786a

为您推荐

linux文件命令

linux文件命令

在 Linux 中,我们可以使用 `with open()` 语句和 `write()` 函数来写入文件。以下是一个简单...
linux的命令

linux的命令

以下是一个简单的 Linux 命令示例,该命令将显示当前日期和时间: “`c #include <st...
linux 命令

linux 命令

由于 Linux 命令是由 C 语言编写的,因此下面是一个简单的用中文编写的 Linux 命令示例,它将输出“Hello...
linux命令tar

linux命令tar

这个问题看起来有些模糊,我不确定您是想了解如何在 Linux 系统中使用 tar 命令,还是如何编写一个名为 tar 的...
linux压缩命令

linux压缩命令

Linux压缩命令:高效管理文件和目录 Linux操作系统提供了一系列强大的压缩命令,使您能够高效地管理文件和目录。无论...

发表回复

返回顶部