2015-03-21 8 views
7

Quted od What do the return values of node.js process.memoryUsage() stand for? RSS to rezydentny rozmiar zestawu, część pamięci procesu przechowywana w pamięci RAM (ile pamięci jest przechowywane w pamięci RAM przez ten proces w bajtach) rozmiar pliku z 'text.txt' użytego w przykładzie jest tutaj to 370KB (378880 bajtów)wykorzystanie pamięci procesowej węzła, rozmiar zestawu rezydentnego stale rosnący

var http = require('http'); 
var fs  = require('fs'); 
var express = require('express'); 
var app  = express(); 

console.log("On app bootstrap = ", process.memoryUsage()); 

app.get('/test', function(req, res) { 

    fs.readFile(__dirname + '/text.txt', function(err, file) { 
     console.log("When File is available = ", process.memoryUsage()); 
     res.end(file); 

    }); 

    setTimeout(function() { 
     console.log("After sending = ", process.memoryUsage()); 
    }, 5000); 

}); 

app.listen(8081); 

Więc na aplikacji bootstrap: { rss: 22069248, heapTotal: 15551232, heapUsed: 9169152 } Po zrobiłem 10 wniosek o '/ test' sytuacja jest:

When File is available = { rss: 33087488, heapTotal: 18635008, heapUsed: 6553552 } 
After sending   = { rss: 33447936, heapTotal: 18635008, heapUsed: 6566856 } 

Więc z app boost do 10nth żądanie rss jest zwiększone o 11378688 bajtów, co jest mniej więcej razy większe niż rozmiar pliku text.txt.

Wiem, że ten kod spowoduje buforowanie całego pliku data.txt w pamięci dla każdego żądania przed zapisaniem wyniku z powrotem do klientów, ale spodziewałem się, że po wypełnieniu żądania zostanie zajęta pamięć dla "text.txt". wydany? Ale tak nie jest?

Po drugie, jak ustawić maksymalny rozmiar pamięci RAM, którą może wykorzystać proces węzła?

+1

, więc skomentowałem część 'fs.readFile' i były to logi, 1-sza referencja' Po wysłaniu = {rss: 31162368, heapTotal: 18862880, heapUsed: 10961672} '10th req' Po wysłaniu = {rss: 31596544, heapTotal : 18862880, heapUsed: 11393584} 'który jest podobny do 424kb, całkiem okablowany, również szukam odpowiedzi. EDYCJA: znalazłem http://stackoverflow.com/questions/16441601/node-express-memory-crease-on-every-request –

Odpowiedz

5

W js garbage collector nie działa natychmiast po wykonaniu kodu. W ten sposób pamięć nie jest zwalniana natychmiast po wykonaniu. Możesz uruchomić GC niezależnie, po pracy z dużymi obiektami, jeśli zależy Ci na zużyciu pamięci. Więcej informacji można znaleźć here.

setTimeout(function() { 
    global.gc(); 
    console.log("After sending = ", process.memoryUsage()); 
}, 5000); 

Aby przejrzeć alokację pamięci, można uruchomić serwer za pomocą narzędzia v8-profiler i uzyskać migawkę Sterty. Więcej informacji here.

+0

Zauważ, że aby 'gc' był narażony na twój program, być może będziesz musiał uruchomić węzeł za pomocą 'node --expose-gc'. –

1

Spróbuj ponownie uruchomić swój przykład i daj procesowi trochę czasu na uruchomienie czyszczenia pamięci. Miej oko na zużycie pamięci procesowej za pomocą monitora systemu i powinno to zostać usunięte po pewnym czasie. Jeśli nie przestanie, proces nie może wzrosnąć w użyciu pamięci, o czym wspomniano poniżej.

Zgodnie z node documentation limit pamięci wynosi 512 MB dla 32 bitów i 1 GB dla 64 bitów. W razie potrzeby można je zwiększyć.

Powiązane problemy