最近有个项目需要对内存平均占用率进行打点,Linux下内存相关信息可以执行从/proc/meminfo文件中获取,如下:
flycatorg@flycatorg:~$ cat /proc/meminfo
MemTotal: 509448 kB
MemFree: 23816 kB
Buffers: 172636 kB
Cached: 151636 kB
SwapCached: 0 kB
Active: 123484 kB
Inactive: 335476 kB
Active(anon): 57340 kB
Inactive(anon): 82664 kB
Active(file): 66144 kB
Inactive(file): 252812 kB
Unevictable: 8 kB
Mlocked: 8 kB
HighTotal: 0 kB
HighFree: 0 kB
LowTotal: 509448 kB
LowFree: 23816 kB
SwapTotal: 409616 kB
SwapFree: 409616 kB
Dirty: 0 kB
Writeback: 0 kB
AnonPages: 134696 kB
Mapped: 55304 kB
Slab: 16508 kB
SReclaimable: 10076 kB
SUnreclaim: 6432 kB
PageTables: 2220 kB
NFS_Unstable: 0 kB
Bounce: 0 kB
WritebackTmp: 0 kB
CommitLimit: 664340 kB
Committed_AS: 423668 kB
VmallocTotal: 503864 kB
VmallocUsed: 19020 kB
VmallocChunk: 479952 kB
HugePages_Total: 0
HugePages_Free: 0
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 4096 kB
DirectMap4k: 12224 kB
DirectMap4M: 512000 kB
计算内存占用率,需要使用MemTotal、MemFree、Buffers和Cached四项指标。
内存平均占用率 = 100 * (1 - 空闲内存/总内存),总内存就是MemTotal,主要是空闲内存的计算方法,最常见的错误认识MemFree就是空闲内存。
查阅了网上的各种说法,大家普遍认可的空闲内存计算方法为:若Cached大于MemTotal,空闲内存为MemFree;否则空闲内存为MemFree+Buffers+Cached。
其实关于这个,我们通过free命令可以也可以得出结论:
flycatorg@flycatorg:~$ free -k
total used free shared buffers cached
Mem: 509448 485660 23788 0 172636 151636
-/+ buffers/cache: 161388 348060
Swap: 409616 0 409616
flycatorg@flycatorg:~$
第一行:内存的相关指标,其中total = used + free
第二行:内存实际使用情况,其中free = 第一行的 (free + buffers + cached),因为分配了的buffers和cahce,不一定都被在使用,还是可以被回收的。
至于Cached大于MemTotal的场景,目前还没有彻底搞清楚,大概意思是:任何块设备都可以做Cache,当频繁访问某一个大文件时,Cahced就会很大,有时候会是好几个G,此时Cahced占用的应该不是内存。
——这个还是等我彻底搞清楚了再写吧。