2016-07-14 10 views
0

Aus dem Wenigen, das ich über die inneren Abläufe von Ruby weiß, gibt es nur Speicher frei, sobald der Prozess abgeschlossen ist.Wann beendet Sidekiq einen Prozess und gibt so Speicher frei?

Ich debugge einen sehr langen sidekiq Heroku-Prozess mit Speicherproblemen und ich versuche, die Grenzen eines Hintergrundprozesses herauszufinden.

Also ... sagen, ich habe Sidekiq mit 3 Threads, und es läuft 3 Jobs auf einmal, und ich habe 100 Jobs insgesamt. Das heißt, es wird wahrscheinlich nie eine Pause zwischen den Jobs geben, oder? Bedeutet das, dass Speicher erst freigegeben wird, wenn alle 100 Jobs erledigt sind? Ich gehe davon aus, ja, es wird nicht freigegeben, bis die 100 fertig sind.

Aber sagen wir zu 1 Thread wechseln, und die 100 Jobs nacheinander ausgeführt werden. Wird jeder Job nun ein eigener Prozess sein, oder behandelt sidekiq alle diese 100 Jobs in der Warteschlange als einen einzigen Prozess (obwohl er nur einzeln ausgeführt wird)?

Wenn ja ... gibt es eine Möglichkeit, jeden Job zu einem eigenen Prozess zu machen, der den Speicher freigibt, nachdem er fertig ist?

Antwort

1

Ruby verwendet Garbage Collection, um Speicher zurückzufordern. Es wird das Gedächtnis viel schneller freigeben, als Sie denken. Siehe auch https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting#memory-bloat

+0

danke! Das ist tatsächlich ein wirklich nützlicher Link. Aber kennen Sie die Antwort auf die Frage, ob ein Job ein Prozess ist und ob meine Annahmen richtig sind? – andy

+0

Ein Job ist kein Prozess. Sidekiq ist ein Prozess, der standardmäßig 25 Worker-Threads erstellt. Jeder Thread führt parallel im selben Prozess einen Job aus. –