2013-06-04 26 views
5

我試圖使用2X工人測功機,等待沒有得到R14的錯誤,不過這是結果:Heroku的工人賽道給R14的錯誤 - 問題與內存管理 - rmagick內存限制選項

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錯誤)有多危險?

在此先感謝

+0

您是否僅在sidekiq中同時運行這些工作中的1個?也就是說,1個工作需要1個內存? –

+0

它似乎像我也使用的寶石rmagick有內存泄漏:http://stackoverflow.com/questions/958681/how-to-deal-with-memory-leaks-in-rmagick-in-ruby – josal

回答

5

我終於找到了解決辦法。問題出在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

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

UPDATE:

當然,你總是可以使用rmagick library本線,但它並沒有爲我工作,我沒有使用系統調用的方式解釋之前我用的nice命令來確保更高的優先級。它似乎有所改善,但最終我得到了R14錯誤,但確實如此,它們並不經常(即使使用相同的文件!)。

+0

也許你應該嘗試[minimagick](https://github.com/minimagick/minimagick) – shinnyx

+0

我試過了,但我現在不記得爲什麼我沒有選擇它。不管怎麼說,還是要謝謝你。 – josal

+0

大發現@ josai – Trip

0

晚會有點晚,但在我的情況下,垃圾收集器是我的救世主。每次工作後,運行GC.start

+0

感謝您的回答。 – josal