啥!Linux吃掉了我的内存!
发生了什么?
Linux正借用你未使用的内存来做磁盘缓存。这使你的计算机看起来可用内存很少,但事实不是这样!一切都很正常!
为什么这么做?
磁盘缓存使你的系统运行更快更流畅!除了使新手感到困惑,这没什么缺点。它从来没有以任何方式从你的应用拿走内存。
如果我想运行更多的应用该怎么办?
如果你的应用想要获取更多的内存,系统会从磁盘缓存中拿走一块被借用的内存。磁盘缓存会立即还给应用!你的计算机可用内存并未减少!
我需要更多的交换分区(swap)吗?
不需要,磁盘缓存仅会借用应用目前不需要的内存。它不会使用交换分区。如果应用需要更多的内存,系统会从磁盘缓存中拿回来。系统不会使用交换分区。
我如何让Linux停止这样做?
你不能禁用磁盘缓存。任何人想要禁用磁盘缓存的唯一理由是他认为这从他的应用中拿走了内存,但事实不是这样!磁盘缓存可以让应用加载更快并且运行更加流畅,但它却从来没有拿走内存!因此,没有任何理由去禁用它!
然而,如果你发现自己需要快速清除一些内存来解决其他问题,比如一个虚拟机行为不正常,你可以用echo 3 | sudo tee /proc/sys/vm/drop_caches
来强迫Linux无损地丢弃缓存。
如果不是这样,为什么top
和free
命令说我所有的内存已被使用?
这仅仅是用辞的差异。你和Linux系统一致认为被应用占用的内存称为used
,而没有被任何程序使用的部分称为free
。
但是,你认为目前被占用但仍然可以被应用使用的内存称作什么呢?
你可能认为这部分内存是free
或available
。而Linux系统称它used
或available
:
内存 | 你称它 | Linux称它 |
---|---|---|
被应用使用 | used |
used |
被占用,但可以使用 | free (或available ) |
used (或available ) |
没有用来做任何事 | free |
free |
译注:老版
free
命令中被占用但可以使用的内存称为used
(used
中的一部分,即buffers
+cached
), 而新版的free
命令中称之为available
。
不严格来讲,top
和free
命令称这部分内存为buffers
和cached
。因为你和Linux用辞的差异,你可能认为你的计算机可用内存很少,不过事实并非如此。
译注:这部分内存准确来说是新版本
free
命令中的available
或者是新版本top
命令中的avail Mem
。
我怎么看我真正还有多少可用内存?
为了弄明白除了交换分区外你的应用可以使用多少内存,执行free -m
命令,然后查看available
那一列:
$ free -m
total used free shared buff/cache available
Mem: 1504 1491 13 0 855 792
Swap: 2047 6 2041
(2016年之前的Linux安装版本,在-/+ buffers/cache
那排查看free
列)
这是你以MB
为单位的答案。如果你天真地查看used
和free
,你会认为你的内存几乎快占满达到99%,然而实际仅仅只有47%!
如果想查看更详细、更专业的关于Linux统计available
内存大小的描述,请看 the commit that added the field.
什么时候我该开始担心?
一个拥有足够内存的、运行良好的Linux系统在运行一段时间后会表现出以下预期的无害特征:
free
内存接近于0used
内存接近总共内存available
内存(或者是free + buffers/cache
)有足够空间(比如说:总内存的20%以上)swap used
没有发生变化
真正的内存不够、你也许想调查原因的情形,警告标志如下:
available
内存(或者是free + buffers/cache
)接近于0swap used
在增加或者波动dmesg | grep oom-killer
命令显示OutOfMemory-killer
程序正在运行
我如何验证这些?
如果想了解更多细节和做实验测试磁盘缓存的影响,请看这个页面。我做了少量的工作只是想让你感激磁盘缓存,而不是让你测试你的硬件速度提升了几个数量级。
版权声明
这个英文原文在:https://www.linuxatemyram.com/ 本来我想翻译一下来着,恰好看到一篇还不错的译文就转载过来了,译文原始链接在:https://codethereforam.github.io/2018-02-02-linux-ate-my-ram/