Jak monitorować wykorzystanie pamięci przez Node.js?

114

Jak mogę monitorować wykorzystanie pamięci przez Node.js?

fsiaonma
źródło
4
Trochę więcej szczegółów może być pomocnych
Wottensprels

Odpowiedzi:

66

node-memwatch : wykrywa i znajduje wycieki pamięci w kodzie Node.JS. Sprawdź ten samouczek Śledzenie wycieków pamięci w Node.js.

Damodaran
źródło
1
Node-memwatch nie wydaje się już być żywy (ostatnia aktualizacja w marcu 2013). Czy są jakieś alternatywy?
Golo Roden
6
@GoloRoden npm install memwatch-next działa dobrze. Oto repozytorium: github.com/marcominetti/node-memwatch
fre2ak
Bardziej aktualne źródło informacji o wyszukiwaniu wycieków pamięci apmblog.dynatrace.com/2015/11/04/…
saintedlama
22
memwatch nie jest już utrzymywany i nie będzie działał na najnowszej wersji node, więc nawet nie przejmuj się.
Mike
153

Wbudowany moduł procesu ma metodę, memoryUsagektóra zapewnia wgląd w wykorzystanie pamięci przez bieżący proces Node.js. Oto przykład z Node v0.12.2 w systemie 64-bitowym:

$ 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 }

W tym prostym przykładzie widać, że przydzielenie tablicy 10 mln elementów konsumenci wynosi około 80 MB (spójrz na heapUsed).
Jeśli spojrzeć na kod źródłowy V8 ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), to zobaczysz, że pamięć używana przez tablicy jest wartością stałą plus długość pomnożona przez wielkość wskaźnika. Ta ostatnia zajmuje 8 bajtów w systemie 64-bitowym, co potwierdza, że ​​zaobserwowana różnica pamięci wynosząca 8 x 10 = 80 MB ma sens.

Rob W
źródło
1
@MestreSan Która wersja Node nie potrzebuje --expose-gctej gcfunkcji?
Rob W
1
@MestreSan Nigdy nie powiedziałem, że trzeba --expose-gcza process.memoryUsage(). gc()(require --expose-gc) został użyty w odpowiedzi do deterministycznego wyzwalania czyszczenia pamięci, aby łatwiej było zobaczyć, jakie process.memoryUsageraporty.
Rob W
To niesamowita odpowiedź na pomiar JS-Stuff we właściwy sposób. Dziękuję za odpowiedź.
suther
Wykonałeś pracę panów z tym. Właśnie zdałem sobie sprawę ze wszystkich metod ujawnionych przez wywołanie procesu, który pomoże mi stworzyć bardziej wydajną aplikację. Dzięki.
Andrew
40

Ponadto, jeśli chcesz poznać pamięć globalną, a nie proces węzłowy:

var os = require('os');

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

Zobacz dokumentację

Voy
źródło
1
Jednak funkcja freemem () nie jest tym samym, co pamięć dostępna na serwerze. Jakiś sposób na znalezienie dostępnej pamięci zamiast wolnej?
Alex
5

W systemie Linux / Unix (uwaga: Mac OS to Unix) użyj topi naciśnij M ( Shift+M ), aby posortować procesy według użycia pamięci.

W systemie Windows użyj Menedżera zadań.

Robin Green
źródło
@majidarif Przejdź do, Applications > Utilitiesa znajdziesz Activity Monitoraplikację. Ten jest odpowiednikiem Menedżera zadań. OS X również ma toppolecenie.
Ingwie Phoenix
3
użyj htopzamiast góry w systemie Linux. Jest dużo lepiej.
Ryan Shillington