2015-02-15 38 views
5

Uruchomiłem mój serwer z pm2 start ..., a pm2 monit pokazywał mi 3GB memory po 2 godzinach. Więc podłączyłem memwatch, teraz czekałem przez kolejne 2 godziny i znowu pamięć pokazana przez pm2 monit osiągnęła 3GB.Node.JS wyciek pamięci z PM2

Sprawdziłem więc wygenerowany dziennik memów. Pokazał mi:

{ before: { nodes: 75659, size_bytes: 11141702, size: '10.63 mb' }, 
    after: { nodes: 73226, size_bytes: 10840598, size: '10.34 mb' }, 
    change: 
    { size_bytes: -301104, 
    size: '-294.05 kb', 
    freed_nodes: 5141, 
    allocated_nodes: 2708, 

a inny:

{ before: { nodes: 72591, size_bytes: 10728318, size: '10.23 mb' }, 
    after: { nodes: 73284, size_bytes: 10798062, size: '10.3 mb' }, 
    change: 
    { size_bytes: 69744, 
    size: '68.11 kb', 
    freed_nodes: 5931, 
    allocated_nodes: 6620, 

Teraz jestem naprawdę mylić, to są ostatnie logi więc jestem całkiem pewny, że są to logi generowane kiedy pm2 monit pokazał ogromny wyciek pamięci.

Dlaczego więc memwatch pokazuje mi pamięć 10MB+, a monit PM2 pokazuje 3GB+?


Teraz przejście do czegoś jak forever lub monit aby sprawdzić, czy nadal istnieje przeciek.


Nieco bardziej tło

  • staram się profil i znajdź wyciek i nie ma po prostu dowolny seans przeciek na profilach.
  • Różnica memwatch jest uruchamiana, gdy klient łączy się, a różnica jest podejmowana po rozłączeniu klienta.
+0

O tym starałem się profilować przez ostatnie 2 dni i po prostu nie mogę znaleźć problemu. W końcu zdecydowałem się przenieść na Golanga, co jest niesamowitą, ogromną różnicą w pamięci i wydajności. Bardzo wydajny. Wreszcie nie mylące przecieki. Poza tym jest dość łatwy do kodowania, recoded javascript do golang w mniej niż jeden dzień. – majidarif

Odpowiedz

3
  • Byłem też w obliczu tego samego problemu, ale po trochę badań i stwierdził, że nodejs nie dzwoni śmieciarza podczas korzystania PM2.
  • Więc dopóki PM2 poprawki, które wydają się wokół pracy tymczasowej jest wywołanie siła garbage collector, stosując następujące

PM2 rozpocząć app.js --node-args = '- poddać-GC'

Powyższy argument --expose-gc pozwoli nam wymusić wywoływanie śmieci z węzła js, teraz użyj następującego kodu do wymuszonego zbierania garażu.

if (global.gc) { 
    global.gc(); 
} else { 
    console.log('Garbage collection unavailable. use --expose-gc ' 
    + 'when launching node to enable forced garbage collection.'); 
} 

To rozwiąże problem z wyciekiem miki PM2.

+4

Czy możesz podać źródło dla 'ale po małych badaniach odkryłem, że nodejs nie wywołuje śmieciarza podczas używania pm2.". Dzięki. – majidarif