Como monitorar o uso de memória do Node.js?

114

Como posso monitorar o uso de memória do Node.js?

fsiaonma
fonte
4
Um pouco mais de detalhes podem ser úteis
Wottensprels

Respostas:

66

node-memwatch : detecta e encontra vazamentos de memória no código Node.JS Confira este tutorial Rastreando Vazamentos de Memória em Node.js

Damodaran
fonte
1
node-memwatch não parece estar mais vivo (última atualização em março de 2013). Existem alternativas?
Golo Roden
6
@GoloRoden npm install memwatch-next funciona bem. Aqui está o repo: github.com/marcominetti/node-memwatch
fre2ak
Um recurso mais atualizado para localizar vazamentos de memória apmblog.dynatrace.com/2015/11/04/…
saintedlama 01 de
22
memwatch não é mais mantido e não funcionará em uma versão recente do nó, então nem se preocupe.
Mike
153

O módulo de processo integrado possui um método memoryUsageque oferece uma visão sobre o uso de memória do processo Node.js. Aqui está um exemplo do Node v0.12.2 em um sistema de 64 bits:

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

Neste exemplo simples, você pode ver que alocar uma matriz de 10 milhões de elementos consumidores de aproximadamente 80 MB (dê uma olhada em heapUsed).
Se você olhar para o código-fonte do V8 ( Array::New, Heap::AllocateRawFixedArray, FixedArray::SizeFor), então você vai ver que a memória usada por uma matriz é um valor fixo mais o comprimento multiplicado pelo tamanho de um ponteiro. O último é de 8 bytes em um sistema de 64 bits, o que confirma que a diferença de memória observada de 8 x 10 = 80 MB faz sentido.

Rob W
fonte
1
@MestreSan Qual versão do Node não precisa --expose-gcpara a gcfunção?
Rob W
1
@MestreSan Eu nunca disse que você precisa --expose-gcpara process.memoryUsage(). gc()(exigindo --expose-gc) foi usado na resposta para acionar de forma determinística a coleta de lixo para tornar mais fácil ver o que os process.memoryUsagerelatórios.
Rob W
Essa é uma resposta incrível para medir o JS-Stuff da maneira certa. Obrigado por essa resposta.
suther
Você fez os senhores trabalharem com este. Acabei de perceber todos os métodos expostos por chamar process que me ajudarão a criar um aplicativo mais eficiente. Obrigado.
Andrew
40

Além disso, se você quiser saber a memória global em vez do processo de nó ':

var os = require('os');

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

Veja a documentação

Voy
fonte
1
No entanto, freemem () não é igual à memória disponível no servidor. Existe alguma maneira de encontrar memória disponível em vez de livre?
Alex
5

No Linux / Unix (nota: Mac OS é um Unix), use tope pressione M ( Shift+ M) para classificar os processos por uso de memória.

No Windows, use o Gerenciador de Tarefas.

Robin Green
fonte
@majidarif Vá para Applications > Utilitiese você encontrará um Activity Monitoraplicativo. Esse é o equivalente ao Gerenciador de Tarefas. O OS X também tem o topcomando.
Ingwie Phoenix
3
use em htopvez de superior no Linux. É muito melhor.
Ryan Shillington