노드 프로젝트를 빌드 하다보면 다양한 원인으로 빌드가 잘 안되고 다음과 같은 메세지를 보게될 수도 있다.
ex) 에러 메세지
... 중략
allocation failure scavenge might not succeed
...
ex) 에러 발생 환경 예시
- AWS 프리티어와 같은 저스펙 서버인 경우
- 프로젝트가 점점 비대해져 빌드시 메모리 오류 발생
- 로컬환경에서 빌드시 각각의 개발자 PC 스펙 및 프로젝트 규모에 따른 메머리 부족현상
등등
※ 결론
- NodeJs는 프로세스를 시작할 때 default 메모리를 제한하게 되어 있다. (os, node version 등에 따라 다 다르다.)
그렇기 때문에 특정 환경에 따라, 메모리 할당문제로 Node.js 프로세스가 종료될 수 있다.
- 노드의 메모리 제한을 조정하여 해결 가능하다. (물론 메모리를 많이 사용하지 않도록 소스레벨에서 최적화하는 것이 좋다.)
ex) V8의 다음 명령어 옵션을 통해 메모리 할당량을 증가 시킬 수 있다.
-- ex1
node --max-old-space-size=8192 index.js
-- ex2
export NODE_OPTIONS=--max-old-space-size=4096
yarn install
-- ex3
export NODE_OPTIONS=--max-old-space-size=2048 && yarn install
위의 결론에 다다르기까지 어떠한 방법으로 확인 할 수 있었는지 기록 해두려 한다.
1. 에러 현상 확인
- 위에서 명시하였듯이 다양한 환경에 따라 다음과 같이, 메모리 문제가 발생할 수 있다.
ex) 에러 메세지
... 중략
allocation failure scavenge might not succeed
...
2. 에러 발생 원인 방법
- node.js는 기본적으로 default 메모리 제한을 하고 있다고 하는데 나의 경우 특정 서버에서 유독 문제가 많아 확인해 보게 되었다.
1) node Versin 확인 및 default heap_size_limit 용량 확인
node -v
ex) 문제가 있는 서버 : v6.17.1 ( release Date : 2019-04-13 )
ex) 상대적으로 문제가 덜한 서버 : v16.18.0 ( release Date : 2022-10-12 )
- node의 Release Date를 확인해보면 문제가 된 서버에 꽤 오래전 version으로 설치가 되어있음을 확인할 수 있었다.
- 각각의 서버에서 확인한 node Version별 default heap_size_limit.
3. 해결 방법
※ 가장 많은 도움이 되었던 사이트에서는 다음과 같이 Best Practice 를 권고 하고 있다. (이미지 참고)
- 우리 사이트의 경우 2가지 Node Version 변경 및 "--max-old-space-size"를 고정 하는 2가지 방법으로 해결 하였다.
1) node Version변경
ex) os, node 버전에 따라 default memory limits가 있음을 알 수 있다.
- 우리싸이트의 경우는 6.x 버전을 사용하고 있어 16.x대의 version으로 변경 하였다.
2) oom을 해결하기 위해 적정 수준의 메모리를 할당하여 준다.
- 우리의 환경의 경우 한 Server에서 2개 이상의 Node.js Project가 시작될 수 있어
실제 memory 사용율을 측정 해 보며 최적의 수치를 정하였다. (+@ 가용 memory, cpu 증설 등의 작업)
export NODE_OPTIONS=--max-old-space-size=2048 && yarn install
ex) 다음 내용들은 참고 하자.
ex) nodeVersion 22v 기준으로 만약 2GB의 Server에서는 약 0.5GB를 여유를 두고 1.5GB로 제한하는 가이드를 확인할 수도 있다.
https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes
※ 만약 우리와 다르게 Server의 memory자체가 부족한 경우 하기 옵션들을 고려할 수도 있을 것 같아 남겨 둔다.
https://stackoverflow.com/questions/56982005/where-do-i-set-node-options-max-old-space-size-2048
※ 대부분의 내용은 하기 stack overflow 내용을 확인하여 작성 및 현상 해소가 가능하였다.
https://medium.com/geekculture/node-js-default-memory-settings-3c0fe8a9ba1
https://stackoverflow.com/questions/48387040/how-do-i-determine-the-correct-max-old-space-size-for-node-js
https://nodejs.org/api/cli.html#--max-old-space-sizesize-in-megabytes