我有一个Ubuntu系统,512MB物理内存和512MB交换。使用单用户(我的用户)RVM Ruby 2.1.2在Passenger 4.0.45服务器(Apache模块)上运行我的四个Rails 3.2.12应用程序,它比我配置Passenger使用旧系统时使用的内存大约多30%( root)Ruby 1.9.3。这是Passenger配置的唯一区别。
这会导致Passenger在访问其他应用程序时将其移动到交换,这意味着每次访问不同的应用程序时,都必须从交换中加载,从而导致延迟。这意味着如果同时使用多个应用程序,我几乎耗尽内存,并且它们对用户反应缓慢。
我无法理解为什么使用RVM会导致Passenger使用更多内存。我怀疑是因为Ruby 2.1.2,除非我需要调整内存参数。
答案 0 :(得分:3)
与2.0.0相比,ruby 2.1.2的开箱即用设置会增加内存使用量(如果您不考虑2.0.0中的写入改进副本,我认为与1.9.3相当)
原因是Ruby 2.1引入了一种新的垃圾收集算法。简而言之,该算法假设虽然一些对象长时间存在(例如代表您的代码的对象),但其他对象的寿命很短。较旧的红宝石将花费很长时间试图查看是否所有对象都已准备好进行垃圾收集,而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相比