转换为Ruby Enterprise 1.8.7后内存大小增加了

4
当从Ruby 1.8.6升级到Ruby Enterprise 1.8.7 p334时,内存大小几乎翻了一倍。我们升级的五台Fedora 8服务器都出现了这种情况。我们使用Passenger 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,如passenger-memory-stats所述。
---更新2
我在服务器上放置了MRI 1.8.7,以与REE 1.8.7进行比较。结果更糟糕,包括更高的内存常驻大小数字和passenger-memory-stats。当然,开始交换。
这让我相信1.8.7的占用空间比1.8.6大。
---更新3
我在一台服务器上放置了MRI 1.8.7,它的内存使用情况比MRI 1.8.6更糟糕,因此我立即回到了MRI 1.86。

我运行了平均 Rails 进程大小,如 passenger-memory-stats 所列。REE 1.8.7 进程大了 73 MB,这似乎相当大。

这意味着我需要运行更少的进程才能适应相同的内存占用。

将尝试使用更少的进程来测试性能。同时,我也开始进行 GC 调整。

---更新 4

看起来 Ruby 1.8.7 不支持 Rails 1.2.6。官方支持的第一个版本是 1.8.7 的 Rails 2.1。升级后我们就会知道是否是问题的根源。


你确定你现在没有运行64位版本的Ruby吗? - Doug Barth
更合理的做法是在Passenger讨论组(http://groups.google.com/group/phusion-passenger/topics)上提出这样的问题。 Hongli Lai和Phusion的其他小伙伴在其中非常活跃。 - Ronen Botzer
1
等等,所以你从32位切换到64位,现在想知道为什么你的内存使用量增加了吗? - Rein Henrichs
说实话,我没有考虑过切换到64位Ruby会增加内存使用量的问题。现在我想了想,这对内存占用有很大的影响。虽然很难看到它会显著增加,但与1.8.6相比,1.8.7的内存大小增加了,两者结合起来,我可能会接受它。 - trimbletodd
64位应用程序中的指针自动加倍,而在使用大量指针的语言(如Ruby)中,您可能会付出巨大的代价。 - tadman
显示剩余3条评论
1个回答

3
你从32位Ruby版本升级到64位Ruby版本。这会使指针的大小加倍,而在运行时有很多指针。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接