Linux ate my RAM!

别慌!
你的内存好着呢!

这是怎么一回事?

和所有现代操作系统一样,Linux 会把闲置的内存“借”过来做磁盘缓存。这让它看起来好像陷入了“空闲”内存不足的窘境,但事实并非如此!一切都正常得很,请坐和放宽!

为什么要这么做?

磁盘缓存能让系统运行得更快、响应更灵敏!这么做完全没有坏处,唯一的“副作用”大概就是会让刚接触计算机、还不了解“文件系统缓存”概念的新手用户感到困惑。大部分情况下,它绝对不会抢占应用程序的内存。

如果我想运行更多程序怎么办?

如果你的应用程序需要更多内存,内核会直接把磁盘缓存借走的那块内存收回来。磁盘缓存随时都可以无缝、立刻腾出来给应用程序!你的内存真的够用!

我需要增加交换分区吗?

大概率不需要。磁盘缓存主要借用的是应用程序目前不需要的内存。如果应用程序需要更多内存,内核就会从磁盘缓存中收回。当然,如果某些应用程序的内存访问频率还不如文件系统缓存高,Linux 确实有可能会把它们挤进 swap 中。但这种操作通常是为了提升性能,而不是损耗性能。

如何让 Linux 别再这么干了?

你没办法完全禁用磁盘缓存(不过你可以调整 Linux 的 “swappiness” 参数)。大家之所以想禁用磁盘缓存,唯一的理由就是误以为它抢了应用程序的内存——然而它并没有!磁盘缓存能让程序加载得更快、运行得更丝滑,但它绝对、永远不会克扣程序的内存!因此,压根就没有任何理由去禁用它!

不过,如果你因为某些特殊原因(比如测试未缓存程序的冷启动性能)需要迅速清空一部分内存,你可以使用以下命令,强制 Linux 安全无损地释放缓存echo 3 | sudo tee /proc/sys/vm/drop_caches

既然内存还够,为什么 top 和 free 却显示空闲内存这么少?

这纯粹是术语理解上的差异。你和 Linux 都同意,被应用程序占用的内存叫“已用(used)”,而啥也没干的内存叫“空闲(free)”。

但是,对于那些目前正干着别的事、但随时可以拿给应用程序使用的内存,又该怎么算呢?

你可能会把这部分内存归为“空闲(free)“和/或”可用(available)“。而 Linux 则是把它算作”可用(available)“:

内存 你会称之为 Linux 称之为
由应用程序使用 Used(已用) Used(已用)
已用但可释放 Free (or Available)(空闲或可用) Available(可用)
未用于任何用途 Free(空闲) Free(空闲)

这部分“干着别的事”的内存,大概就是 topfree 命令里所显示的 “buffers”(缓冲区)和 “cached”(缓存)。由于你和 Linux 的术语对不上号,你可能就会在内存充裕的时候,误以为自己正面临内存危机。

怎么才能看到我到底还有多少真正的空闲内存?

想要查看你的应用程序在不使用 swap 的情况下还能压榨多少内存,运行 free -m 看看 “available” 那一列就行了:

$ free -m
              total        used        free      shared  buff/cache   available
Mem:           1504         636          13           0         855      792
Swap:          2047           6        2041

(如果使用的是 2014 年之前的旧版本系统,请改看 “-/+ buffers/cache” 那一行的 “free” 列。)

这就是以 MiB 为单位的真实答案。如果你只是天真盯着 “free” 看,你会以为内存已经满了 99%,但实际上它才用了 42% 罢了!

如果想从更详细、技术性的角度了解 Linux 到底把什么算作 “available(可用)”,可以参见引入该字段的提交记录

我什么时候才应该开始担心?

一个拥有充沛内存的健康 Linux 系统,在运行一段时间后,会表现出以下完全符合预期且人畜无害的行为:

而当出现以下危险信号时,说明系统遇到了真正的内存不足问题,你可能需要介入排查了:

我该怎么验证这些结论呢?

请移步此页面查看更多技术细节,并亲自上手做个磁盘缓存小实验来见证本文所述的效果。没有什么比在自己的硬件上测出量级提升的加速,更能让你领略磁盘缓存的真香定理了!


LinuxAteMyRam.com 由 VidarHolen.net 呈现。本网站已在 GitHub 上开源,欢迎提出建议或提交 PR。