2010-06-28 6 views
5

Ich benutze collectiveidea's delayed_job mit meiner Ruby on Rails App (v2.3.8) und laufe ungefähr 40 Hintergrundjobs damit auf einem 8GB RAM Slicehost Rechner (Ubuntu 10.04 LTS, Apache 2).Verzögerte Jobs undichtem Speicher?

Sagen wir, ich ssh in meinen Server ohne Arbeiter laufen. Wenn ich free -m mache, sehe ich, dass ich im Allgemeinen ungefähr 1GB RAM von 8 benutze. Nachdem ich die Arbeiter gestartet habe und ungefähr eine Minute gewartet habe, bis sie vom Code genutzt werden, bin ich bis zu 4GB. Wenn ich in ein oder zwei Stunden zurückkomme, bin ich bei 8GB und im Swap-Speicher und meine Website wird 502 Fehler erzeugen.

Bis jetzt habe ich gerade die Arbeiter getötet und neu gestartet, aber ich würde lieber die Wurzel des Problems beheben. Irgendwelche Gedanken? Ist das ein Speicherleck? Oder, wie ein Freund vorgeschlagen hat, muss ich eine Möglichkeit finden, die Garbage Collection auszuführen?

+0

Es klingt wie ein Speicherleck, aber es kann in Ihrem Code sein, der von delayed_job ausgeführt wird, er darf nicht in delayed_job sein. Ein Code zur Überprüfung könnte helfen. – jigfox

+0

Denken Sie auch daran, dass 1.9 und 1.8 dem Betriebssystem niemals Speicher zurückgeben werden. – tliff

Antwort

-3

Fast jedes Mal, wenn jemand danach fragt, liegt das Problem in ihrem Code. Versuchen Sie, eines der verfügbaren Profiling-Tools zu verwenden, um zu ermitteln, wo Ihr Job undicht ist. (https://github.com/wycats/ruby-prof oder ähnlich.)

Das Auslösen von GC am Ende jedes Jobs reduziert Ihre maximale Speicherauslastung auf Kosten des Durchschlags Ihres Durchsatzes. Es wird Ruby jedoch nicht daran hindern, auf die maximale Größe aufzublähen, die für einen einzelnen Job erforderlich ist, da Ruby den Speicher nicht an das Betriebssystem zurückgeben kann. Ich empfehle diesen Ansatz nicht.