Linux MemFree与MemAvailable的区别

简介:

  最近在做Prometheus的监控,结合Grafana做前端展示,其中涉及到内存的时候,有不少人对Memory Free和Memory Avaliable这两个参数比较疑惑,这里我结合linux下常用的查看内存使用情况的free命令,做下解答整理。

  Linux查看内存使用情况,可以查看/proc/meminfo和使用free命令。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
root@prometheus-01:~ # 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的输出结果,这里有几个计算公式:

1
2
3
4
5
root@prometheus-02:~ # 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



      本文转自Jx战壕  51CTO博客,原文链接:http://blog.51cto.com/xujpxm/1961072,如需转载请自行联系原作者






相关文章
|
29天前
|
存储 Unix Linux
Linux 下文件和目录的本质区别和组成
Linux 下文件和目录的本质区别和组成
36 0
|
29天前
|
Linux API 调度
Linux系统驱动跟裸机驱动的区别
Linux系统驱动跟裸机驱动的区别
27 0
|
1月前
|
Oracle 关系型数据库 Linux
Linux下 su命令与su - 命令有什么区别?
Linux下 su命令与su - 命令有什么区别?
27 0
|
2月前
|
弹性计算 运维 安全
阿里云服务器Windows和Linux操作系统区别对比
阿里云服务器Windows和Linux操作系统区别对比,性能有差异吗?有,同配置下Linux性能要优于Windows,但这与阿里云无关,仅仅是linux和windows之间的区别。另外,阿里云提供的windows和linux操作系统均为正版授权,用户不需要额外支付许可费用,如何选择?看用户自己的应用程序情况。
|
29天前
|
运维 网络协议 Unix
Linux终端(Terminal)与控制台(Console)的区别
Linux终端(Terminal)与控制台(Console)的区别
26 0
|
4月前
|
Unix Linux Shell
Linux下vi与vim命令使用与区别
Linux下vi与vim命令使用与区别
97 0
|
1月前
|
Unix Linux 索引
Linux 基础解惑:Linux 下文件描述符标志和文件描述符状态标志,文件状态标志,文件状态之间的区别
Linux 基础解惑:Linux 下文件描述符标志和文件描述符状态标志,文件状态标志,文件状态之间的区别
21 0
|
1月前
|
编解码 Unix Linux
【Linux C/C++ 延时(延迟)函数比较】介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景
【Linux C/C++ 延时(延迟)函数比较】介绍Linux系统中常用的延时函数sleep、usleep、nanosleep、select和std::sleep_for()的区别和使用场景
30 1
|
1月前
|
Oracle Ubuntu Unix
Unix与Linux区别
Unix: Unix是一个操作系统家族的名称,最早由贝尔实验室(Bell Labs)的肖像电机公司(AT&T)开发。最早的Unix版本是在1969年创建的。 Linux: Linux是由芬兰计算机科学家Linus Torvalds在1991年创建的。它是作为一个免费、开放源代码的Unix克隆而开始的。
19 1
|
2月前
|
安全 Linux 数据安全/隐私保护
Linux命令 su 和 sudo 的区别
【2月更文挑战第5天】
33 0
Linux命令 su 和 sudo 的区别