如何防止我的Rails查询最大化内存

Max*_*iel 5 ruby memory ssh activerecord ruby-on-rails

我正在使用运行我的Rails应用程序的服务器来运行查询.尽管使用find_each,服务器的内存被我的控制台会话吃掉了,我不知道为什么.基于这个SO答案,我还ActiveRecord::Base.uncached用来阻止ActiveRecord缓存所有对象并占用内存.

编辑:想出来,感谢@ user2864740和Micah Fivecoate.问题在于将任务发送到Resque,我正在使用Resque Delayable gem(请参阅下面的答案).

这是我正在做的事情:

ssh cron.ec2.company-name.com
cd /var/www/company-name.com/current; bundle exec rails console production
Run Code Online (Sandbox Code Playgroud)

然后,在控制台中:

ActiveRecord::Base.uncached do
  ModelObject.find_each do |obj|
    a = AnotherModelObject.find_by_model_id(obj.id)
    a ||= AnotherModelObject.create!(obj.id)
    a.send_task_to_resque
  end
end
Run Code Online (Sandbox Code Playgroud)

一旦我终止了我的SSH会话,内存就被释放了.

我在Linux上使用ruby 1.9.3p327运行Rails 3.2.15.

我收到了通过SSH会话发回给我的所有SQL查询的文本 - 也许这是保存在内存中的东西?接下来我可能会尝试conf.echo = falseActiveRecord::Base.logger.level = 1.编辑:这没有修复内存使用情况

Max*_*iel 1

问题在于向 Resque 发送任务。感谢@user2864740 提出这个想法。

首先我使用空find_each块进行测试,这并没有导致内存增长。然后我尝试了一个find_each创建 ActiveRecord 对象的块,这并没有导致内存增长。

最后,我测试了一次find_each超记录并发送任务以进行重新请求。仅此一点就导致内存稳步攀升而不是下降。我还应该提到,我正在使用ResqueDelayable gem 将任务分派给 resque,这可能与此有关。