2015-02-15 13 views
5

Ich war mit meinem Server mit pm2 start ... und pm2 monit zeigte mir 3GB memory nach 2 Stunden. Also habe ich memwatch angeschlossen, nun habe ich noch 2 Stunden gewartet und wieder ist der von pm2 monit angezeigte Speicher 3GB erreicht.Node.JS Speicherverlust mit PM2

Also überprüfte ich die Protokolle memwatch generiert. Zeigte mir:

{ before: { nodes: 75659, size_bytes: 11141702, size: '10.63 mb' }, 
    after: { nodes: 73226, size_bytes: 10840598, size: '10.34 mb' }, 
    change: 
    { size_bytes: -301104, 
    size: '-294.05 kb', 
    freed_nodes: 5141, 
    allocated_nodes: 2708, 

Und ein anderer:

{ before: { nodes: 72591, size_bytes: 10728318, size: '10.23 mb' }, 
    after: { nodes: 73284, size_bytes: 10798062, size: '10.3 mb' }, 
    change: 
    { size_bytes: 69744, 
    size: '68.11 kb', 
    freed_nodes: 5931, 
    allocated_nodes: 6620, 

Jetzt bin ich wirklich verwirrt, das sind die letzten Protokolle so dass ich ziemlich sicher bin, das sind die Protokolle erzeugt, wenn pm2 monit den riesigen Speicherverlust zeigte.

Also, warum ist memwatch zeigt mir 10MB+ speicher und pm2 monit zeigt 3GB+?


Schalen Nun zu etwas wie forever oder monit zu sehen, ob das Leck noch existiert.


Ein bisschen mehr Hintergrund

  • Ich habe versucht, das Leck zu profilieren und zu finden und es ist nicht irgendein Leck zeigt auf den Profilen.
  • Der Memwatch-Vergleich wird gestartet, wenn ein Client eine Verbindung herstellt und die Differenz beim Trennen des Clients auftritt.
+0

Darüber habe ich versucht, es für die letzten 2 Tage zu profilieren und kann einfach nicht das Problem finden. Also entschied ich mich, nach Golang zu gehen, was erstaunlich ist, große Speicher- und Leistungsunterschiede. Sehr effizient. Endlich keine verwirrenden Lecks. Plus, es ist ziemlich einfach zu kodieren, umkodierte Javascript zu Golang in weniger als einem Tag. – majidarif

Antwort

3
  • Ich war auch mit Blick auf das gleiche Problem, aber nach wenig Forschung fand ich, dass NodeJS nicht wird der Garbage Collector aufrufen, wenn PM2 verwenden. So
  • , bis PM2 Fixes, die um Leiharbeit Ausgabe von Garbage Collector Kraft Anruf ist, mit folgenden

PM2 app.js --node-args = Start '- belichten-gc'

Über Argument --expose-gc wird es uns ermöglichen, Aufruf Garbage Collector von Knoten js zu erzwingen, jetzt folgenden Code für Kraft Garage Sammlung verwenden.

if (global.gc) { 
    global.gc(); 
} else { 
    console.log('Garbage collection unavailable. use --expose-gc ' 
    + 'when launching node to enable forced garbage collection.'); 
} 

Dies wird PM2 Meomry Leck Problem zu lösen.

+4

Können Sie die Quelle für 'bereitstellen, aber nach wenig Forschung fand ich, dass Nodejs nicht den Garbage Collector bei Verwendung von PM2 aufrufen. Vielen Dank. – majidarif