빨간색코딩

nodejs 메모리 누수 본문

node.js

nodejs 메모리 누수

빨간색소년 2017. 8. 4. 15:45

참조문서 : https://www.html5rocks.com/ko/tutorials/speed/static-mem-pools/

1. 메모리 누수 원인

nodejs는 v8엔진에서 GC를 주기적으로 수행한다. nodejs는 메모리관리가 불완전하고 어려운데, 그 이유는 GC역시 메인스레드(이벤트루프)에서 실행되기 때문이다. 따라서 메인스레드가 바쁜 작업(CPU인텐시브)을 돌릴 경우, 메모리는 급격히 증가하는데.. GC가 낄 틈새가 없는 것이다.

2. 메모리 누수 해결방안

이러한 메모리 누수를 피하려면 3가지 방법이 있다. 모두 다 이벤트루프를 고려한 프로그래밍이다.

  1. process.nextTick과 setTimeout을 활용하여 GC가 낄 틈새를 만들어주는 것이다.
  2. 클로저와 스택의 빈번한 사용을 자제한다
  3. GC를 수동으로 이벤트루프에 넣어준다. 일시적인 블록이 발생할 수 있어 성능이 저하된다는 단점이 있다.

nodejs에서 메모리관리, 오류처리 등은 아직 노하우가 별로 없는 편이라 매우 힘들다고 한다...

3. V8의 기본 힙메모리

현재 VM(64비트 4코어 램8기가) 서버에서 힙메모리는 1.39GB를 갖는다. 이는 v8모듈의 getHeapStatistics()를 통해 확인이 가능하다.

{
	total_heap_size: 44126208,
	total_heap_size_executable: 8388608,
	total_physical_size: 38230216,
	total_available_size: 1454357216,
	used_heap_size: 30314240,
	heap_size_limit: 1501560832
}

node --max-old-space-size=4096 app.js 로 힙메모리를 임의로 늘려주고 다시 확인해보면, 4.03GB가 되었다.

{
	total_heap_size: 45174784,
	total_heap_size_executable: 8388608,
	total_physical_size: 39802376,
	total_available_size: 4284969744,
	used_heap_size: 27407192,
	heap_size_limit: 4328521728
}

4. HeapDump 뜨기

V8_inspector을 이용한 디버깅에서 힙덤프를 편하게 뜰 수 있다. 대신, 힙사용량이 일정 N % 이상이 될 때 스냅샷하고 싶다면 아래와 같은 방법을 써야 한다.

참조문서

npm install heapdump로 설치한다. 힙덤프를 크롬에서 열어볼 것이다. 확장자를 안지키면 Can't load file. Only files with extensions '.heapsnapshot', '.heapprofile', '.heaptimeline' can be loaded. 라고한다.

heap을 많이 사용할 때쯤(로직으로 if문으로 90% 넘어갔을때를 구한다) 에 heapdump.writeSnapshot()를 통해 생성해준다.

Comments