FEConf 2023 [B2] SSR 환경(Node.js) 메모리 누수 디버깅 가이드

Ahyeon, Jung·2024년 2월 18일
0

https://youtu.be/P3C7fzMqIYg?si=7UlAFYzOPb9VmF3x

SSR 환경(Node.js) 메모리 누수 디버깅 가이드
메모리 누수는 실제로는 필요하지 않은데, 메모리를 계속 차지하고 있는 현상

JS를 동작시킬 메모리가 부족하니까, 성능이 좋지 않게 됨
-GC의 활동이 늘어나면, CPU 사용량이 늘어나요.
-CPU intensive한 작업이 늘어나면, 이벤트 루프가 블로킹되서 연산이 느려져요
띄워놓은 Node.js 서버가 죽어요
-SIGABRT 등의 시그널로 인한 프로세스 종료
-인스턴스가 재시작되고 일부 요청에 대한 응답이 실패
-로드밸런서가 HTTP Status 502(Bad Gateway) 에러를 뱉을 수 있어요.
-가용성에 문제가 있을 수 있단 뜻이에요.

힙메모리를 늘려주거나,
메모리 누수의 범인을 디버깅한다

메모리 누수가 있는지 어떻게 알 수 있어요?
Allocation failed-JavaScript heap out of memory

Server Side
Grafana, DATADOG, AWS Cloudwatch

힙메모리를 늘려줘도, 이 코드는 계속 메모리 누수를 일으켜요.

V8의 메모리 관리 방식

살아남은 객체들은 계속해서 힙메모리에 존재해요!
가비지 콜렉터로부터 계속 살아남으면 어떻게 될까요?

Node.js 메모리 부족 어떻게 해결함? –max-old-space-size

계속 살아남은 객체는 Old space로,
계속 힙메모리를 차지하면 OOM

힙메모리를 늘리는 것이 무조건적인 정답은 아님

대표적인 메모리 누수를 일으키는 요인들
-전역변수
-해제되지 않은 타이머
-클로저

Node –inspect index.js

개발자 도구 – 메모리

Shallow Size: 오브젝트 자신의 크기bytes
Retained Size: 나 자신 + 참조하고 있는 오브젝트들의 크기

Shallow Size에 비해서 Retained Size가 큰 것들을 찾기

Using
현재 JavaScript TC39 Stage 3
C#의 using
Let, const, var 같이 변수를 선언할 때 쓰는 키워드
스코프 끝에서 Symbol.dispose()를 호출해서 클린업 할 수 있음

서버 환경과 클라이언트 환경으로 나눠서 디버깅하자
서버 환경에서는 node –inspect 옵션을 쓰자
timeline으로 힙메모리 사용량을 프로파일링하는 것이 유용하다
Shallow Size 대비 Retained Size가 큰 객체를 찾자
Using을 잘 쓰면 덜 고통스러울지도!

profile
https://a-honey.tistory.com/

0개의 댓글