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

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介:

本文的目的在于,尽可能用简单的代码,让大家了解内存监控的原理及思想,更容易去理解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
相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
目录
相关文章
|
21天前
|
运维 监控 安全
构建高效运维体系:从监控到自动化的全方位实践
本文深入探讨了构建高效运维体系的关键要素,从监控、日志管理、自动化工具、容器化与微服务架构、持续集成与持续部署(CI/CD)、虚拟化与云计算以及安全与合规等方面进行了全面阐述。通过引入先进的技术和方法,结合实际案例和项目经验,为读者提供了一套完整的运维解决方案,旨在帮助企业提升运维效率,降低运营成本,确保业务稳定运行。
|
25天前
|
缓存 Java 测试技术
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
使用JMeter对项目各个接口进行压力测试,并对前端进行动静分离优化,优化三级分类查询接口的性能
谷粒商城笔记+踩坑(11)——性能压测和调优,JMeter压力测试+jvisualvm监控性能+资源动静分离+修改堆内存
|
4天前
|
运维 监控 大数据
高效运维管理:提升系统稳定性的策略与实践
在当今信息技术飞速发展的时代,运维管理作为保障系统稳定运行的关键环节,其重要性不言而喻。本文将深入探讨如何通过优化运维流程、引入自动化工具和建立完善的监控体系等策略,来有效提升系统的稳定性。同时,结合具体实践案例,分析这些策略在实际工作中的应用效果,为运维人员提供有益的参考和启示。
26 6
|
7天前
|
运维 负载均衡 监控
提升系统性能:高效运维的秘密武器——负载均衡技术
在当今数字化时代,系统的高可用性和高性能成为各类企业和组织追求的目标。本文旨在探讨负载均衡技术在运维工作中的关键作用,通过深入分析其原理、类型及实际应用案例,揭示如何利用这项技术优化资源分配,提高系统的响应速度和可靠性,确保用户体验的稳定与流畅。无论是面对突如其来的高流量冲击,还是日常的运维管理,负载均衡都展现出了不可或缺的重要性,成为现代IT架构中的基石之一。
23 4
|
19天前
|
运维 监控 安全
高效运维管理:提升系统可靠性的策略与实践
本文将深入探讨高效运维管理的关键策略和实践,旨在帮助运维团队提高系统的可靠性、可用性和稳定性。通过分析常见的运维挑战,提出相应的解决方案,并结合实际案例进行说明,为读者提供一套行之有效的运维管理指南。无论是新手还是经验丰富的运维工程师,都能从中获得有价值的见解和实用技巧。
|
23天前
|
存储 运维 监控
构建高效运维体系:从监控到自动化的全方位实践指南
在当今数字化时代,企业对运维(Operations)的需求日益增长。运维不仅仅是保持系统运行那么简单,它涉及到监控、日志管理、故障排除、性能优化和自动化等多个层面。本文将从实际操作的角度出发,详细探讨如何构建一个高效的运维体系。通过具体案例,我们将了解不同运维工具和方法的应用,以及它们是如何帮助企业提高生产效率和降低运营风险的。无论你是刚接触运维的新手,还是经验丰富的专家,这篇文章都将为你提供宝贵的参考和启示。
|
23天前
|
监控 Ubuntu API
Python脚本监控Ubuntu系统进程内存的实现方式
通过这种方法,我们可以很容易地监控Ubuntu系统中进程的内存使用情况,对于性能分析和资源管理具有很大的帮助。这只是 `psutil`库功能的冰山一角,`psutil`还能够提供更多关于系统和进程的详细信息,强烈推荐进一步探索这个强大的库。
31 1
|
25天前
|
Arthas 监控 Java
监控线程池的内存使用情况以预防内存泄漏
监控线程池的内存使用情况以预防内存泄漏
|
26天前
|
运维 Cloud Native Devops
云原生架构的崛起与实践云原生架构是一种通过容器化、微服务和DevOps等技术手段,帮助应用系统实现敏捷部署、弹性扩展和高效运维的技术理念。本文将探讨云原生的概念、核心技术以及其在企业中的应用实践,揭示云原生如何成为现代软件开发和运营的主流方式。##
云原生架构是现代IT领域的一场革命,它依托于容器化、微服务和DevOps等核心技术,旨在解决传统架构在应对复杂业务需求时的不足。通过采用云原生方法,企业可以实现敏捷部署、弹性扩展和高效运维,从而大幅提升开发效率和系统可靠性。本文详细阐述了云原生的核心概念、主要技术和实际应用案例,并探讨了企业在实施云原生过程中的挑战与解决方案。无论是正在转型的传统企业,还是寻求创新的互联网企业,云原生都提供了一条实现高效能、高灵活性和高可靠性的技术路径。 ##
38 3
|
25天前
|
监控 数据可视化 Java
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况
使用JDK自带的监控工具JConsole来监控线程池的内存使用情况