不知道刚使用Linux的小伙伴有没有遇到过这样的情况,有一天你看到自己的内存空间变少了,在一探究竟后,发现幕后“真凶”竟然是Linux!这到底怎么回事呢?
发生了什么事?
其实这是Linux正在借用未使用的内存进行磁盘缓存。这意味着内存看起来变少了,但实际上并没有。Linux之所有这么做,主要是为了让系统运行的更快,更流畅。除了让新手感到困惑外,它不会以任何方式占用应用程序的内存。
我如果想运行更多的应用程序怎么办?
当然,Linux确实借用了你的内存,注意这里是借用,不是占用。当应用程序需要更多的内存运行时,它们可以拿回被Linux借去用来做磁盘缓存的那块内存。Linux只是暂时借用,所以它可以立即将借走的内存还给应用程序,你的内存并没有实质上的减少。
我需要更多的swap空间吗?
Linux磁盘缓存只是借用了应用程序目前不需要的内存。它不会使用Swap空间。如果应用程序需要更多的内存,只需要从磁盘缓存中取回就可以了。这个过程不会用到Swap空间。
我就想禁止磁盘缓存,这样做有害吗?
可能你还是觉得Linux占用了你的应用程序内存,所以你就想阻止Linux进行磁盘缓存。但你最好别这么做。因为Linux进行磁盘缓存会使应用程序的加载速度更快,运行更流畅,除非你不希望它更快,更流畅。磁盘缓存在实质上永远都不会占用内存,所以你也没理由禁用它。
当然,如果你发现自己需要通过清除一些内存来解决一个问题的时候,比如说你的虚拟机不听你的话了,你就可以用下面的这个命令来无损的删除Linux的磁盘缓存。
echo 3 | sudo tee /proc/sys/vm/drop_caches
为什么top和free说我所有的内存都用完了,而实际上并没有?
这只是一个对术语理解上的差异。你和Linux系统都有一个共同的默认点,认为只要是被应用程序占用了那就是 "使用的",而没有被占用的内存就是 "空闲的"或者说是"可用的"。由于磁盘缓存占用了内存,所以在你的眼里这部分内存都是"使用的",但在Linux眼里它们既是"使用的"也是"可用的"。也就是top和free里的"缓冲区"和"缓存",这就是我所说的对术语理解的差异,由于这个理解差异的存在,所以你才会认为内存不足,但实际上并非如此。
图片来源VidarHolen.net
那到底还有多少内存呢?
要想知道你的应用程序在不交换的情况下可以使用多少内存,可以运行free -m并查看 "available"栏。这些数据的单位是MiB。
$ free -m
total used free shared buff/cache available
Mem: 1504 1491 13 0 855 792
Swap: 2047 6 2041
(如果你的Linux是2016年以前的版本,请看"-/+缓冲区/缓存 "行中的 "free "列。)
就像上面的查询看到的一样,如果你非常天真地只看"已用"和"空闲",你就会认为你的内存已经用掉了99%,基本满了,可是实际上它只用了47%,也就是说你的认知内存和实际内存相差了52%!
什么时候应该担心内存不足?
一个健康的,有足够内存的Linux系统,在运行一段时间后,会出下以下无害的行为。
free可用内存接近于0
used内存接近于total
acailable(或 "free+buffers/cache")有足够的空间(比方说,占总数的20%以上)。
使用的swap空间没有变化
而当系统真正进入低内存的状态,会出现以下的警告信号。
available内存(或 "free+buffers/cache")接近于零
使用的swap空间增加或波动
dmesg | grep oom-killer显示 OutOfMemory-killer 在工作。
Linux并不会偷偷"吃"掉你的内存,它只是再用磁盘缓存这种方式让你的系统运行的更快,更流畅,提高你的使用体验,仅此而已。
了解"可用"的详细描述:kernel/git/torvalds/linux.git - Linux kernel source tree
验证磁盘缓存相关特性:Experiments and fun with the Linux disk cache
参考链接:Help! Linux ate my RAM!
版权归原作者 、左耳 所有, 如有侵权,请联系我们删除。