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

114

Wie kann ich die Speichernutzung von Node.js überwachen?

fsiaonma
quelle
4
Ein bisschen mehr Details könnten hilfreich sein
Wottensprels

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

Damodaran
quelle
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.

Rob W.
quelle
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

Voy
quelle
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
28

Die ursprüngliche Memwatch ist im Wesentlichen tot. Versuchen Sie stattdessen memwatch-next , das auf modernen Node-Versionen gut zu funktionieren scheint.

Joel
quelle
2
Der König ist tot; Es lebe der König: npmjs.com/package/node-memwatch
Frank Meulenaar
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.

Robin Green
quelle
@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