Linux MemFree与MemAvailable的区别

最近在做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

时间: 2024-10-13 02:27:21

Linux MemFree与MemAvailable的区别的相关文章

【转载】LINUX 和 WINDOWS 内核的区别

LINUX 和 WINDOWS 内核的区别 [声明:欢迎转载,转载请注明出自CU ACCESSORY http://linux.chinaunix.net/bbs/thread-1153868-1-1.html] 关于LINUX和WINDOWS的口水站已经很多了.本文企图从技术角度来比较下2个主流操作系统的异同.偏重于内核部分. 一.动机: 我最早是 WINDOWS 阵营的.在WINDOWS下写过2年多的驱动程序.后来由于学习需要,转投LINUX,一晃也快2年了.期间经历了很多曲折,也学到了很多

linux shell中'',""和``的区别

今天学习一个bash脚本,看到有一条:bin=`dirname "$0"` (dirname filename是输出该文件所在的目录,$0是该bash文件的文件名,在bash中一般使用cd `dirname $0`进入该脚本所在的目录中) 我尝试着cat $bin 输出是:. 然后我将反引号``去掉:bin=dirname "$0" 在运行cat $bin后报错. 网上查了一些bash的单引号'',双引号""和反引号``的区别. 单引号''和双引

菜鸟之linux系统中~和/的区别

linux系统中~和/的区别 困扰所在: 菜鸟在学习的过程中创建了一个目录(文件夹),但是不知道此目录所在位置了,也不知道此目录下有那些文件. 原因分析: 经过测试发现可能是创建文件夹的时候没有注意~和/的区别,查看目录和文件的时候没有cd到相应的目录下去. /是根节点,~是home.注意下边$前边字符的不同. 1.root用户登录: /是/ ~是/root/ 2.user登录: /是/ ~ 是 /home/user/ 所以在~下创建的目录或文件应该在/home/user下找,在/下创建的目录或

Linux中终端和控制台区别

Linux中终端和控制台区别: 终端:英文名叫terminal 控制台:英文名叫console 两者区别要从以前的多人使用的计算机开始 以前,由于计算机很昂贵,所用一台计算机一般由多个人同时使用.这样一台计算机上需要连接很多套键盘和显示器供多个人使用.这种只有显示器和键盘能够通过串口连接到计算机的设备就叫终端. 而在计算机里,把那套直接连接在电脑上的键盘和显示器就叫做控制台. 注意控制台和终端的区别.终端是通过串口连接上的,不是计算机本身就有的设备,而控制台是 计算机本身就有的设备,一个计算机只

linux 下 /bin /sbin 的区别 -- (转)

/bin,/sbin,/usr/bin,/usr/sbin区别 /  : this is root directory                root 用户根目录 /bin : commands in this dir are all system installed user commands    系统的一些指令 /sbin:  commands in this dir are all system installed super user commands  超级用户指令 系统管理

linux中yum与rpm区别

linux中yum与rpm区别: 一.源代码形式 1.      绝大多数开源软件都是直接以原码形式发布的 2.      源代码一般会被打成.tar.gz的归档压缩文件 3.      源代码需要编译成为二进制形式之后才能够运行使用 4.      源代码基本编译流程: 1).configure 检查编译环境: 2)make对源代码进行编译: 3)make insall 将生成的可执行文件安装到当前计算机中 二.RPM 1.源代码形式的特点:操作复杂.编译时间长.极易出现问题.依赖关系复杂 2

Linux:su和su-的区别

大部分Linux发行版的默认账户是普通用户,而更改系统文件或者执行某些命令,需要root身份才能进行,这就需要从当前用户切换到root用户.Linux中切换用户的命令是su或su -. 如上图所示,一开始是普通账户,执行userdel时,提示command not found,通过su命令切换到root用户,依旧提示command not found,退出后,重新通过su - 命令,成功实现userdel的命令执行. su命令和su -命令最大的区别就是:前者只是切换了root身份,但Shell

linux buffer 与 cache 的区别

linux buffer 与 cache 的区别.A buffer is something that has yet to be "written" to disk.A cache is something that has been "read" from the disk and stored for later use.两者都是RAM中的数据.简单来说,buffer(缓冲)是即将要被写入磁盘的,而cache(缓存)是被从磁盘中读出来的 缓冲(buffers)

从Docker在Linux和Windows下的区别简单理解Docker的层次结构

上篇文章我们成功在Windows下安装了Docker,输出了一个简单的Hello World程序.本文中我们将利用Docker已有的云端镜像training/webapp来发布一个简单Python的Web程序,在浏览器中输出hello world. 本文内容的测试环境是Windows7下的Docker,用例基于官方文档用例.   一:从运行一个简单的Python Web程序说起 启动Docker客户端并登陆.在客户端中输入以下内容: $ sudo docker run -d -P trainin