运维高手十分钟写了一个内存监控系统

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

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

思路分为下面几块:

1.获取内存监控信息

2.存储监控信息

3.数据展现

4.后续扩展

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

    b.增加CPU,Disk监控

    c.通过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获取监控数据。

 
 
  1. def getMem(): 
  2. with open('/proc/meminfo'as f: 
  3. total = int(f.readline().split()[1]) 
  4. free = int(f.readline().split()[1]) 
  5. buffers = int(f.readline().split()[1]) 
  6. cache = int(f.readline().split()[1]) 
  7. mem_use = total-free-buffers-cache 
  8. print mem_use/1024 
  9. while True
  10. time.sleep(1) 
  11. getMem() 

测试:每秒打印一条数据。

 
 
  1. [www.51reboot.com@teach memory]$ python mointor.py 2920 
  2.  2919 
  3.  2919 
  4.  2919 
  5.  2919 

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

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

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

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

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

 
 
  1. create database memory; 
  2. create memory(memory int,time int

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

 
 
  1. import time 
  2. import MySQLdb as mysql 
  3. db = mysql.connect(user="reboot",passwd="reboot123",db="memory",host="localhost"
  4. db.autocommit(True
  5. cur = db.cursor() 
  6. def getMem(): 
  7. with open('/proc/meminfo'as f: 
  8. total = int(f.readline().split()[1]) 
  9. free = int(f.readline().split()[1]) 
  10. buffers = int(f.readline().split()[1]) 
  11. cache = int(f.readline().split()[1]) 
  12. mem_use = total-free-buffers-cache 
  13. t = int(time.time()) 
  14. sql = 'insert into memory (memory,time) value (%s,%s)'%(mem_use/1024,t) 
  15. cur.execute(sql) 
  16. print mem_use/1024 
  17. while True
  18. time.sleep(1) 
  19. 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,供画图使用。

 
 
  1. from flask import Flask,render_template,request 
  2. import MySQLdb as mysql 
  3. con = mysql.connect(user='reboot',passwd='reboot123',host='localhost',db='memory'
  4. con.autocommit(True
  5. cur = con.cursor() 
  6. app = Flask(__name__) 
  7. import json 
  8. @app.route('/'
  9. def index(): 
  10. return render_template('index.html'
  11. @app.route('/data'
  12. def data(): 
  13. sql = 'select * from memory' 
  14. cur.execute(sql) 
  15. arr = [] 
  16. for i in cur.fetchall(): 
  17. arr.append([i[1]*1000,i[0]]) 
  18. return json.dumps(arr) 
  19. if __name__=='__main__'
  20. app.run(host='0.0.0.0',port=9092,debug=True

前端index.html

 
 
  1. <div id="container" style="height: 400px; min-width: 310px"></div> 
  2. <script> 
  3. $(function () { 
  4. // 使用当前时区,否则东八区会差八个小时 
  5. Highcharts.setOptions({ 
  6. global: { 
  7. useUTC: false 
  8. }); 
  9. $.getJSON('/data'function (data) { 
  10. // Create the chart 
  11. $('#container').highcharts('StockChart', { 
  12. rangeSelector : { 
  13. selected : 1 
  14. }, 
  15. title : { 
  16. text : '内存数据' 
  17. }, 
  18. series : [{ 
  19. name : '本机内存'
  20. data : data, 
  21. tooltip: { 
  22. valueDecimals: 2 
  23. }] 
  24. }); 
  25. }); 
  26. }); 
  27. </script> 

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

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

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

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

修改flask_web.py。

 
 
  1. tmp_time = 0 
  2. @app.route('/data'
  3. def data(): 
  4. global tmp_time 
  5. if tmp_time>0: 
  6. sql = 'select * from memory where time>%s' % (tmp_time/1000) 
  7. else
  8. sql = 'select * from memory' 
  9. cur.execute(sql) 
  10. arr = [] 
  11. for i in cur.fetchall(): 
  12. arr.append([i[1]*1000,i[0]]) 
  13. if len(arr)>0: 
  14. tmp_time = arr[-1][0] 
  15. return json.dumps(arr) 

前端,3秒查一次增量数据,根据自己需求调整,修改index.html。

 
 
  1. $.getJSON('/data'function (data) { 
  2. // Create the chart 
  3. $('#container').highcharts('StockChart', { 
  4. chart:{ 
  5. events:{ 
  6. load:function(){ 
  7. var series = this.series[0] 
  8. setInterval(function(){ 
  9. $.getJSON('/data',function(res){ 
  10. $.each(res,function(i,v){ 
  11. series.addPoint(v) 
  12. }) 
  13. }) 
  14. },3000) 
  15. }, 
  16. rangeSelector : { 
  17. selected : 1 
  18. }, 
  19. title : { 
  20. text : 'AAPL Stock Price' 
  21. }, 
  22. series : [{ 
  23. name : 'AAPL'
  24. data : data, 
  25. tooltip: { 
  26. valueDecimals: 2 
  27. }] 
  28. }); 
  29. }); 

done!两个文件都搞定,double kill!效果。



作者:Reboot
来源:51CTO
相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
3月前
|
存储 JSON 运维
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
【运维】Powershell 服务器系统管理信息总结(进程、线程、磁盘、内存、网络、CPU、持续运行时间、系统账户、日志事件)
49 0
|
运维 算法 调度
干货演讲!龙蜥自动化运维平台SysOM 2.0调度、内存相关诊断功能介绍 | 第 70-71 期
了解内存诊断相关功能使用、可能的异常类型和发生异常后的后续动作。提供案例展示,方便用户理解可应用场景。
干货演讲!龙蜥自动化运维平台SysOM 2.0调度、内存相关诊断功能介绍 | 第 70-71 期
|
缓存 算法 Java
十分钟掌握JVM内存分配、垃圾收集器和常用参数
十分钟掌握JVM内存分配、垃圾收集器和常用参数
123 0
十分钟掌握JVM内存分配、垃圾收集器和常用参数
|
存储 运维 Ubuntu
linux命令运维技巧1-3(虚拟机/主机,加硬盘内存到指定位置目录)
linux命令运维技巧1-3(虚拟机/主机,加硬盘内存到指定位置目录)
125 0
linux命令运维技巧1-3(虚拟机/主机,加硬盘内存到指定位置目录)
|
SQL 运维 Go
sql server 运维时CPU,内存,操作系统等信息查询(用sql语句)
原文:sql server 运维时CPU,内存,操作系统等信息查询(用sql语句) 我们只要用到数据库,一般会遇到数据库运维方面的事情,需要我们寻找原因,有很多是关乎处理器(CPU)、内存(Memory)、磁盘(Disk)以及操作系统的,这时我们就需要查询他们的一些设置和内容,下面讲的就是如何查询它们的相关信息。
1070 0
|
运维 Oracle 关系型数据库
《Oracle高性能自动化运维》一一1.4 Linux内存体系与Oracle内存空间
本节书摘来自华章出版社《Oracle高性能自动化运维》一 书中的第1章,第1. 5节,作者:冷菠  著 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1309 0
|
Oracle 关系型数据库 Linux
《Oracle高性能自动化运维》一一1.3 Linux内存体系的优势
本节书摘来自华章出版社《Oracle高性能自动化运维》一 书中的第1章,第1. 3节,作者:冷菠  著 ,更多章节内容可以访问云栖社区“华章计算机”公众号查看。
1155 0