Właśnie skończyłem rozwijać moją pierwszą aplikację node.js i teraz testuję ją na moim VPS. obserwując wykorzystanie zasobów procesu "węzeł", zauważyłem wzrost wykorzystania pamięci po zażądaniu strony (szczególnie niektórych). W szczególności, jeśli żądana strona jest stroną statyczną, wzrost jest minimalny. Jeśli żądana strona to/admin, wzrost może wynieść 1mb! Oczywiście, gdy żądany jest/admin, mój serwer robi więcej rzeczy niż obsługuje stronę statyczną. Łączy się z mongodb, wykonuje 4 "find", wiąże wyniki z szablonem html przy użyciu bind. Jaki jest problem? Ta pamięć używana, nigdy nie zostanie wydana !!! Pomyślałem więc, że w moim kodzie wystąpił błąd logiczny, ale potem zrobiłem kolejny test o wiele bardziej interesujący.Używana pamięć nigdy nie została zwolniona w węźle js. Bardzo dziwne
Rozważmy to bardzo prosty serwer nodejs:
var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(3000, 'my_public_ip');
jeśli staram się wiele żądań z przeglądarki (po prostu przytrzymując klawisz F5 na minutę), wykorzystanie pamięci rośnie powoli i ilości pamięci używanej przez proces będzie nigdy zostać zwolniony, nawet po długim czasie i po zamknięciu przeglądarki. Teraz jest prawdopodobne, że w moim/administracyjnym kodzie jest jakiś błąd (1mb pamięci używanej i nigdy nie wydany dla każdego żądania jest bardzo wysoki!), Ale myślę, że to bardzo dziwne, że pamięć używana przez prosty skrypt powyżej nigdy nie zostanie wydana ! Co o tym myślisz? Jest sposób na uniknięcie tego?
także (w moim prawdziwym serwerze), użyłem memwatch w THYS sposób:
var memwatch = require('memwatch');
memwatch.on('leak', function(info) {
console.log(info);
process.exit(1);
});
Gdybym wykonać wiele żądań z przeglądarki, po około 10 sekundach, że robię to, proces wyjdzie i jest to błąd:
{ start: Wed Nov 26 2014 08:21:07 GMT-0500 (EST),
end: Wed Nov 26 2014 08:22:04 GMT-0500 (EST),
growth: 4775624,
reason: 'heap growth over 5 consecutive GCs (57s) - 287.65 mb/hr' }
Co to znaczy? Wygląda na to, że jest powiązany z śmieciarzem! Wiem, że lepiej byłoby wkleić tutaj mój/admin kod, ale fragment jest bardzo długi i jest powiązany ze zmiennymi globalnymi, więc nie da się go zrozumieć bez kopii 200 wierszy: D. Jeśli potrzebujesz więcej informacji, dam ci!
Czy próbujesz ręcznie wymusić usuwanie pamięci? Sprawdź http://devjar.me/post/22886448979/manually-run-gc-in-node-js: "Uruchom węzeł z flagami -nouse_idle_notification i -expose_gc, a następnie, gdy chcesz uruchomić GC, po prostu zadzwoń globalnie .gc(). " – Joel
Możesz zamieścić swój kod w gist/pastebin. Ale prosty fakt, że wspomniałeś o globalnych zmiennych, powinien wywołać alarm :) Potrzebujemy więcej informacji. Spróbuj też użyć 'memwatch' hot code, a nie zaraz po uruchomieniu. – randunel
Ja (Andras) wypróbowałem powyższy kod z wymuszonym gc i jest bardzo bardzo stopniowy, ale coś się dzieje. Ponad 200 sekund i 580 000 wywołań używanych zużyło 40KB (maleńki bit), ale heapTotal wzrósł o 12MB, najpierw +4, a następnie +8. Prowadzę teraz 5-minutowy bieg – Andras