【问题标题】:Delayed Jobs leaking memory?延迟作业泄漏内存?
【发布时间】:2011-03-09 05:50:17
【问题描述】:

我在我的 Ruby on Rails 应用程序 (v2.3.8) 中使用 collectiveidea's delayed_job,并在 8GB RAM Slicehost 机器(Ubuntu 10.04 LTS,Apache 2)上运行大约 40 个后台作业。

假设我在没有工作人员运行的情况下通过 ssh 进入我的服务器。当我执行free -m 时,我发现我通常使用 8 个 RAM 中的大约 1GB。然后在启动工作人员并等待大约一分钟让代码使用它们之后,我最多大约 4GB .如果我在一两个小时后回来,我将达到 8GB 并进入交换内存,我的网站将产生 502 错误。

到目前为止,我一直在杀死工人并重新启动他们,但我宁愿解决问题的根源。有什么想法吗?这是内存泄漏吗?或者,按照朋友的建议,我是否需要想办法运行垃圾回收?

【问题讨论】:

  • 这听起来像是内存泄漏,但它可以在你的deleayed_job运行的代码中,它一定不能在delayed_job中。一些要审查的代码可能会有所帮助。
  • 还要记住,1.9 和 1.8 永远不会将内存还给操作系统。

标签: ruby-on-rails apache ubuntu memory-leaks delayed-job


【解决方案1】:

几乎每次有人问这个问题时,问题就出在他们的代码中。尝试使用一种可用的分析工具来查找您的工作泄漏的位置。 (https://github.com/wycats/ruby-prof 或类似的。)

在每个作业结束时触发 GC 会降低您的最大内存使用量,但会降低吞吐量。但是,它不会阻止 Ruby 膨胀到任何单个作业所需的最大大小,因为 Ruby 无法将内存释放回操作系统。我不建议采用这种方法。

【讨论】:

    【解决方案2】:

    实际上,如果您的模型具有序列化属性,Delayed::Job 3.0 会在 Ruby 1.9.2 中泄漏内存。 (我正在研究解决方案。)

    有人似乎已经解决了这个问题,http://spacevatican.org/2012/1/26/memory-leak-in-yaml-on-ruby-1-9-2

    这是来自 Delayed::Job https://github.com/collectiveidea/delayed_job/issues/336 的问题

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-06-27
      • 1970-01-01
      • 1970-01-01
      • 2017-03-30
      • 2012-04-20
      • 1970-01-01
      • 2016-03-29
      相关资源
      最近更新 更多