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

网友投稿 582 2023-03-17

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。

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

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

思路分为下面几块:

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

思路图:

第一步:获取内存信息

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

对于操作系统来说,Buffers、Cached是已经被使用的

MemFree=total-used

对于应用程序来说

MemFree=buffers+cached+free

监控物理内存使用

内存使用=MemTotal-MemFree-Buffers-Cached

内存使用=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-cacheprint mem_use/1024while True:time.sleep(1)getMem()

测试:每秒打印一条数据

希望内存多变好一些,写了一个很挫的测试代码

执行python test.py,会发现内存占用多了几M,说明咱们的代码是OK的

第二步:存储监控信息(我们用MySQL)

我们需要两个字段,内存和时间 sql呼之欲出,简单粗暴

create database memory;create memory(memory int,time int)

接下来我们把monitor.py的数据存储到数据库中,这用到了Python MySQLdb模块

暂时告一段落

第三步:数据展现(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,供画图使用

前端index.html

查询数据时候增加一个时间戳当限制条件,只返回两次查询之间的增量数据前端动态添加增量结点数据到图表中

修改flask_web.py

tmp_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 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秒查一次增量数据,根据自己需求调整,修改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! 效果

后边改了这么多,大家可能糊涂了,现在给出完整代码:

完整代码大家可以从Github下载

录屏的时候网出问题了,所以录了两个

在线视频1

在线视频2

上一篇:Linux系统教程:挽救模式破解root密码
下一篇:国际黑客组织将安倍个人官网瘫痪 要求停止捕鲸
相关文章

 发表评论

暂时没有评论,来抢沙发吧~