微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

ruby-on-rails-3 – 在Ruby on Rails 3 / Postgres / Apache Passenger应用程序中跟踪内存泄漏

你好,

我们最近更新了Rails 3.0.4(3.0.5在线devel服务器)的应用程序.大多数从2.3.10到3.0.4的更改是由于过时或过时的插件和宝石,并且相对容易解决.但有一件事让我生气:

在开发模式下,每一个Web请求使得服务器进程比以前分配大约50-60 MB的内存.这个内存在请求之后没有被释放,至少不是全部的.在10-20次请求之后,每个Ruby实例消耗超过500 MB的RAM,而我们以前的Rails 2.3.10实例很少超过200 MB.

这使得无法运行我们的1300测试,因为devel机器的4GB RAM在测试结束之前被填充.它只在cache_classes = false的开发模式下发生.如果我将cache_classes切换为true,则Rails实例将消耗约200MB的内存,然后停留在那里.但是,在测试期间,即使cache_classes = true,内存使用也会增加.

查询了ObjectSpace,发现在每个请求中,大约3500个新的Proc,最多可以创建50,000个新的Strings和3000个新的哈希和数组,并且不会被释放.这些字符串(转储时)包含我的整个源代码,包括插件和宝石,文档,源代码注释和路径名. (为什么?)

为了找到原因,这里是我试过的:(每一次变化之后,我用ab -n锤击了应用程序)

>我创建了一个新的Rails 3应用程序与一个资源和控制器和sqlite3数据库.内存使用开始于60 MB,并保持在80 MB以下.
>我将’sqlite3’更改为’pg’,并将新的Rails 3应用程序指向我现有的Postgres DB.内存使用情况从110 MB开始,并没有超过130MB. (Side问题:为什么Postgres宝石比sqlite3宝石使用更多的内存?)
>我将我的Gemfile和Gemfile.lock从破碎的Rails3应用程序复制到裸机应用程序并运行捆绑安装.没有变化,内存保持在115MB左右,无论提出多少请求.
>我在破碎的Rails3应用程序中创建了一个空的“def FooController; def foo; render:text =>’foo’end; end”.内存使用量增长更慢,但是在请求后仍然不会停止增长.
>除了FooController路由之外,我删除了每个路由.不用找了.
>我禁用所有宝石,除了以下内容:pg,rails,aasm,will_paginate,geokit-rails3,考拉,omniauth,回形针.不用找了.
>我禁用了ApplicationController中的每个before_filter和after_filter,并且在environment.rb中禁用了每个非必要的包含.我还使用我的裸机Rails 3应用程序同步了boot.rb,environment.rb和application.rb,除了五个相对简单的观察者,在/ lib和filter_parameters中自动加载文件.不用找了.每个新的请求仍然消耗了10-50 MB的RAM.

如果你有一个想法,这里出现什么问题,以及内存泄漏的可能性,我真的很感激任何帮助.我在OS X SNow Leopard上运行Rails 3.0.4,在Debian Lenny上运行Rails 3.0.5

谢谢!

接近:

我已经删除了每个插件,每个宝石,每个扩展和我没有亲自写的所有东西,所以我的应用程序基本上是裸体的.特别是,我删除了这些插件:acts_as_list,acts_as_tree,asset_packager,forgot_password,fudge_form,fudge_scaffold,paperclippolymorph,query_trace,rails_upgrade,repeated_auto_complete-0.1.0,role_requirement,to_select,validates_url和ym4r_gm.

现在我的应用程序 – 只有上面的FooController仍然可以工作! – 即使用ab -n 1000 -c1(使用ApacheBench的1000个HTTP请求到/ foo),也可以启动65MB并且不超过75MB的RAM.不幸的是,没有插件,这也是唯一可以使用的URI.

经过一些挖掘,似乎Restful身份验证和作为状态机(AASM)插件间的组合导致内存泄漏.另见https://github.com/Satish/restful-authentication/issues#issue/11.我不知道为什么,只是在我的裸机项目中“包括AASM”不会自己造成RAM使用增长.

我会进一步调查.

Culprit发现

这是AASM.在Rails 3中,它似乎泄漏了AASM :: xxx对象实例.看到

> https://github.com/jeffp/enumerated_attribute/issues/#issue/20
> https://github.com/rubyist/aasm/issues/31
> https://github.com/Satish/restful-authentication/issues/#issue/11

第二个罪魁祸首

rspec中还有一个内存泄漏.这使得我的测试几乎无法忍受,甚至在删除AASM后,因为两个并行运行的rspec任务(使用https://github.com/grosser/parallel_tests)最终占用了近3GB的内存.见https://github.com/rspec/rspec-core/issues/#issue/321.

解决方法

原文地址:https://www.jb51.cc/ruby/274061.html

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐