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.
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