最近在做Prometheus的监控,结合Grafana做前端展示,其中涉及到内存的时候,有不少人对Memory Free和Memory Avaliable这两个参数比较疑惑,这里我结合linux下常用的查看内存使用情况的free命令,做下解答整理。
Linux查看内存使用情况,可以查看/proc/meminfo和使用free命令。
[email protected]:~# cat /proc/meminfo && free MemTotal: 16433020 kB MemFree: 14714596 kB MemAvailable: 15812952 kB Buffers: 197912 kB Cached: 1020632 kB SwapCached: 0 kB Active: 1168468 kB Inactive: 328608 kB Active(anon): 278888 kB Inactive(anon): 376 kB Active(file): 889580 kB Inactive(file): 328232 kB Unevictable: 0 kB Mlocked: 0 kB SwapTotal: 8388604 kB SwapFree: 8388604 kB Dirty: 36 kB Writeback: 0 kB AnonPages: 278524 kB Mapped: 63220 kB Shmem: 740 kB Slab: 124140 kB SReclaimable: 98956 kB SUnreclaim: 25184 kB KernelStack: 3232 kB PageTables: 3012 kB NFS_Unstable: 0 kB Bounce: 0 kB WritebackTmp: 0 kB CommitLimit: 16605112 kB Committed_AS: 408132 kB VmallocTotal: 34359738367 kB VmallocUsed: 173540 kB VmallocChunk: 34359557144 kB HardwareCorrupted: 0 kB AnonHugePages: 231424 kB CmaTotal: 0 kB CmaFree: 0 kB HugePages_Total: 0 HugePages_Free: 0 HugePages_Rsvd: 0 HugePages_Surp: 0 Hugepagesize: 2048 kB DirectMap4k: 106432 kB DirectMap2M: 4087808 kB DirectMap1G: 14680064 kB total used free shared buffers cached Mem: 16433020 1718720 14714300 740 197912 1020632 -/+ buffers/cache: 500176 15932844 Swap: 8388604 0 8388604
从结果来看,/proc/meminfo里的MemTotal、MemFree、Buffers、Cached是能够分别和free输出结果的“Mem”行一一对应的。
名词解释
这里先解释下几个关键词:
1、MemTotal:内存总数
系统从加电开始到引导完成,BIOS等要保留一些内存,内核要保留一些内存,最后剩下可供系统支配的内存就是MemTotal。这个值在系统运行期间一般是固定不变的。
2、MemFree:空闲内存数
表示系统尚未使用的内存。MemUsed=MemTotal-MemFree就是已被用掉的内存。
3、MemAvailable:可用内存数
应用程序可用内存数。系统中有些内存虽然已被使用但是可以回收的,比如cache/buffer、slab都有一部分可以回收,所以MemFree不能代表全部可用的内存,这部分可回收的内存加上MemFree才是系统可用的内存,即:MemAvailable≈MemFree+Buffers+Cached,它是内核使用特定的算法计算出来的,是一个估计值。它与MemFree的关键区别点在于,MemFree是说的系统层面,MemAvailable是说的应用程序层面。
4、Buffer:缓冲区内存数
5、Cache:缓存区内存数
6、Shared:多个进程共享的内存空间,不常用,暂不讨论。
Buffer与Cache的区别:
这里说下buffer与cache的区别,首先,从字面意义上讲,buffer是缓冲的意思,cache是缓存的意思。举个现实中的例子,比说铁道头上像弹簧一样的东西,就叫缓冲;部署在森林里的存应急物资的保管箱,名叫“Food Cache”,类似一种保存箱。 其次,常见的说法,叫write-buffer和read-cache,buffer一般用作写操作上,cache一般用在读操作上,不过也不是一成不变的; 举例说明,每秒要写100次硬盘,对系统冲击很大,浪费了大量时间在忙着处理开始写和结束写这两件事嘛。用buffer暂存起来,变成每10秒写一次硬盘,对系统的冲击就很小,写入效率高了;Cache 是为了弥补高速设备和低速设备的鸿沟而引入的中间层,最终起到加快取速度的作用。比如你一个很复杂的计算做完了,下次还要用结果,就把结果放手边一个好拿的地方存着,下次不用再算了,加快了数据取用的速度。(可以参考知乎上的回答:https://www.zhihu.com/question/26190832)
计算公式:
参照free的输出结果,这里有几个计算公式:
[email protected]:~# free total used free shared buffers cached Mem: 16433020 1827360 14605660 740 203540 1051400 -/+ buffers/cache: 572420 15860600 Swap: 8388604 0 8388604
为了直观说明,把第2行,Mem的行我这里称作OS Mem,第三行 buffers/cache行,称作APP buffer/cache:
OS Mem total = OS Mem used + OS Mem free
APP buffers/cache used = OS Mem used - OS Mem buffers - OS Mem cached
APP buffers/cache free = OS Mem free + OS Mem buffers + OS Mem cached
APP buffers/cache total = APP buffers/cache used + APP buffers/cache free = OS Mem total