对 Linux 中可用内存的理解
{Back to Index}

Table of Contents

1 磁盘缓存 buff/cache

Linux 会借用未使用的内存来做磁盘缓存。这使你的计算机看起来可用内存很少,但事实不是这样!一切都很正常!1

使用磁盘缓存使得系统运行更快更流畅!除了使新手感到困惑,没什么缺点。它从来没有以任何方式从你的应用拿走内存。 如果应用想要获取更多的内存,系统会从磁盘缓存中拿出一块被借用的内存还给应用程序,所以计算机可用内存其实并不少!

不能禁用磁盘缓存。 想要禁用磁盘缓存的唯一理由是认为磁盘缓存偷走了内存,但事实不是这样。 相反,它可以让应用加载更快并且运行更加流畅。因此,没有任何理由去禁用它。

1.1 page cache

Page cache 主要用来作为 文件系统上的文件数据 的缓存来用,尤其是针对当进程对文件有读写操作的时候。2

1.2 buffer cache

Buffer cache 主要是设计用来在系统对 块设备进行读写 的时候,作为数据缓存来使用。

1.3 清空磁盘缓存

echo 3 | sudo tee /proc/sys/vm/drop_caches

2 查看可用内存 3

root@business-dashboard:~$ free
              total        used        free      shared  buff/cache   available
Mem:        4046288     3339360      130448       40996      576480      393548 ---> 可用内存
Swap:       3999740      146052     3853688

2.1 free 输出解释

free-output.png

Figure 1: free 组成

2.1.1 total

/proc/meminfo 中的 MemTotal ,表示计算机的内存总量。

2.1.2 used

被占用的内存,不能随时回收,其值为 total - free - buff/cache

2.1.3 free

完全没有被使用到的内存, /proc/meminfo 中的 Memfree

2.1.4 shared

/proc/meminfo 中的 Shmem ,共享内存,一般是被 tmpfs 占用。

2.1.5 buff/cache

文件系统的磁盘缓存。 对应 /proc/meminfo 中的 Buffers/proc/meminfo 中的 Cached

大部分情况下,大部分 buffer/cache 占用的内存在需要时可以被回收并重新分配,但是要注意下面几点:4

  • shared 属于 page cache ,所以 cache 的统计里包括 shared ,但是 shared 不能被内核随时回收
  • 除了 shared 以外, buffercache 对应的统计信息里,还有一部分被内核占用,这部分也不能被随时回收

2.1.6 available

应用程序真正可用的内存(比较准确的评估值),其值为 /proc/meminfo 中的 MemAvailable

3 内存健康状况特征

3.1 内存正常使用

  • free 内存接近于 0
  • used 内存接近总共内存
  • available 内存有足够空间(占总内存的 20% 以上)
  • swap used 没有发生变化

3.2 内存告急

  • available 内存接近于 0
  • swap used 在增加或者波动
  • dmesg | grep oom-killer 命令显示 OutOfMemory-killer

Footnotes:

Author: Hao Ruan (ruanhao1116@gmail.com)

Created: 2020-03-22 Sun 16:04

Updated: 2021-08-17 Tue 11:23

Emacs 27.1 (Org mode 9.3)