我确信这是一个非常基本的问题,但我只是想了解运行基于 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 的交换空间(从不低于)吗?我只是在寻找一些线索,以便我可以检查一下,这些线索可以向我解释 Linux 中内存的确切使用方式。
答案1
我在 Ted Ts'o 教授的课程上接受培训,当我问到同样的问题时,他是这样解释的......
默认情况下,内核会保留大部分内存用于缓存文件系统元数据等内容。这就是为什么“已用”列显示 905MB。这是“已用”的总内存,即程序和缓存使用的内存。实际可用内存量位于“可用”列下,在“-/+ 缓冲区/缓存”旁边,换句话说,561MB。这是可供程序使用的量。
现在,由于内核已将 462MB 用于缓存,因此剩下 118MB 完全可用。当程序对内核说:“嘿,我现在需要 50MB 内存!”时,内核将从这个“空闲”池中提取内存。这使得“空闲”池大约为 68MB,这个数字太小了,因此在提取完这些内存后,存储在缓存中的内容量会降低,“空闲”池会重新增加。
但是,如果某个程序占用过多内存,并说“我现在需要 120MB 内存!”,会发生什么情况呢?您没有那么多“可用”内存,因此内核无法将其提供给程序,即使是暂时的,因此内核会进入交换区,只需分配足够的可用内存来满足程序的需求,然后释放足够的缓存数据,让“可用”内存回到舒适的水平。
在稳定过程中,交换区中的数据不会立即从交换区中释放,即使它是缓存数据。交换内存唯一会被使用的情况是当某些东西请求存储在那一小段交换区中的元数据(或任何缓存信息)时。所以保留它并没有什么坏处。
如果它困扰您,您可以运行“swapoff”然后运行“swapon”来摆脱它,但它不会造成任何东西的损害。
答案2
内存管理非常复杂,O'Reilly 的《了解 Linux 内核》提供了许多细节。
不过,这个想法是,您可以主动交换出可能永远不会再使用的内存。您可以使用 中的 0 到 100 之间的值来控制交换的使用可能性/proc/sys/vm/swappiness
。数字越大,交换的可能性越大。
在开始处理这个问题之前,先看看交换是否积极通过观察 的 si/so 列来确定正在使用vmstat 3
。如果这些仍为 0,则表示正在进行交换,但目前没有进行交换,在这种情况下,我建议您保持原样 :-) 一个原因是 free 告诉您的那些缓存文件可能有必要放在内存中。不要允许无用的进程内存被交换,否则您可能会错过缓存一些有用的文件的机会。
答案3
如果您有 95MB 的程序数据在一小时内未访问过,您会怎么做:
1)浪费95MB的物理内存来保存可能永远不会被访问的数据。
2)将这 95MB 交换到磁盘并获得额外的 95MB 可用物理内存。
系统明智地选择了选项 2。
在许多系统上,您往往会获得中等数量的此类内存。一个常见原因是程序在启动期间分配内存,然后等待永远不会到达的请求。许多 Linux 系统有六个正在运行但实际上从未使用过的服务器程序。