ruby-on-rails-3 – 在Ruby on Rails 3 / Postgres / Apache Pas
你好,
我们最近更新了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以下. 如果你有一个想法,这里出现什么问题,以及内存泄漏的可能性,我真的很感激任何帮助.我在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 第二个罪魁祸首 rspec中还有一个内存泄漏.这使得我的测试几乎无法忍受,甚至在删除AASM后,因为两个并行运行的rspec任务(使用https://github.com/grosser/parallel_tests)最终占用了近3GB的内存.见https://github.com/rspec/rspec-core/issues/#issue/321. 解决方法
一些很好的资源帮助您追踪泄漏的来源:
更新: Find memory leak in a Ruby on Rails project 老年人: ruby/ruby on rails memory leak detection http://tomcopeland.blogs.com/juniordeveloper/2007/09/tracking-down-a.html http://xdotcommer.wordpress.com/2009/03/03/tracking-down-a-memory-leak-performance-issues-in-rails/ (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |