In realtà ho avuto lo stesso problema con nodo in esecuzione su heroku con istanze da 1 GB.
Durante l'esecuzione del server nodo sul traffico di produzione, la memoria aumentava costantemente fino a quando non superava il limite di memoria, causandone l'esecuzione lentamente.
Questo è probabilmente causato dall'app che genera molta spazzatura, serve principalmente le risposte API JSON. Ma non era una perdita di memoria, solo spazzatura non raccolta.
Sembra che il nodo non abbia la priorità di fare abbastanza raccolte di dati inutili sul vecchio spazio oggetti per la mia app, quindi la memoria crescerà costantemente.
Eseguire global.gc() manualmente (abilitato con nodo --expose_gc) ridurrebbe l'utilizzo della memoria di 50 MB ogni volta e metterebbe in pausa l'app per circa 400ms.
Quello che ho finito è eseguire gc manualmente su una pianificazione randomizzata (in modo che le istanze di heroku non facessero GC tutto in una volta). Ciò ha ridotto l'utilizzo della memoria e ha fermato la quota di memoria ha superato gli errori.
Una versione semplificata potrebbe essere qualcosa di simile:
function scheduleGc() {
if (!global.gc) {
console.log('Garbage collection is not exposed');
return;
}
// schedule next gc within a random interval (e.g. 15-45 minutes)
// tweak this based on your app's memory usage
var nextMinutes = Math.random() * 30 + 15;
setTimeout(function(){
global.gc();
console.log('Manual gc', process.memoryUsage());
scheduleGc();
}, nextMinutes * 60 * 1000);
}
// call this in the startup script of your app (once per process)
scheduleGc();
È necessario eseguire la vostra applicazione con la raccolta dei rifiuti a vista:
node --expose_gc app.js
quale problema si è veramente cercando di risolvere (mostrarci codice rilevante) e come stai misurando l'utilizzo della memoria. Ho il sospetto che tu abbia un problema di misurazione piuttosto che un problema di garbage collection poiché la garbage collection viene eseguita nel tempo di inattività node.js e di solito è un problema solo se hai un vero e proprio thread di esecuzione che crea molti oggetti temporanei. In un normale ambiente server node.js, ci dovrebbe essere un sacco di tempo di inattività (quando si utilizza la corretta programmazione asincrona). – jfriend00
Può valere la pena leggere questo articolo: https://strongloop.com/strongblog/node-js-performance-garbage-collection/ – jfriend00
Sto usando ps --sort -rss -eo rss, pid, comando | testa per il controllo della memoria. Sto usando un server Amazon (livello gratuito) in modo che ci sia solo 1 gig di memoria. Se inizio a eseguire più istanze della mia app su questo e non lo raccolgo manualmente, l'utilizzo della memoria salta alle stelle fino a quando il server non si blocca. –