【问题标题】:How can I prevent my Rails query from maxing out memory如何防止我的 Rails 查询耗尽内存
【发布时间】:2013-12-06 02:19:34
【问题描述】:

我正在连接到运行我的 Rails 应用程序的服务器以运行查询。尽管使用了find_each,服务器的内存被我的控制台会话占用了,我不知道为什么。 Based on this SO answer,我也在使用 ActiveRecord::Base.uncached 来防止 ActiveRecord 缓存所有对象并占用内存。

编辑:感谢@user2864740 和 Micah Fivecoate。问题在于向 Resque 发送任务,我正在使用 Resque 可延迟 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编辑:这并没有修复内存使用情况

【问题讨论】:

  • 也许有太多东西被发送到 resque “太快”了? (我不确定 resque 是如何工作的,但我怀疑它是相关的。)将查询文本发送回 IO/SSH 流不应该产生任何压力,因为当缓冲区 阻塞时填充。
  • @user2864740 你是对的;发回查询文本没有任何区别。好电话

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


【解决方案1】:

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

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

最后,我测试了对记录执行find_each 并将任务发送到 resque。仅此一项就使记忆稳步攀升而不是下降。我还应该提到我正在使用ResqueDelayable gem 将任务分派给 resque,这可能会受到影响。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-25
    • 1970-01-01
    • 2022-01-03
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多