【问题标题】:Heroku worker dyno giving R14 errors - problems with memory management - rmagick memory limit optionsHeroku worker dyno 给出 R14 错误 - 内存管理问题 - rmagick 内存限制选项
【发布时间】:2013-05-30 21:48:37
【问题描述】:

我尝试使用 2X worker dyno,等待不出现 R14 错误,但结果如下:

2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Process running mem=1047M(102.3%)
2013-06-04T13:03:30.723260+00:00 heroku[worker.1]: Error R14 (Memory quota exceeded)

但是,worker 的任务已经成功完成。

问题:

  • 如何减少工作所需的内存? - 我正在使用 rmagick gem 将图像列表转换为单个多页 pdf。
  • 在最终作业成功完成时保持这样的流程(存在 R14 错误)有多危险?

提前致谢

【问题讨论】:

  • 您在 sidekiq 中一次只运行其中一项作业吗?也就是说,一份工作需要 1 个内存吗?
  • 看来我也在使用的 gem rmagick 有内存泄漏:stackoverflow.com/questions/958681/…

标签: ruby-on-rails heroku sidekiq rmagick


【解决方案1】:

我终于找到了解决办法。问题出在 rmagick 上。它获取它看到的所有可用内存。如果您使用 2X 工人测功机而不是 1X 测功机,这并不重要。它增长到最大的可用资源。所以,we have to set a limit。但就我而言,并非所有限制都有效。

你可以这样直接进行系统调用:

convert -limit memory 0 -limit map 0 list_of_input_files output_file

这样,您可以避免使用内存缓存,直接进入磁盘缓存。 这是我发现在 heroku 中避免 R14 错误的唯一方法。使用-limit memory 32 -limit map 64 或类似的其他组合,它总是给我错误。我接受了from here的想法。

当然,您可以随时使用 rmagick library 与此行,但它对我不起作用,我确实使用了之前解释的系统调用方法:

Magick.limit_resource(:memory, 0)
Magick.limit_resource(:map, 0)

更新:我使用了nice 命令来确保更高的优先级。它似乎有所改善,但最终我遇到了 R14 错误,但确实它们并不常见(即使使用相同的文件!)。

【讨论】:

  • 我试过了,但我现在不记得为什么我没有选择它。还是谢谢。
  • 对不起,你从哪里调用这个系统调用?
  • 红宝石中的system()函数:-)
  • 简单但高效!谢谢!
  • 我猜不仅是 rmagick,而且是它和 heroku 的结合......最后,我不得不适应 heroku 规格,这就是我对 rmagick 罚款的原因
【解决方案2】:

聚会有点晚了,但就我而言,垃圾收集器是我的救星。只需在每个作业后运行GC.start

【讨论】:

  • 感谢您的回答。
猜你喜欢
  • 2020-11-23
  • 2022-01-04
  • 2020-11-01
  • 2017-04-16
  • 1970-01-01
  • 2013-10-01
  • 2014-07-14
  • 2013-10-14
  • 2023-03-28
相关资源
最近更新 更多