前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Linux实际内存占用率算法,以及使用Python实现内存监控

Linux实际内存占用率算法,以及使用Python实现内存监控

作者头像
bisal
发布2019-01-29 16:24:41
4.5K0
发布2019-01-29 16:24:41
举报

这两天我们的一个核心系统,一套集群,逐台开始报警,内容是内存占用超阈值。按说这应该是一个非常紧急且需要立即处理的报警,但实际是不是这样,待我们拨云见日。

以下为模拟实验,

了解了下监控系统这条内存占用超阈值报警的计算方法,是用used/total*100%=1949/1988*100%=98%,即内存占用量超过了98%。

网上学习了一番,其实这种计算方法不很准确,原因就是Linux的内存管理机制和Windows是不相同的,我理解Linux管理内存的特点,其中之一就是充分利用内存,网上这方面的资料,非常容易检索,我就不班门弄斧了。从MOS上看见了一些文章,直接或间接说明了这个问题,

(1) Memory Not Being Released In Linux Top After The MDEX Engine Is Shut Down (文档 ID 2045288.1)

问题是说为什么关闭了软件,从top中没有看见应用的释放内存?他的解释是,这是正常现象,top指令的memory部分展示的RAM是“缓存”的部分。这些缓存的部分表示磁盘中最近使用的数据且临时被存入RAM了。当停止一个应用程序的时候,不会“释放内存”,一旦重启应用,这些信息在缓存之中,可以提高性能。然而,如果关闭了应用程序许久,其他的进程需要这些内存,则可以无缝地使用这些内存。操作系统会回收尽可能少的数据段,分配给新的进程。

(2) Summary Area in top output Shows Low Free Memory (文档 ID 460141.1)

Unix系统已经做了一些优化,可以充分利用所有可以使用的资源。不被代码或数据使用的内存资源会被OS用于各种用途。top指令输出中的汇总部分,未说明内核和用户进程的内存,单独看空闲的内存量非常低,并不能说明内存使用问题。未被进程使用的内存会被操作系统用来缓存一些最近访问过,而且不久的将来会被再次使用的数据,但若有一些更重要的进程需要这些内存,是可以非常轻松地释放出来。

那么真实的内存占用率,应该如何计算?

首先我们说下free输出中,buffers和cached的区别。参考(http://blog.chinaunix.net/uid-24709751-id-3564801.html)给出的buffers和cached的区别说明,

(a) buffers是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages。cached是用来给文件做缓冲。 (b) buffers是用来存储目录里面有什么内容,权限等等。而cached直接用来记忆我们打开的文件,比如先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。而buffers随时都在增加,比如先后两次使用ls /dev后,就会发现第二次执行的速度会较第一次快。

从不同角度,对内存占用率有不同的理解,以下图为例,

(1) 站在操作系统的角度,buffer和cache的内存是属于分配的内存,因此内存占用率计算方法=used/total*100%。

(2) 站在使用者的角度上看,buffer和cache的内存是可以被重用的,因此内存占用率计算方法=(used-buffers-cached)/total*100%。

因此对于开始的问题,我们关注的是应用可用内存,所以我们需要监控关注的内存实际占用率应该为,

(used-buffers-cached)/total*100%=(1949-99-1053)/1988*100%=40%,

再进一步,关于如何监控内存使用,无论从网上的资料,还是实际的工作经验,都会有各种不同的方法,这儿我只是简单说一下,如何使用Python监控内存使用率。

(1) 不使用任何第三方库实现

思路很简单,就是执行free指令,解析回显,得出used、buffers、cached、total这些参数值,再进行计算。

output = os.popen('free -m')

output.readline()

line = ','.join(output.readline().split()).split(',')

total = float(line[1])

used = float(line[2])

buffers = float(line[5])

cached = float(line[6])

percent = int(round((used - buffers - cached) / total * 100))

结果向上取整,例如25%,注意需要使用float浮点型,否则计算percent的时候未乘以100前就已经是0了。

(2) 使用第三方库psutil

psutil是一个跨平台的进程管理,首先需要安装,psutil安装之前需要安装python-devel,均需要root用户,我的操作系统是Linux 6.5,Python版本2.6.6,这两个包的版本则为

(a) python-devel-2.6.6-51.el6.x86_64.rpm

(b) psutil-2.0.0

使用第三方库,这问题就非常容易了,

import psutil percent = mem.percent

这里的mem.percent=(mem.total - mem.available) / mem.total * 100,其中mem.available=mem.free + mem.buffers + mem.cached,和(1)中计算方法是一致的。

其实psutil可以执行几乎所有,系统监控相关的指令操作,

Github地址,https://github.com/giampaolo/psutil/

这篇文章的介绍非常清晰,http://www.jianshu.com/p/64e265f663f6

psutil(Python system and process utilities)是一个跨平台的进程管理和系统工具的python库,可以处理系统CPU,memory,disks,network等信息。主要用于系统资源的监控,分析,以及对进程进行一定的管理。通过psutil可以实现如ps,top,lsof,netstat,ifconfig, who,df,kill,free,nice,ionice,iostat,iotop,uptime,pidof,tty,taskset,pmap。在Linux,windows,OSX,freebsdSun Solaris等系统上工作,最新的版本python是要高于2.6(Python 2.4 Python2.5 可以用2.1.3版本)

总结:

1. Linux下实际我们关注的是,系统可用内存的占用率,计算方法为(used-buffers-cached)/total*100%,并不是执行free指令中free显示的部分。

2. 内存占用率监控Python实现,可以使用执行free指令来解析输出,若可以使用psutil第三方库,则更为简便。

如果您觉得此篇文章对您有帮助,欢迎关注微信公众号:bisal的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017年07月20日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档