2015-02-19 13 views
5

Ho utilizzato express su node.js in esecuzione su un server heroku per un progetto semplice. Quando ho iniziato a utilizzare la nuova reliquia per monitorare la memoria, ho notato un lento pattern di perdita di memoria. Ho rimosso tutto il codice che ho sviluppato e tutti gli altri moduli del nodo e ho lasciato solo esprimere se stesso e nuovi moduli relic. Osservo ancora la perdita di memoria. Mi chiedevo se si tratta di perdita di memoria express.js. Here is the graphic from new relicExpress.js su Node.js presenta una perdita di memoria?

Qui è tutto il codice a sinistra:

require('newrelic'); 
var express = require('express'); 
var app = express(); 
var env = process.env.NODE_ENV || 'development'; 
if ('development' == env) { 
    app.set('port', process.env.PORT || 3000); 
} 
app.get('/', function (req, res) { 
    res.send('The server is up and running!'); 
}); 
app.listen(app.get('port'), function() { 
    console.log('Express server listening on port %d in %s mode', app.get('port'), app.get('env')); 
}); 

E package.json

{ 
    "name": "memleakdebug", 
    "version": "1.0.0", 
    "description": "", 
    "main": "index.js", 
    "scripts": { 
    "test": "echo \"Error: no test specified\" && exit 1" 
    }, 
    "author": "", 
    "license": "ISC", 
    "dependencies": { 
    "express": "^4.11.2", 
    "newrelic": "^1.16.2" 
    } 
} 

Update1: Ora cresce memoria anche superato 512MB limite di Heroku per livelli liberi. La raccolta dei dati inutili non sembra funzionare.

Memory keeps growing

+2

Quello che hai mostrato è in aumento l'utilizzo della memoria, non necessariamente una perdita. È necessario testare cosa succede quando il sistema viene messo sotto pressione di memoria. 350 MB (il punto più alto nel grafico) non è un grande uso di memoria nei sistemi moderni; V8 potrebbe non essersi preso la briga di fare qualsiasi raccolta dei rifiuti (ancora). –

+0

Il mio codice originale stava facendo un paio di centinaia di richieste http e stava consumando la memoria fino a 1,5 GB. Puoi per favore darmi un semplice esempio e il limite di memoria che posso fare con V8 per fare GC? – user3211198

+0

Il modo più semplice è probabilmente quello di dargli meno memoria. Sono sicuro che Heroku ti dà il controllo su questo. –

risposta

10

Come rispose Lasse, v'è una perdita di memoria a New Relic.

https://discuss.newrelic.com/t/memory-leaking-only-with-node-js-agent-installed/14448

ho sperimentato e rimosso

require('newrelic'); 

Come si può vedere nell'immagine qui sotto, dal momento che ho rimosso l'agente di New Relic non c'è più perdita di memoria.

enter image description here

+0

Update - coleague sta eseguendo Node.js + New Relic senza problemi. Abbiamo trovato l'unica differenza significativa nel fatto che sto eseguendo Node.js v0.12.x e che sta eseguendo 0.10.x. Qualcuno può confermare? – Sax

+1

C'è stata una lunga discussione sulla [New Relic Community] (https: //discuss.newrelic.com/t/node-js-agent-memory-leak/9092/27) e un post di follow up da loro, passando il dollaro su Nodo Core. Ad ogni modo, l'aggiornamento della dipendenza a '1.24.x' sembra averlo risolto (non cambia nulla), almeno per test preliminari. [Nodo0.12] (https://discuss.newrelic.com/t/an-update-on-memory-management-in-node-js-perception-vs-reality/31934) utilizzavano costantemente quantità maggiori di memoria. – nerdwaller

+0

Thx @nerdwaller buono a sapersi. Ti riporto quando faccio un nuovo esperimento. – Sax