6

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

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

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

4

2 回答 2

6

实际上,如果您的模型具有序列化属性,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的问题

于 2012-04-03T16:33:19.693 回答
-2

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

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

于 2012-03-14T14:11:30.127 回答