内存是空闲的,但仍在交换?

7 ubuntu memory swap

我确定这是一个非常基本的问题,但我只是想了解运行基于 Rails 的站点的 Ubuntu Hardy 服务器发生了什么。似乎我有可用内存,但系统报告它仍在交换内存(除非我读错了?)。

这是free -m输出

              total       used       free     shared    buffers     cached
Mem:          1024        905        118          0         33        409
-/+ buffers/cache:        462        561
Swap:         2047         95       1952
Run Code Online (Sandbox Code Playgroud)

任何人都可以向我解释一些可能的原因,即它始终保持 95MB 的交换空间(它永远不会更少)?我只是在寻找一些关于我可以检查的内容的线索,这些线索会向我确切地解释 Linux 中如何利用内存。

Mat*_*ons 10

我在 Ted Ts'o 教授的课程中接受培训,当我问同样的问题时,他向我解释的方式是这样的......

默认情况下,内核保留大部分内存用于缓存文件系统元数据等内容。这就是为什么您的“已使用”列显示 905MB。这是“使用”的总内存,意思是程序和缓存。实际可用内存量在“空闲”列下,在“-/+ 缓冲区/缓存”旁边,即 561MB。这是可供程序使用的数量。

现在,由于内核有 462MB 用于缓存,所以剩下 118MB 完全可用。当一个程序对内核说,“嘿,我现在需要 50MB 的内存!”,内核从这个“空闲”池中提取内存。这使得“空闲”池大约为 68MB,这对于舒适来说太小了,因此在提取内存后,缓存中存储的内容量减少,“空闲”池恢复。

但是如果一个程序很笨拙,并且说“我现在需要 120MB 的内存!”会发生什么。你没有那么多“空闲”内存,所以内核不能把它给程序,即使是暂时的,所以内核深入交换,只要足够长的时间来分配足够的空闲内存来给程序它需要的东西,然后释放足够的缓存数据以允许“空闲”内存回到舒适的水平。

通过结算过程,交换中的数据不会立即从交换中释放出来,即使它是缓存数据。交换内存将被使用的唯一时间是某些东西请求存储在交换的那一小段中的元数据(或任何缓存的信息)。所以离开它没有坏处。

如果它困扰你,你可以运行 'swapoff' 然后运行 ​​'swapon' 来摆脱它,但它不会伤害任何东西。


Kyl*_*ndt 9

内存管理非常复杂,O'Reilly 的《Understanding The Linux Kernel》给出了很多细节。

不过,这个想法是您可以主动换出可能永远不会再次使用的内存。您可以使用 0 到 100 中的值控制交换的使用可能性/proc/sys/vm/swappiness。更高的数字意味着更有可能被交换。

在您开始惹这个,看看如果交换是积极与通过观看SI /这样的列使用vmstat 3。如果这些仍然为 0,那么交换正在进行,但目前没有交换正在进行,在这种情况下,我建议您将其保留为 :-) 一个原因是那些免费告诉您的缓存文件可能对您有用记忆。不要让无用的进程内存被交换,你可能会错过缓存一些对缓存有用的文件的机会。