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

时间:2013-12-06 02:19:34

标签: ruby-on-rails ruby memory activerecord ssh

我正在运行运行Rails应用程序的服务器以运行查询。尽管使用find_each,服务器的内存会被我的控制台会话吃掉,我不知道为什么。 Based on this SO answer,我还使用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

然后,在控制台中:

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

一旦我终止了SSH会话,就会释放内存。

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

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

1 个答案:

答案 0 :(得分:1)

问题在于将任务发送给Resque。感谢@ user2864740有这个想法。

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

最后,我测试了对记录执行find_each并发送任务以重新启动。仅这一点就会使记忆稳步攀升而不会下降。我还应该提到我正在使用ResqueDelayable gem将任务分配给resque,这可能与此有关。