Ruby 2.1相对于Ruby 2.0或1.9,内存使用量增加的问题

16

我最近将我的Heroku Web应用程序中的Ruby版本从2.0升级到2.1.5,现在我经常遇到内存配额错误,而在使用2.0和1.9时从未发生过这种情况。普通Heroku Dyno的限制为512MB,我正在两个dynos上运行2个带有Unicorn的进程,以及一个带有Sidekiq的线程。

阅读了Phusion Passenger memory consumption increase from 1.9.3 (system) to 2.1.2 (RVM) on Ubuntu之后,我尝试将环境变量RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR设置为0.9以禁用分代垃圾收集器,并且确实改善了一些内存消耗,但仍然远不如2.0或1.9所需。由于目前内存是我的主要关注点,因此我想看看是否可以解决ruby 2.1.x的这个问题,而不是回退到2.0。

以下是说明问题的一些图表:

在下午2点之前,我将Ruby版本从2.0.0-p598降级到2.1.5,内存问题得到了解决并保持在限制范围内。

moving from 2.1.5 to 2.0.0 Heroku moving from 2.1.5 to 2.0.0 New Relic

稍后我尝试将 Ruby 升级至 2.1.5,但设置环境变量 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR 为 0.9。如图所示,内存使用情况略好于原始的 2.1.5 图表,但仍超出内存配额。

moving from 2.0.0 to 2.1.5 with <code>RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR</code> to 0.9 Heroku moving from 2.0.0 to 2.1.5 with <code>RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR</code> to 0.9 New Relic


非常有趣。我本以为这个链接与此相关,但很好奇在这里的答案是什么。 - Anthony
一直在关注2.2版本的发布,但我担心他们的重点主要是性能改进而不是内存消耗改进,所以我怀疑它不会有太大帮助。 - Matthew O'Riordan
一些早期测试人员报告称,由于2.0.0-preview1中更新的GC,内存占用量较低。你可能想要去检查一下。 - Lenart
@Lenart,你是不是指的是2.2.0-preview1? - Matthew O'Riordan
@MatthewO'Riordan,没错。当然是2.2版本。我的错误! - Lenart
两件事; 1: 你从哪里获得这些很棒的图表?2: 你考虑过迁移到thin吗?我认为那可能会减少你的内存占用,但我不确定。我还发现在某些测试中,Ruby Enterprise Edition的内存占用似乎要低得多(在我看到的一些测试中大约只有一半 :O)。 - Automatico
2个回答

13

因此,答案显然是升级到Ruby版本2.2。

令人印象深刻的是,在升级到2.2后,内存使用量实际上有所下降,而升级到2.1则会大幅增加内存消耗。如下图所示。

2.2版本的内存使用情况

在最左侧,当处于负载状态时,2.0版本的内存消耗约为386MB,而现在使用2.2版本时,它现在约为365MB。


我也看到了Ruby 2.2中内存消耗的改进。你应该将答案标记为正确的。 - kartikluke
1
Ruby 2.2和Rails 3.2兼容稳定吗? - Kelsey Hannan

3
这是Ruby(2.1.x版本)和它的垃圾回收存在的已知问题。在阅读了几个论坛/博客文章后,似乎没有真正的解决方案,只能采取以下措施之一:
- 降级到Ruby 2.0并等待Ruby 2.2发布。 - 使用独角兽工作进程关闭程序,一旦它们达到一定的内存量,防止Heroku R14错误。 - 一些人建议调整GC变量(请参见此处此处)。
这是相关的Ruby-lang讨论链接。
一些人还注意到问题的一个原因可能是NewRelic的gem,所以您可能需要更新/删除它并查看是否有帮助。
此外,感谢upcase.com论坛的一些人提供的一些链接和信息。

关于NewRelic gem的问题,你可以在配置文件中添加aggressive_keepalive: true。这样做应该有助于解决newrelic gem引起的内存问题。 - Lenart
谢谢@Lenart,这些是很好的建议。当我遇到这个问题时,我降级到了2.0版本,希望2.2版本能够解决这个问题,尽管根据我所读到的,我并不完全相信它会。一旦2.2发布,我会尽快更新这篇文章。 - Matthew O'Riordan
我目前不在,但会在新年尝试并在此提供更新。 - Matthew O'Riordan
@ari 对我来说,Ruby 2.2也有同样的问题。 - dylanjha
1
我刚刚升级了我的gem并使用Ruby 2.2进行了部署,等我让它运行几个小时后再更新。 - Matthew O'Riordan

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