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

  1. 云栖社区>
  2. 博客>
  3. 正文

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

bisal 2017-07-20 00:07:51 浏览894
展开阅读全文

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


以下为模拟实验,


了解了下监控系统这条内存占用超阈值报警的计算方法,是用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的个人杂货铺,您的支持是对我最大的鼓励!共同学习,共同进步:)

网友评论

登录后评论
0/500
评论
bisal
+ 关注