4

从 Ruby 1.8.6 升级到 Ruby Enterprise 1.8.7 p334 时,内存大小几乎翻了一番。我们升级的五台 Fedora 8 服务器中的每一台都出现了这种情况。我们使用乘客 3.0.4 运行 Rails 1.2.6。

Munin 通过对来自$ ps axo pid,comm,pmem,vsz,rsz. (虚拟内存大小和常驻内存大小都增加相同的量)

我意识到这些列通常夸大了进程实际使用的内存量,但如果将其用于测量 1.8.6 和 1.8.7 REE,它们应该同样臃肿,因此仍然具有可比性。

此外,机器的已提交内存(如 /proc/memstat 中所列)现在经常过度使用,这是新的。提交的内存量显着增加,看起来我们现在进入了交换空间。

我们还没有调整垃圾收集,但我看不出这会如何影响整体内存占用。

我已经按照 Phusion FAQ 的建议打开了 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。

I've run an average of Rails process size, as listed by passenger-memory-stats. The REE 1.8.7 processes were 73 MB larger, which seems rather large.

This means that I need to have significantly less processes running to fit in the same memory footprint.

Will see how they perform with fewer processes. I'm also starting the GC tuning.

---UPDATE 4

Seems Ruby 1.8.7 does not support Rails 1.2.6. The first officially supported version of 1.8.7 is Rails 2.1. We'll know after the upgrade if that's the root of the problem.

4

1 回答 1

3

You went from a 32-bit version of Ruby to a 64-bit version of Ruby. This doubles the size of pointers, of which there are many in the runtime.

于 2011-05-14T16:50:05.490 回答