2015-02-19 9 views
5

Ich habe Express auf node.js auf einem Heroku-Server für ein einfaches Projekt verwendet. Als ich begann, ein neues Relikt zu verwenden, um den Speicher zu überwachen, bemerkte ich ein langsames Speicherleckmuster. Ich entfernte den gesamten Code, den ich entwickelte und alle anderen Knotenmodule und verließ nur sich selbst und neue Reliquiemodule. Ich beobachte immer noch das Speicherleck. Ich frage mich, ob dies Express.js Speicherverlust ist. Here is the graphic from new relicHat Express.js auf Node.js einen Speicherverlust?

Hier ist der gesamte Code links:

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')); 
}); 

Und 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: Jetzt wachsenden Speicher sogar Heroku der Grenze 512 MB kostenlos Ebenen übergeben. Müllsammlung scheint nicht zu funktionieren.

Memory keeps growing

+2

Was Sie gezeigt haben, ist zunehmende Speichernutzung, die nicht unbedingt ein Leck. Sie müssen testen, was passiert, wenn das System unter Speicherdruck steht. 350 MB (der oberste Punkt in Ihrem Diagramm) ist nicht viel Speicherverbrauch auf modernen Systemen; V8 hat sich vielleicht (noch) nicht darum gekümmert, eine Speicherbereinigung durchzuführen. –

+0

Mein ursprünglicher Code bestand aus ein paar hundert HTTP-Anfragen, und die Speicherauslastung stieg auf 1,5 GB. Kannst du mir bitte ein einfaches Beispiel geben und das Speicherlimit, dass ich V8 machen kann, GC machen? – user3211198

+0

Der einfachste Weg ist wahrscheinlich, weniger Speicher zu geben. Ich bin sicher, Heroku gibt dir die Kontrolle darüber. –

Antwort

10

Als Lasse antwortete, gibt es ein Speicherleck in New Relic.

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

Ich experimentierte und

require('newrelic'); 

entfernt Wie Sie im Bild unten sehen können, da ich das New Relic Mittel entfernt kein Leck mehr Speicher ist.

enter image description here

+0

Update - coleague läuft Node.js + New Relic ohne Probleme. Wir fanden den einzigen wesentlichen Unterschied, dass ich Node.js v0.12.x laufen lasse und er läuft 0.10.x. Kann jemand bestätigen? – Sax

+1

Es gab eine große Diskussion über die [New Relic Community] (https: //discuss.newrelic).com/t/node-js-agent-memory-leak/9092/27) und einen Follow-up-Post von ihnen, den Buck auf Node Core übergeben. Die Aktualisierung der Abhängigkeit zu "1.24.x" scheint diese jedoch gelöst zu haben (nichts anderes ändert sich), zumindest pro Vortest. [Node0.12] (https://discuss.newrelic.com/t/an-update-on-memory-management-in-node-js-perception-vs-reality/31934) verwendete konsistent höhere Speichermengen. – nerdwaller

+0

Thx @nerdwaller gut zu wissen. Ich melde mich zurück, wenn ich ein neues Experiment mache. – Sax

Verwandte Themen