
别慌!
你的内存好着呢!
这是怎么一回事?
和所有现代操作系统一样,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(空闲) |
这部分“干着别的事”的内存,大概就是 top 和 free 命令里所显示的 “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 系统,在运行一段时间后,会表现出以下完全符合预期且人畜无害的行为:
free内存接近0available内存(或 “free + buffers/cache”)留有足够的空间(比如占总内存的 20% 以上)swap used(已用交换空间)基本保持不变
而当出现以下危险信号时,说明系统遇到了真正的内存不足问题,你可能需要介入排查了:
available内存(或 “free + buffers/cache”)接近于零swap used持续增加或频繁波动dmesg | grep oom-killer显示 OutOfMemory-killer(内存溢出杀手)已经开始大开杀戒了
我该怎么验证这些结论呢?
请移步此页面查看更多技术细节,并亲自上手做个磁盘缓存小实验来见证本文所述的效果。没有什么比在自己的硬件上测出量级提升的加速,更能让你领略磁盘缓存的真香定理了!
LinuxAteMyRam.com 由 VidarHolen.net 呈现。本网站已在 GitHub 上开源,欢迎提出建议或提交 PR。