内存是免费的,但仍然交换?

我确定这是一个非常基本的问题,但我只是想了解运行基于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 

任何人都可以向我解释一些可能的原因,它始终保持95MB的交换(从来没有更less)? 我只是寻找一些可以检查的东西,这些东西会向我解释在Linux中如何使用内存。

我正在接受泰德教授的课程培训,当我问到同样的问题时,他向我解释的是这样的…

默认情况下,内核保留大部分内存来caching文件系统元数据等内容。 这就是为什么你的“使用”列显示905MB。 这就是“使用”的总内存,意思是程序和caching。 可用内存的实际数量在“free”列下,“ – / + buffers / cache”旁边,换句话说就是561MB。 这是可供程序使用的数量。

现在,由于内核有462MB用于caching,所以剩下118MB完全可用。 当一个程序对内核说:“嘿,我现在需要50MB的内存!”,内核从这个“空闲”池中抽取内存。 这使得“免费”池大约为68MB,这对于舒适度来说太小了,所以在绘制内存之后,存储在caching中的东西的数量被降低,并且“空闲”池恢复。

但是如果一个程序是猪,会发生什么事情,并说:“我现在需要120MB的内存!” 你没有那么多的“空闲”内存,所以内核甚至暂时不能把它交给程序,所以内核挖掘到了交换空间,只要足够长的时间来分配足够的空闲内存来为程序提供所需的内容,那么释放足够的caching数据以允许“空闲”内存回到舒适的水平。

通过build立过程,交换中的数据不会立即从交换中释放,即使它是caching数据。 交换内存将被使用的唯一时间是如果有东西请求存储在该交换的一小段中的元数据(或任何caching的信息)。 所以离开它并没有什么坏处。

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

内存pipe理非常复杂,O'Reilly的“了解Linux内核”给出了很多细节。

这个想法是,你可以换出内存,可能永远不会再主动使用。 在/proc/sys/vm/swappiness您可以控制交换使用的可能性,范围从0到100。 数字越大意味着交换的可能性越大。

在开始讨论这个之前,通过观察vmstat 3的si / so列来查看交换是否被主动使用。 如果这些文件保持为0,那么就会进行交换,但是目前没有交换,在这种情况下,我build议您保留它:-)其中一个原因是那些免费提供给您的caching文件可能对您有用记忆。 不要让无用的进程内存交换,你可能错过了caching一些对caching有用的文件的机会。

如果您有95MB的程序数据在一个小时内没有被访问过,那么您应该这样做:

1)浪费95MB的物理内存保存永远不会被访问的数据。

2)将95MB交换到磁盘,并有额外的95MB空闲物理内存。

该系统明智地select了选项2。

在很多系统上,你往往会获得适量的这种内存。 一个常见的原因是程序在启动时分配内存,然后等待永远不会到来的请求。 许多Linux系统有六个服务器程序正在运行,但实际上并没有使用过。