Node.js 메모리 사용량 50% 절감
Node.js의 메모리 사용량 문제를 해결하기 위해 V8 엔진의 포인터 압축(Pointer Compression) 기술을 소개함
Docker 이미지 스왑을 통해 코드 변경 없이 메모리 사용량 50% 절감을 달성하는 방법을 제시함
포인터 압축은 64비트 포인터를 32비트로 줄여 메모리 힙(Memory Heap) 공간을 효율적으로 사용함
실제 Next.js SSR 앱을 통해 성능 벤치마크를 진행, 평균 지연 시간 2~4% 증가, P99 지연 시간 7% 감소를 확인
V8 엔진의 포인터 압축(Pointer Compression) 기술
발표자는 Node.js의 메모리 사용량 절감을 위해 V8 엔진(V8 Engine)의 포인터 압축(Pointer Compression) 기술을 소개한다. 이 기술은 64비트 메모리 주소를 32비트 오프셋으로 변환하여 메모리 힙(Memory Heap) 공간을 효율적으로 사용하도록 돕는다. 포인터 압축은 메모리 참조(Memory Reference) 크기를 줄여, 객체(Object), 배열(Array), 클로저(Closure) 등에서 메모리 사용량 50% 절감을 가능하게 한다.
포인터 압축의 작동 원리
영상에 따르면 포인터 압축(Pointer Compression)은 고정된 시작점(Base Address)으로부터의 상대적인 거리인 32비트 오프셋을 저장하는 방식으로 작동한다. 메모리 힙(Memory Heap)에서 데이터를 읽을 때는 Base Address와 Offset을 더하여 전체 포인터를 재구성하고, 데이터를 쓸 때는 전체 주소에서 Base Address를 빼서 포인터를 압축한다. 이로 인해 가비지 컬렉션(Garbage Collection)의 효율성이 향상된다.
Node.js에서 포인터 압축 활성화 방법
발표자는 Node.js에서 포인터 압축(Pointer Compression)을 활성화하기 위해 Node.js를 커스텀 빌드하고, Docker 이미지 스왑(Docker Image Swap)을 통해 쉽게 적용할 수 있다고 설명한다. Node.js는 기본적으로 이 기능을 비활성화하고 있는데, 이는 4GB 메모리 제한과 관련된 문제 때문이다. Node.js의 Worker Threads는 이 제한 때문에 어려움을 겪었지만, Galia와 Cloudflare의 협력을 통해 해결되었다.
실제 벤치마크 결과 및 영향
영상에서는 Next.js SSR 앱을 사용하여 포인터 압축(Pointer Compression)의 성능을 벤치마킹한 결과를 제시한다. 그 결과, 평균 지연 시간은 2~4% 증가했지만, P99 지연 시간(P99 Latency)은 7% 감소했다. 또한, 메모리 사용량 50% 절감을 달성하여, Pod당 메모리 사용량을 줄여 비용 절감 효과를 얻을 수 있음을 강조한다. 발표자는 OpenClash와 같은 다른 프로젝트에도 이 기술이 유용할 것이라고 언급한다.