Ruby on rails Ubuntu上的Phusion乘客内存消耗从1.9.3(系统)增加到2.1.2(RVM)

Ruby on rails Ubuntu上的Phusion乘客内存消耗从1.9.3(系统)增加到2.1.2(RVM),ruby-on-rails,ubuntu,rvm,passenger,Ruby On Rails,Ubuntu,Rvm,Passenger,我有一个带有512MB物理RAM和512MB交换的Ubuntu系统。使用单用户(我的用户)RVM Ruby 2.1.2在Passenger 4.0.45服务器(Apache模块)上运行我的四个Rails 3.2.12应用程序,它使用的内存比我配置Passenger使用旧系统(root)Ruby 1.9.3时多30%。这是乘客配置中唯一的区别 这会导致乘客在访问一个应用程序时移动其他应用程序进行交换,这意味着每次访问不同的应用程序时,都必须从交换中加载该应用程序,从而导致延迟。这意味着,如果同时使

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

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


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

< P> Ruby 2.1.2的开机设置与2.0.0相比,内存使用增加了(我认为如果不考虑在2.0.0的写上改进的拷贝),则增加内存使用量

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

这会提高性能(较小的收集速度要快得多),但会牺牲一些内存使用

您可以使用
RUBY\u GC\u HEAP\u OLDOBJECT\u LIMIT\u FACTOR
环境变量来调整这一点。默认值为2,设置为0.9将关闭分代垃圾收集器,中间的数字将在性能上权衡内存

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

rails应用程序的最后一个问题是,许多应用程序都有可以持续整个请求的中等寿命对象——Ruby试图将对象拆分为两代是不够的。Ruby 2.2计划在此基础上进行改进

如果你想读更多的话,Sam Saffron对此有很好的理解


此外,与2.1.2相比,ruby 2.1.3对gc计时做了一些更改,在大多数情况下减少了内存使用。我可以确认,设置RUBY\u GC\u HEAP\u OLDOBJECT\u LIMIT\u FACTOR=0.9会删除此内存“膨胀”,具有讽刺意味的是,在内存有限的情况下,这会导致更高的性能(我必须将每个应用程序的进程数限制为1个)。知道如何将jemalloc注入我的Apache/Passenger/Ruby进程吗?我目前使用apachectl启动该服务。实际上,它不会完全删除它,但会将内存消耗恢复到略高于1.9.3的水平,并且在访问不同的应用程序时会保持更稳定。这是一个大约200MB的差异,大约是我总虚拟内存的四分之一。页面文件越满,Passenger似乎就越积极地将非活动的应用程序内存交换到页面文件中。在编译ruby时,我通过设置LIBS=-ljemalloc来使用jemalloc。您应该可以使用LD_PRELOAD环境变量来完成,但我还没有这样做。