千家信息网

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

发表于:2026-11-01 作者:千家信息网编辑
千家信息网最后更新 2026年11月01日,这篇文章给大家介绍Linux实际内存占用率算法以及如何使用Python实现内存监控,内容非常详细,感兴趣的小伙伴们可以参考借鉴,希望对大家能有所帮助。这两天我们的一个核心系统,一套集群,逐台开始报警,
千家信息网最后更新 2026年11月01日Linux实际内存占用率算法以及如何使用Python实现内存监控

这篇文章给大家介绍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实现内存监控就分享到这里了,希望以上内容可以对大家有一定的帮助,可以学到更多知识。如果觉得文章不错,可以把它分享出去让更多的人看到。

内存 系统 用率 监控 进程 方法 实际 指令 部分 问题 应用 管理 操作系统 内容 数据 版本 第三方 缓存 不同 就是 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网科技公司经营范围 互联网科技资迅 期待互联网科技 天津摩尔互联网科技 上海亿帐通互联网科技 美国互联网前沿科技 上海电发互联网科技有限公司 温州喔噻互联网科技有限公司 互联网系的金融科技公司 重庆威客帮互联网科技 互联网经济与金融科技 湖北码尼互联网科技有限公司电话 彤创互联网科技有限公司 苏州五指互联网络科技有限 西安小鹰速贷互联网科技有限公司 华夏恒生科技与互联网科技 富国互联网科技002692 卡尔迅互联网科技有限公司 福仕德教育科技互联网 互联网时代高科技布局 广州为想互联网科技有限公司 重庆互联网络科技 电子科技大学互联网 融势互联网科技 伴你行互联网科技有限公司 互联网 科技服务平台 移动互联网年度科技创新 深圳育鹏互联网科技有限公司招聘 国大互联网教育科技有限公司工作 保山互联网科技靠谱吗
0