【发布时间】:2011-07-11 09:20:25
【问题描述】:
从 Ruby 1.8.6 升级到 Ruby Enterprise 1.8.7 p334 时,内存大小几乎翻了一番。我们升级的五台 Fedora 8 服务器中的每一台都出现了这种情况。我们运行 Rails 1.2.6 和乘客 3.0.4。
Munin 通过对来自$ ps axo pid,comm,pmem,vsz,rsz 的 vsz 和 rsz 列求和来获取每个进程的内存大小。 (虚拟内存大小和常驻内存大小都增加相同的量)
我意识到这些列通常夸大了进程实际使用的内存量,但如果将其用于测量 1.8.6 和 1.8.7 REE,它们应该同样臃肿,因此仍然具有可比性。
此外,机器的已提交内存(如 /proc/memstat 中所列)现在经常过度使用,这是新的。提交的内存量显着增加,看起来我们现在进入了交换空间。
我们尚未调整垃圾收集,但我看不出这将如何影响整体内存占用。
我已按照 Phusion 常见问题解答的建议打开了 GC.copy_on_write_friendly 变量。
内存使用量增加 100% 的原因是什么?我该如何解决?任何关于如何修复,甚至更好的监控/调试的想法,都值得赞赏。
谢谢。
---更新
为了检查性能,我已将一台服务器上的运行实例数 (PassengerMaxPoolSize) 从 12 个减少到 10 个。另一方面,我将PassengerPoolIdleTime 提高到15 分钟。我有第三个被用作控件。
我正在考虑将非企业版 1.8.7p334 放在服务器上,看看它是 1.8.7 还是企业版。
其他人对此类问题有任何经验吗?
查看单个 Rails 进程,在 1.8.6 中每个进程大约 120MB,在 REE 1.8.7 中每个进程大约 175MB,如乘客内存统计所述。
---更新 2
我将 MRI 1.8.7 放在服务器上以与 REE 1.8.7 进行比较。结果更糟,包括更高的内存驻留大小数和乘客内存统计数据。当然,交换开始了。
这让我相信 1.8.7 的占用空间比 1.8.6 大。
---更新 3
我将 MRI 1.8.7 放在服务器上,在内存使用方面比 MRI 1.8.6 差很多,所以我立即回到 MRI 1.86。
我运行了 Rails 进程大小的平均值,由乘客内存统计信息列出。 REE 1.8.7 进程大了 73 MB,看起来相当大。
这意味着我需要运行的进程显着减少以适应相同的内存占用。
将看看他们如何用更少的进程执行。我也开始 GC 调优了。
---更新 4
似乎 Ruby 1.8.7 不支持 Rails 1.2.6。第一个官方支持的 1.8.7 版本是 Rails 2.1。我们会在升级后知道这是否是问题的根源。
【问题讨论】:
-
你是否也在查看passenger-memory-stats的输出?
-
是的。乘客记忆统计数据也有所增加,尽管没有那么显着。减少PassengerMaxPoolSize 和PassengerPoolIdleTime 都有助于减少来自passenger-memory-stats 的内存。常驻内存也略有下降,但还不够明显。
-
您是否检查过以确保您现在运行的不是 64 位版本的 Ruby?
-
在乘客讨论组 (groups.google.com/group/phusion-passenger/topics) 上提出这样的问题更有意义。赖宏利和普讯的其他人都非常活跃。
-
等等,你从 32 位切换到 64 位,想知道为什么你的内存使用量增加了?
标签: ruby memory-management garbage-collection ruby-enterprise-edition