2013-06-04 6 views
5

Ich habe versucht, einen 2X Arbeiter dyno zu verwenden, warten nicht R14 Fehler zu bekommen, aber das ist das Ergebnis:Heroku Arbeiter dyno R14 Fehler geben - Probleme mit der Speicherverwaltung - RMagick Speicherlimit Optionen

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) 

Die Aufgabe für den Arbeiter wird jedoch erfolgreich beendet.

Fragen:

  • Wie kann ich den benötigten Speicher für meine Arbeit abnehmen? - Ich benutze rmagick gem, um eine Liste von Bildern in ein mehrseitiges PDF zu konvertieren.
  • Wie gefährlich ist es, den Prozess so zu halten (mit R14-Fehlern), wie der letzte Job erfolgreich abgeschlossen wird?

Vielen Dank im Voraus

+0

Führen Sie nur einen dieser Jobs gleichzeitig in sidekiq aus? Das heißt, nimmt 1 Job 1 Gig Speicher? –

+0

Es scheint, dass der Edelstein rmagick, den ich auch verwende, Speicherlecks hat: http://stackoverflow.com/questions/958681/how-to-deal-with-memory-leaks-in-rmagick-in-ruby – josal

Antwort

5

ich endlich eine Lösung gefunden. Das Problem war mit Rmagick. Es erhält den gesamten verfügbaren Speicher. Es spielt keine Rolle, ob Sie einen 2X-Arbeiterprüfstand anstelle eines 1X-Prüfstands verwenden. Es wächst auf die maximal verfügbaren Ressourcen. Also, we have to set a limit. Aber in meinem Fall funktionierten nicht alle Grenzen.

Sie können einen Systemaufruf direkt auf diese Weise machen:

convert -limit memory 0 -limit map 0 list_of_input_files output_file

Auf diese Weise, können Sie den Cache-Speicher verwenden vermeiden, direkt auf die Disk-Cache gehen. Dies ist der einzige Weg, den ich gefunden habe, um R14 Fehler in heroku zu vermeiden. Bei anderen Kombinationen wie -limit memory 32 -limit map 64 oder ähnlichem gab es mir immer Fehler. Ich nahm die Idee from here.

Natürlich könnte man immer die rmagick library mit diesen Linien verwenden, jedoch hat es nicht für mich zu arbeiten und ich habe erklärt, die syscall Ansatz verwenden, vor:

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

UPDATE: ich verwendet habe, die nice Befehl, um mehr Priorität sicherzustellen. Es scheint, dass es sich verbessert, aber irgendwann bekomme ich R14-Fehler, aber es ist wahr, sie sind nicht so oft (sogar mit der gleichen Datei!).

+0

Vielleicht Sie sollten versuchen [minimagick] (https://github.com/minimagick/minimagick) – shinnyx

+0

Ich habe es versucht, aber ich kann mich jetzt nicht erinnern, warum ich es nicht gewählt habe. Danke trotzdem. – josal

+0

Great find @josai – Trip

0

Ein wenig zu spät für die Party, aber in meinem Fall war der Müllsammler mein Retter. Führen Sie nach jedem Job einfach GC.start aus.

+0

Danke für Ihre Antwort. – josal