2012-10-16 20 views
8

Nodejs: 0.8.8node.js - możliwy wyciek pamięci serwera http wersję

Oto server:

var http = require('http'); 
var port = 1338; 
var ip = "127.0.0.1";  

http.createServer(function (req, res) { 
    res.writeHead(200, {'Content-Type': 'text/plain'}); 
    res.end('Hi there\n'); 
}).listen(port, ip);  

Client (skrypt php) loki dala żądania POST do powyższego serwerze. POST jest ciągiem znaków (json) o rozmiarze około 4 megabajtów.

Jak widać, serwer nie robi nic z opublikowanymi danymi. Aby debugować, usunąłem cały mój kod i wróciłem do przykładu Witaj świecie, który nic nie robi :)
Kiedy przyjrzę się wykorzystaniu pamięci procesu węzła (wykonane w Monitorze aktywności, aplikacja mac) - raportuje że użycie pamięci serwera węzłowego staje się większe dla każdego żądania.
Po około 20 żądaniach zużycie pamięci jest podwojone.

+4

Mam zamiar zadać pytanie o 1000 dolarów: czy node.js w końcu zawiesza całą pamięć i awarię, czy użycie pamięci w końcu wróci do niskiego poziomu? – jsalonen

Odpowiedz

19

To nie jest błąd. To normalne, oczekiwane zachowanie.

Node.js jest oparty na języku JavaScript, który jest językiem gromadzącym śmieci. W skrócie, co się dzieje, jest to, że pamięć nie jest od razu uwalniana, ale zamiast tego zajmie trochę czasu, zanim pamięć zostanie zwolniona (na przykład śmieci zostaną zebrane). V8 (który używa węzła) faktycznie ma a very intelligent garbage collector, który "zapewnia szybką alokację obiektów, krótkie wstrzymywanie zbierania pamięci i brak fragmentacji pamięci".

Aby zademonstrować to zachowanie, uruchomiłem powyższy skrypt za pomocą pliku node.js 0.8.8 w systemie Windows i zbombardowałem serwer dużymi żądaniami HTTP POST.

Process Explorer ujawnia następujące wykres wykorzystania pamięci:

enter image description here

Jak widać, użycie pamięci idzie w górę, aż do pewnej granicy, która powoduje zbieranie śmieci. Po oczyszczeniu użycie jest resetowane i rozpoczyna się ponownie, aż do następnego uruchomienia.

+2

Podczas pierwszych testów wykonałem około 20 próśb, a pamięć ciągle rosła. Teraz po lekturze waszej, bardzo informacyjnej odpowiedzi, kontynuowałem prośby i po około 30 lub więcej, gc kopnął :) – ado

+0

+1 dla wykresu informacyjnego - dziękuję – zupa

+0

@jsalonen można ograniczyć limit GC do skoku? – Sir