Linux偷偷“吃”了我的内存?

不知道刚使用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!

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
THE END
分享
二维码
< <上一篇
下一篇>>