5

我尝试使用 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)

但是,工人的任务已成功完成。

问题:

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

提前致谢

4

2 回答 2

5

我终于找到了解决方案。问题出在 rmagick 上。它获取它看到的所有可用内存。如果您使用 2X 工人测功机而不是 1X 测功机,这并不重要。它增长到最大的可用资源。所以,我们必须设置一个限制。但就我而言,并非所有限制都有效。

您可以通过这种方式直接进行系统调用:

convert -limit memory 0 -limit map 0 list_of_input_files output_file

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

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

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

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

于 2013-06-10T07:31:26.933 回答
0

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

于 2017-10-27T13:11:03.583 回答