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

思路分为下面几块:

1.获取内存监控信息

2.存储监控信息

3.数据展现

4.后续扩展

1.加主机名,monitor部署在多台机器,不直接插入数据库

2. 增加CPU,Disk监控

3. 通过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

开撸: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/1024
while True:
time.sleep(1)
getMem()

测试:每秒打印一条数据

[www.51reboot.com@teach memory]$ python mointor.py 2920
2919
2919
2919
2919

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

# test.py
s = 'www.51reboot.com'*1000000
for i in s:
for j in s:
s.count(j)

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

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

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

create database memory;

create memory(memory int,time int)

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

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

while True:
time.sleep(1)
getMem()

暂时告一段落

第三步:数据展现(Flask框架)

代码结构

├── flask_web.py web后端代码
├── mointor.py 监控数据获取
├── static 静态文件,第三方图表库
│ ├── exporting.js
│ ├── highstock.js
│ └── jquery.js
├── templates
│ └── index.html 展示前端页面
└── test.py 占用内存的测试代码

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

<div id="container" style="height: 400px; min-width: 310px"></div>
<script>
$(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
}
}]
});
});
});
</script>

执行python flask_web.py,浏览器看数据www.51reboot.com:9092,出图了

我们并不仅限于此,如果想实时的看到内存,应该怎么搞

1.查询数据时候增加一个时间戳当限制条件,只返回两次查询之间的增量数据

2.前端动态添加增量结点数据到图表中

修改flask_web.py

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

https://github.com/shengxinjing/my_blog/issues/1

视频下载地址:http://pan.baidu.com/s/1i4acpP7

Python学习交流群:238757010

10min 手写一个内存监控系统的更多相关文章

  1. 用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

  2. [转]用python 10min手写一个简易的实时内存监控系统

    简易的内存监控系统 本文需要有一定的python和前端基础,如果没基础的,请关注我后续的基础教程系列博客 文章github源地址,还可以看到具体的代码,喜欢请在原链接右上角加个star 腾讯视频链接 ...

  3. 微信团队原创分享:iOS版微信的内存监控系统技术实践

    本文来自微信开发团队yangyang的技术分享. 一.前言 FOOM(Foreground Out Of Memory),是指App在前台因消耗内存过多引起系统强杀.对用户而言,表现跟crash一样. ...

  4. 搞定redis面试--Redis的过期策略?手写一个LRU?

    1 面试题 Redis的过期策略都有哪些?内存淘汰机制都有哪些?手写一下LRU代码实现? 2 考点分析 1)我往redis里写的数据怎么没了? 我们生产环境的redis怎么经常会丢掉一些数据?写进去了 ...

  5. 教你如何使用Java手写一个基于链表的队列

    在上一篇博客[教你如何使用Java手写一个基于数组的队列]中已经介绍了队列,以及Java语言中对队列的实现,对队列不是很了解的可以我上一篇文章.那么,现在就直接进入主题吧. 这篇博客主要讲解的是如何使 ...

  6. 利用SpringBoot+Logback手写一个简单的链路追踪

    目录 一.实现原理 二.代码实战 三.测试 最近线上排查问题时候,发现请求太多导致日志错综复杂,没办法把用户在一次或多次请求的日志关联在一起,所以就利用SpringBoot+Logback手写了一个简 ...

  7. 看年薪50W的架构师如何手写一个SpringMVC框架

    前言 做 Java Web 开发的你,一定听说过SpringMVC的大名,作为现在运用最广泛的Java框架,它到目前为止依然保持着强大的活力和广泛的用户群. 本文介绍如何用eclipse一步一步搭建S ...

  8. 剖析手写Vue,你也可以手写一个MVVM框架

    剖析手写Vue,你也可以手写一个MVVM框架# 邮箱:563995050@qq.com github: https://github.com/xiaoqiuxiong 作者:肖秋雄(eddy) 温馨提 ...

  9. webview的简单介绍和手写一个H5套壳的webview

    1.webview是什么?作用是什么?和浏览器有什么关系? Webview 是一个基于webkit引擎,可以解析DOM 元素,展示html页面的控件,它和浏览器展示页面的原理是相同的,所以可以把它当做 ...

随机推荐

  1. 文件夹名为单字符时右击弹出C++错误

    原因:操作系统安装有虚拟光驱软件——WinMount,此错误为WinMount的一个Bug 解决方法: 打开Windows注册表,定位此注册表并删除即可 [HKEY_CLASSES_ROOT\Dire ...

  2. 铁乐学Python_day04-列表LIST

    文:铁乐与猫 2018-3-21 Python内置的一种数据类型是列表:list. list是一种有序的集合,可以随时添加和删除其中的元素. 序列中的每个元素都分配一个数字(下标) - 它的位置,或索 ...

  3. 获取 docker 容器(container)的 ip 地址

    获取单个IP docker inspect --format '{{ .NetworkSettings.IPAddress }}'  <container-ID> 获取所有容器IP doc ...

  4. scrapy爬虫框架之Xpath选择器

    问题: 本篇博文主要记录scrapy框架爬取伯乐在线文章的相关知识,在实践中学习对框架的理解.今天主要记录了xpath的相关用法以及语法规范. ----->>>点击进入爬取页面 一. ...

  5. SQL触发器与CLR的使用

    在数据库的日常操作中,面对复杂业务的情况下,总会有用sql语句或存储过程不是那么方便的时候,所以这时候就会想到在数据库中调用CLR,也就是调用程序集,此处用C#实现来讲解一个测试案例 测试案例的业务是 ...

  6. MongoDb 物理位置应用实现

    1代码实现 官方驱动2.7版本 1.1范围查找 /// <summary> /// 半径范围查找位置信息 /// </summary> /// <param name=& ...

  7. 【转】Android SDK,ADT,API 版本的对应关系

    写对应关系之前,先了解一下几个名字的含义. 一. Android ADT: 按照官方网站的开发介绍:Android Development Tools (ADT) is a plugin for th ...

  8. 记一次ajax交互问题

    问题描述:仍然在表单中,像往常一样,异步获取表单内所有输入框的信息,点击提交,确实也走了后台,但是结果却走了ajax的error.这一点使我当时非常疑惑,为什么会走error呢? 一般走error的原 ...

  9. php后台+前端开发过程整理

    一.PHP后台从数据库中获取数据 1. 建立数据库连接: //在本项目中封装了数据库的各种操作 $dbConn = $this->_createMysqlConn(); 2. 执行sql语句 $ ...

  10. (转)使用 Nmon 监控 Linux 的系统性能

    看到一个使用Nmon的文章,写的很基础,适合新手,转载之.下面是原文的信息: 作者:Hitesh Jethva 译者:sonofelice 校对:wxy 传送门:linux.cn/article-68 ...