这篇文章给大家介绍Linux实际内存占用率算法以及如何使用Python实现内存监控,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。
这两天我们的一个核心系统,一套集群,逐台开始报警,内容是内存占用超阈值。按说这应该是一个非常紧急且需要立即处理的报警,但实际是不是这样,待我们拨云见日。
以下为模拟实验,
了解了下监控系统这条内存占用超阈值报警的计算方法,是用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第三方库,则更为简便。
关于Linux实际内存占用率算法以及如何使用Python实现内存监控就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。