从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
中的vsz和rsz列来获取每个进程的内存大小。 (虚拟内存大小和驻留内存大小都增加相同的数量)
我意识到这些列通常夸大了进程实际使用的内存量,但是如果用它来测量1.8.6然后1.8.7 REE,它们应该同样膨胀,因此仍然具有可比性。
此外,机器的已提交内存(如/ proc / memstat中所列)现在经常过度使用,这是新的。提交内存的数量显着增加,看起来我们现在已进入交换空间。
我们还没有调整垃圾收集,但我看不出它会如何影响整体内存占用。
我按照Phusion常见问题解答的建议打开了GC.copy_on_write_friendly变量。
内存使用量增加100%的解释是什么?如何解决?关于如何修复,甚至更好地监控/调试的任何想法都表示赞赏。
感谢。
--- UPDATE
为了检查性能,我在一台服务器上将运行实例(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进程大小,由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。升级后我们会知道这是问题的根源。
答案 0 :(得分:3)
您从32位版本的Ruby转到64位版本的Ruby。这使指针的大小加倍,运行时中有很多指针。