Jak monitorować zużycie i wycieki pamięci w Node.js
Startup House
10 gru 2021・5 min czytania
Spis treści
Czym jest „wyciek pamięci” w Node.js?
Na czym polega Garbage Collection w Node.js?
Przykład aplikacji z wyciekiem pamięci
Wykrywanie wycieków pamięci z Node Inspector i Chrome DevTools
3 snapshoty sterty w Node.js
Wnioski — poznaj swoje narzędzia
Dla inżyniera Node.js wycieki pamięci w aplikacji potrafią być koszmarem, z którego nie tak łatwo się przebudzić. Co więcej, im dłużej pozostają niewykryte, tym dłużej ten zły sen się ciągnie.
Oznacza to, że zużycie CPU, pamięci, load average i czas odpowiedzi w aplikacji z błędami wycieku pamięci będą stopniowo rosły, aż CPU dojdzie do 100% wykorzystania, po czym usługa przestanie odpowiadać. To objawy, z jakimi może mierzyć się developer, gdy aplikacja cierpi na wyciek pamięci.
Jeśli brzmi to znajomo, czytaj dalej i sprawdź, jak poradzić sobie z tymi symptomami oraz jak monitorować zużycie pamięci i wycieki pamięci w aplikacjach Node.js.

Czym jest „wyciek pamięci” w Node.js?
W prostych słowach: wyciek pamięci to sytuacja, w której aplikacja alokuje blok pamięci i go nie zwalnia lub gdy mechanizm Garbage Collector w Node.js nie zdołał go uprzątnąć.
Cóż, mniej więcej…
Na czym polega Garbage Collection w Node.js?
Rozmawiając o wyciekach pamięci, trzeba wspomnieć o Garbage Collectorze. Mówiąc najprościej, Garbage Collector to automatyczny mechanizm odpowiedzialny za odzyskiwanie pamięci zajętej przez nieużywane obiekty.
W pierwszej fazie („mark”) Garbage Collector zaznacza nieużywane obiekty do usunięcia. W drugiej, „sweep”, odzyskuje pamięć.

Przykład aplikacji z wyciekiem pamięci
Na potrzeby tutorialu przygotowałem prostą aplikację Express.js, w której każde żądanie powoduje, że tablica leak rośnie w trakcie działania, co spowalnia serwis. Tablica ta nigdzie nie jest ręcznie czyszczona, a garbage collection nie obejmuje zmiennych zadeklarowanych globalnie.
Wykrywanie wycieków pamięci z Node Inspector i Chrome DevTools
Aby użyć Node Inspector, uruchom aplikację w trybie inspect, a w CLI TypeScript:
node --inspect index.js
Następnie skrypt z opcją inspect pojawi się na liście w zakładce DevTools/Devices. Kliknij Inspect, aby podpiąć Chrome DevTools do procesu Node. W naszym przypadku interesuje nas zakładka Memory i opcja heap snapshot.

3 snapshoty sterty w Node.js
Aby sprawdzić, czy nasza aplikacja ma wyciek pamięci, wykonamy 3 heap snapshots. Pierwszy — zaraz po uruchomieniu serwera; drugi — po benchmarku 1000 żądań do serwera; trzeci — po kolejnym benchmarku 1000 żądań.
Drugi snapshot, po pierwszym benchmarku 1000 żądań, może być sygnałem ostrzegawczym, jeśli sterta urosła. Zróbmy więc ostatni snapshot po drugim benchmarku — to pomoże potwierdzić, czy aplikacja ma wyciek pamięci.
Aby znaleźć przyczynę, wybierz trzeci snapshot, kliknij opcję porównania i zestaw go z pierwszym. To pozwoli zidentyfikować nowo utworzone obiekty od startu serwera.
Na końcu przyjrzyj się tym obiektom dokładniej i wyszukaj takie o tym samym rozmiarze alokacji. Dzięki temu można namierzyć i naprawić wycieki pamięci w aplikacji.
Wnioski — poznaj swoje narzędzia
Jeśli będziesz trzymać się znanych i sprawdzonych bibliotek, naprawa wycieku pamięci w Node.js zwykle okaże się łatwiejsza niż jego wykrycie. Kluczowe jest pełne zrozumienie garbage collection w DevTools oraz innych narzędzi, z których korzystasz podczas budowy aplikacji. Mając do dyspozycji różne debugery, narzędzia do wyłapywania wycieków i generatory wykresów użycia, umiejętność izolowania wycieków tam, gdzie je znajdziesz, sprawi, że Twoje oprogramowanie będzie działało szybciej i wydajniej.
W Startup Development House nie ukrywamy, że świetnie znamy się na Node.js i skutecznie rozwiązujemy problemy, które przy tym napotykamy. Jeśli jesteś aspirującym developerem i przydałoby Ci się trochę tego know-how, śmiało odezwij się na hello@start-up.house
Digital Transformation Strategy for Siemens Finance
Cloud-based platform for Siemens Financial Services in Poland


Może Ci się również spodobać...

Jak wybrać najlepszą agencję Node.js w 2023 roku: kompleksowy przewodnik
Node.js stał się kluczową technologią do tworzenia niezawodnych, skalowalnych aplikacji webowych. W tym kontekście rola firm programistycznych specjalizujących się w Node.js jest ważniejsza niż kiedykolwiek. Ten artykuł pomoże Ci wybrać najlepsze firmy specjalizujące się w Node.js, dopasowane do Twoich potrzeb.
Marek Pałys
02 lut 2023・6 min czytania

Jak zainstalować Ruby i Ruby on Rails oraz używać RubyGems
Poznaj przewodnik krok po kroku, który pokaże, jak zainstalować i wykorzystać Ruby on Rails do efektywnego tworzenia aplikacji internetowych. Dowiesz się, jak zainstalować i skonfigurować Ruby, zarządzać różnymi wersjami, korzystać z RubyGems i Bundlera oraz stworzyć nowy projekt w Ruby on Rails. Rozpocznij swoją przygodę z tworzeniem aplikacji w Ruby on Rails dzięki temu kompleksowemu przewodnikowi.
Jan Grela
20 mar 2020・6 min czytania

Stack technologiczny 2020: GraphQL, Apollo Server i React.js
Od 2000 roku zasady RESTful są branżowym standardem w tworzeniu web API, jednak GraphQL oferuje bardziej efektywne rozwiązanie. W tym artykule omawiamy zalety GraphQL w porównaniu z REST, jego popularność oraz to, jak za pomocą Apollo GraphQL zbudować serwer i aplikację kliencką.
Wojciech Cichoradzki
12 maj 2020・7 min czytania
Gotowy, aby scentralizować swoje know-how z pomocą AI?
Rozpocznij nowy rozdział w zarządzaniu wiedzą — gdzie Asystent AI staje się centralnym filarem Twojego cyfrowego wsparcia.
Umów bezpłatną konsultacjęPracuj z zespołem, któremu ufają firmy z czołówki rynku.




