linux系统内存实际使用率
图中的例子很典型,就是:多数的linux系统在free命令后会发现free(剩余)的内存很少,而自己又没有开过多的程序或服务。对于上述的情况,正确的解释是:linux
的内存管理机制与windows的有所不同。具体的机制我们无需知道,我们需要知道的是,linux的内存管理机制的思想包括(不敢说就是)内存利用率最
大化。内核会把剩余的内存申请为cached,而cached不属于free范畴。当系统运行时间较久,会发现cached很大,对于有频繁文件读写操作
的系统,这种现象会更加明显。
直观的看,此时free的内存会非常小,但并不代表可用的内存小,当一个程序需要申请较大的内存时,如果free的内存不够,内核会把部分cached的内存回收,回收的内存再分配给应用程序。所以对于linux系统,可用于分配的内存不只是free的内存,还包括cached的内存(其实还包括buffers)。
1、通过定期采集/proc文件系统内的meminfo文件来获取当前内存使用情况:proc
文件系统是一个伪文件系统,它只存在内存当中,而不占用外存空间。它以文件系统的方式为访问系统内核数据的操作提供接口。用户和应用程序可以通过proc
得到系统的信息,并可以改变内核的某些参数。由于系统的信息,如进程,是动态改变的,所以用户或应用程序读取proc文件时,proc文件系统是动态从系
统内核读出所需信息并提交的采集流程图。/proc/meminfo 信息如下: 需要使用的指标有:MemTotal ,MemFree,Buffers,Cached
MemTotal:总内存大小
MemFree: 空闲内存大小
Buffers和Cached:磁盘缓存的大小Buffers和Cached的区别:buffers 是指用来给块设备做的缓冲大小,他只记录文件系统的metadata以及 tracking in-flight pages.
cached 是用来给文件做缓冲。
buffers 是用来存储目录里面有什么内容,权限等等。
而cached直接用来记忆我们打开的文件,比如先后执行两次命令#man X ,你就可以明显的感觉到第二次的开打的速度快很多。
而buffers随时都在增加,比如先后两次使用ls /dev后,就会发现第二次执行的速度会较第一次快。
这就是buffers/chached的区别。
2、下面分别从操作系统角度和应用程序角度来区别Buffers和Cached使用free命令可以看到
对操作系统来说,Buffers和Cached是已经被使用的(上图Mem:这一行)MemFree=total-used314952=24946552-24631600
对应用程序来说(上图对应-/+ buffers/cache那一行)MemFree=buffers+cached+free19536392=152116+19069324+314952
所以本着监控应用对物理内存使用情况的目的采取如下计算方法:内存使用率(MEMUsedPerc)=100*(MemTotal-MemFree-Buffers-Cached)/MemTotal
在这里为了PatrolAgent的监控性能,采用定期读取/proc/meminfo文件来获取MemTotal ,MemFree,Buffers,Cached这些参数的值
该算法在MEMORY.km中实现。
或者简单的理解如下:
如下显示free是显示的当前内存的使用,-m的意思是M字节来显示内容.我们来一起看看.
$ free
-m total used free shared buffers cached
Mem: 1002 769 232 0 62 421
-/+
buffers/cache: 286 715
Swap: 1153 0 1153
---------------------------
真实内存占用 = used-buffers-cached =
286
-----------------
第一部分Mem行:
total 内存总数: 1002M
used 已经使用的内存数: 769M
free 空闲的内存数: 232M
shared 当前已经废弃不用,总是0
buffers Buffer 缓存内存数: 62M
cached Page 缓存内存数:421M
关系:total(1002M) = used(769M) + free(232M)
第二部分(-/+ buffers/cache):
(-buffers/cache) used内存数:286M (指的第一部分Mem行中的used - buffers -
cached)
(+buffers/cache) free内存数: 715M (指的第一部分Mem行中的free + buffers +
cached)
可见-buffers/cache反映的是被程序实实在在吃掉的内存
而+buffers/cache反映的是可以挪用的内存总数。
内存使用率=[(-buffers/cache)used内存数]/[total 内存总数]=286/1002=28.54
===============================================================
通过看free命令的说明可以发现,free命令的数值是从/proc/meminfo文件重读取的。查看free的源码包查看其源码,明确知道了其中的每个数值的来源(具体内容可查看linux命令free源码解读:Procps free.c)。
有时我们计算内存使用率的时候会读取free命令的回显,但有时也会直接读取文件/proc/meminfo的内容,毕竟free命令的回显数据就是从meminfo文件中获得的。
然而,由于不同的linux发行版,在系统制作过程中会修改部分源码。一般的系统(如Debian)使用free命令和读取meminfo文件两种方式计
算的内存使用率是相同的。但是对于部分系统,如SUSE(并不确定是每个版本的都是,这里指SUSE Enterprise Server
11),其在free命令回显的结果中,cached部分的值并不等于meminfo文件中的cached所显示的值,而是等于meminfo文件中
cached部分和SReclaimable部分之和。
也就是说,debian之类的系统认为:可用内存=free的内存+cached的内存+buffers的内存
而SUSE之类的系统则认为:可用内存=free的内存+cached的内存+buffers的内存+SReclaimable的内存
PS:
什么是SReclaimable?在linux内核中会有许多小对象,这些对象构造销毁十分频繁,比如i-node,dentry。这么这些对象如果每次
构建的时候就向内存要一个页,而其实际大小可能只有几个字节,这样就非常浪费,为了解决这个问题就引入了一种新的机制来处理在同一页框中如何分配小存储器
区,这个机制可以减少申请和释放内存带来的消耗,这些小存储器区的内存称为Slab。meminfo文件中标识了Slab的大小,而
SReclaimable是指可收回Slab的大小。