2015-02-15 16 views
5

Stavo eseguendo il mio server con pm2 start ... e pm2 monit mi mostrava 3GB memory dopo 2 ore. Così ho attaccato memwatch, ora ho aspettato per altre 2 ore e ancora una volta la memoria mostrata da pm2 monit ha raggiunto 3GB.Perdita di memoria Node.JS con PM2

Quindi, ho controllato i registri memwatch generato.

{ 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, 

E un altro:: mi ha mostrato

{ 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, 

ora sono davvero confuso, questi sono gli ultimi ceppi quindi sono abbastanza sicuro che quelli sono i log generati quando pm2 monit ha mostrato l'enorme perdita di memoria.

Quindi, perché memwatch mi mostra 10MB+ memoria e pm2 monit che mostra 3GB+?


Ora passare a qualcosa di simile a forever o monit per vedere se la perdita esiste ancora.


Un po 'più di fondo

  • ho cercato al profilo e trovare la perdita e non c'è solo qualsiasi mostra perdite sui profili.
  • Il memwatch diff viene avviato quando un client si connette e la differenza viene eseguita quando il client si disconnette.
+0

Informazioni su questo, stavo cercando di profilare il profilo per gli ultimi 2 giorni e non riesco a trovare il problema. Così alla fine ho deciso di trasferirmi in Golang, che è sorprendente, con enormi differenze di memoria e prestazioni. Molto efficiente. Finalmente nessuna falla confusa. Inoltre è piuttosto semplice da codificare, ricodificato in JavaScript per meno di un giorno. – majidarif

risposta

3
  • Sono stato anche affrontando lo stesso problema, ma dopo poche ricerche ho scoperto che nodejs non sta chiamando il garbage collector quando si utilizza PM2.
  • Quindi, fino a quando le correzioni PM2 che emettono il lavoro temporaneo in giro è la forza chiamata garbage collector, utilizzando seguente

PM2 iniziare app.js --node-args = '- esporre-gc'

Sopra l'argomento --expose-gc ci consentirà di forzare la chiamata del garbage collector dal nodo js, ​​ora utilizzare il seguente codice per forzare la raccolta del garage.

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

Questo risolverà il problema di perdita di meomry PM2.

+4

Puoi fornire il sorgente per "ma dopo una piccola ricerca ho trovato che nodejs non chiama il garbage collector quando usa pm2". Grazie. – majidarif