Wie kann die Speichernutzung von Node.js überwacht werden?


Antworten:


66

Node-Memwatch : Erkennen und Auffinden von Speicherlecks im Node.JS-Code. Überprüfen Sie dieses Tutorial, um Speicherlecks in Node.js aufzuspüren


1
node-memwatch scheint nicht mehr zu leben (zuletzt aktualisiert im März 2013). Gibt es Alternativen?
Golo Roden

6
@GoloRoden npm install memwatch-next funktioniert einwandfrei. Hier ist das Repo: github.com/marcominetti/node-memwatch
fre2ak

Eine aktuellere Ressource für die Suche
saintedlama

22
memwatch wird nicht mehr gewartet und funktioniert nicht mit einer neueren Version von node, also kümmere dich nicht einmal darum.
Mike


152

Das integrierte Prozessmodul verfügt über eine Methode memoryUsage, die Einblick in die Speichernutzung des aktuellen Node.js-Prozesses bietet. Hier ist ein Beispiel aus Node v0.12.2 auf einem 64-Bit-System:

$ node --expose-gc
> process.memoryUsage();  // Initial usage
{ rss: 19853312, heapTotal: 9751808, heapUsed: 4535648 }
> gc();                   // Force a GC for the baseline.
undefined
> process.memoryUsage();  // Baseline memory usage.
{ rss: 22269952, heapTotal: 11803648, heapUsed: 4530208 }
> var a = new Array(1e7); // Allocate memory for 10m items in an array
undefined
> process.memoryUsage();  // Memory after allocating so many items
{ rss: 102535168, heapTotal: 91823104, heapUsed: 85246576 }
> a = null;               // Allow the array to be garbage-collected
null
> gc();                   // Force GC (requires node --expose-gc)
undefined
> process.memoryUsage();  // Memory usage after GC
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4528072 }
> process.memoryUsage();  // Memory usage after idling
{ rss: 23293952, heapTotal: 11803648, heapUsed: 4753376 }

In diesem einfachen Beispiel sehen Sie, dass das Zuweisen eines Arrays von 10 Millionen Elementen ungefähr 80 MB kostet (siehe heapUsed).
Wenn Sie bei V8 Quellcode aussehen ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), dann sehen Sie, dass die von einem Array verwendeten Speicher ist ein fester Wert plus der von der Größe eines Zeigers multipliziert Länge. Letzteres beträgt 8 Bytes auf einem 64-Bit-System, was bestätigt, dass eine beobachtete Speicherdifferenz von 8 x 10 = 80 MB sinnvoll ist.


1
@MestreSan Welche Version von Node wird --expose-gcfür die gcFunktion nicht benötigt ?
Rob W

1
@MestreSan Ich habe nie gesagt, dass Sie --expose-gcfür brauchen process.memoryUsage(). gc()(erforderlich --expose-gc) wurde in der Antwort verwendet, um die Speicherbereinigung deterministisch auszulösen, damit die process.memoryUsageBerichte leichter angezeigt werden können.
Rob W

Das ist eine großartige Antwort, um JS-Stuff richtig zu messen. Vielen Dank für diese Antwort.
Suther

Sie haben die Lords mit diesem gearbeitet. Ich habe gerade alle Methoden erkannt, die durch den Aufruf von process verfügbar gemacht wurden, um eine effizientere Anwendung zu erstellen. Vielen Dank.
Andrew vor

40

Wenn Sie den globalen Speicher und nicht den Knotenprozess kennen möchten:

var os = require('os');

os.freemem();
os.totalmem();

Siehe Dokumentation


1
Freemem () entspricht jedoch nicht dem verfügbaren Speicher auf dem Server. Gibt es eine Möglichkeit, verfügbaren Speicher statt freien zu finden?
Alex


5

Verwenden Sie unter Linux / Unix (Hinweis: Mac OS ist ein Unix) topund drücken Sie M ( Shift+ M), um Prozesse nach Speichernutzung zu sortieren.

Verwenden Sie unter Windows den Task-Manager.


@majidarif Gehen Sie zu Applications > Utilitiesund Sie finden eine Activity MonitorApp. Dieser entspricht dem Task-Manager. OS X hat auch den topBefehl.
Ingwie Phoenix

3
Verwenden Sie htopanstelle von Top unter Linux. Es ist viel besser.
Ryan Shillington
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.