【问题标题】:Phusion Passenger memory consumption increase from 1.9.3 (system) to 2.1.2 (RVM) on UbuntuPhusion 乘客内存消耗在 Ubuntu 上从 1.9.3(系统)增加到 2.1.2(RVM)
【发布时间】:2014-08-25 10:46:30
【问题描述】:

我有一个具有 512MB 物理 RAM 和 512MB 交换空间的 Ubuntu 系统。使用单用户(我的用户)RVM Ruby 2.1.2 在Passenger 4.0.45 服务器(Apache 模块)上运行我的四个Rails 3.2.12 应用程序,它使用的内存比我配置Passenger 以使用旧系统(根)Ruby 1.9.3。这是乘客配置的唯一区别。

这会导致Passenger在访问一个应用程序时将其他应用程序移动到swap,这意味着每次访问不同的应用程序时,都必须从swap中加载它,从而导致延迟。这意味着如果同时使用多个应用程序,我几乎会耗尽内存,而且它们对用户的反应很慢。

我不明白为什么使用 RVM 会导致乘客使用更多内存。我怀疑这是因为 Ruby 2.1.2,除非我需要调整内存参数。

【问题讨论】:

    标签: ruby-on-rails ubuntu rvm passenger


    【解决方案1】:

    与 2.0.0 相比,ruby 2.1.2 的开箱即用设置确实增加了内存使用(如果您不考虑 2.0.0 中的写入时复制改进,我相信这与 1.9.3 相当)

    原因是 Ruby 2.1 引入了一种新的垃圾收集算法。简而言之,该算法假设虽然一些对象存在很长时间(例如,代表您的代码的对象),但其他对象的存在时间很短。较旧的 rubies 会花费很长时间来尝试查看是否所有对象都已准备好进行垃圾回收,而 ruby​​ 2.1 在次要收集(仅尝试收集短期对象)和主要收集(尝试收集长期存在的对象)之间切换。

    这会以消耗一些内存为代价来提高性能(次要收集要快得多)。

    您可以使用(除其他外)RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR 环境变量来调整它。默认值为 2,设置为 0.9 会关闭分代垃圾收集器,中间的数字会以内存换取性能。

    您还可以使用 jemalloc 库(在任何 ruby​​ 版本上)来获得一点性能并稍微减少内存使用量。

    Rails 应用程序的最后一部分问题是,许多应用程序具有可以持续整个请求的所谓的中等生命周期对象 - Ruby 尝试将对象拆分为 2 代是不够的。 Ruby 2.2 计划对此进行改进。

    如果您想了解更多信息,Sam Saffron 有一个很棒的post

    此外,ruby 2.1.3 对 gc 时序进行了一些更改,与 2.1.2 相比,在大多数情况下减少了内存使用

    【讨论】:

    • 谢谢。我可以确认设置 RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR=0.9 会消除此内存“膨胀”,具有讽刺意味的是,鉴于我的内存有限(我必须将乘客限制为每个应用程序 1 个进程),这会导致更高的性能。知道如何将 jemalloc 注入我的 Apache/Passenger/Ruby 进程吗?我目前使用 apachectl 启动服务。
    • 其实它并没有完全删除它,而是将内存消耗恢复到略高于1.9.3,并且在访问不同的应用程序时保持更稳定。这是大约 200MB 的差异,大约是我总虚拟内存的四分之一。页面文件越满,Passenger 似乎就会积极地将不活动的应用程序内存交换到页面文件。
    • 我在编译 ruby​​ 时通过设置 LIBS=-ljemalloc 来使用 jemalloc。你应该可以使用 LD_PRELOAD 环境变量来做到这一点,但我没有这样做。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-09
    • 2011-11-01
    • 1970-01-01
    • 1970-01-01
    • 2011-10-23
    • 1970-01-01
    相关资源
    最近更新 更多