2016-05-27 23 views
0

Ich benutze Sidekiq 4.1.2 als Hintergrund Job-Prozessor auf Heroku (mit Heroku Redis 3.2.0).Sidekiq Speicherleck auf Heroku

Problem ist, Sidekiq Prozess verbraucht mehr Speicher mit jeder Minute und geht nie unter. Manchmal dauert es nur 10 Minuten von 300MB auf 2Gb zu wachsen (dann stirbt es schrecklich). Natürlich war mein erster Gedanke "Oh, sieht so aus, als hätte ich die Speicherverwaltung meines Hintergrundjobs vermasselt!".

Die Art meiner Hintergrund-Jobs ist, dass sie eine lange Zeit dauern, und sie erstellen viele Objekte, die in DB gespeichert und nicht erneut verwendet werden. So habe ich periodische manuelle Garbage Collector-Aufrufe hinzugefügt: GC.start nach jeweils 1000 verarbeiteten Objekten.

Ich testete es auf meinem lokalen Rechner und war erleichtert: Sidekiq Prozess mit 10 Threads blieb unter 500MB. Dann habe ich diesen Code auf Heroku implementiert, aber leider war Sidekiqs unersättlicher Speicherhunger immer noch vorhanden: Der Speicherverbrauch steigt nur an und nimmt nie ab, trotz des periodischen manuellen Starts von Garbage Collector.

Daher das Problem folgt: der gleiche Code nicht auf meinem Gerät leckt, aber Leak auf Heroku. Was kann ein solches Verhalten verursachen? Was soll ich tun, um es zu lokalisieren?

+0

Sind Sie sicher, dass der Code threadsicher ist? Könnte einen Blick auf https://github.com/mperham/sidekiq/wiki/Problems-and-Troubleshooting geben – DMH

+0

Laufen Sie Ruby 2.1 auf Heroku? –

+0

Ich hatte ein ähnliches Problem neulich, das mich denken ließ, dass es sidekiq war, aber es endete, dass mein Vermögen in einer Reihenfolge geladen wurde, die zu einem massiven Leck führte. Ich würde sagen, wenn es an Ihrem lokalen arbeitet, dann ist etwas in Ihrer Produktionskonfiguration. Das führt irgendwie zu diesem Problem. Für mich war es, dass Assets vorkompiliert werden und somit die Reihenfolge geändert wurde. Für Sie wird es etwas anderes sein, aber aus dieser Denkweise heraus zu kommen könnte Ihnen helfen. – bkunzi01

Antwort

1

Es war einer der Edelsteine ​​in der :production Gruppe. Ich benutzte es für das Profiling und es sieht so aus, als wäre es eine schlechte Arbeit. Ich habe es durch ein ähnliches Juwel ersetzt und jetzt gibt es kein Speicherleck mehr.