수 많은 우문은 현답을 만든다

yarn build 시 JS Heap Error 발생하는 이유 본문

카테고리 없음

yarn build 시 JS Heap Error 발생하는 이유

aiden.jo 2022. 12. 23. 16:16

안녕하세요, 조영호입니다.

 

프론트엔드 프로젝트에서 yarn build만 하면 js heap out of memory 오류가 발생하는 이슈가 있었습니다.

해당 이슈를 해결하는데 나름 고생을 많이해서 경험을 글로 공유하고자 합니다.

 

우선 보안과 빌드 속도 측면에서 yarn이 npm 보다 우수하다는 글들을 보고 yarn을 사용하고 있었습니다. 빌드를 하기위해 yarn build를 치면 아래와 같은 오류가 발생했습니다.

node:internal/event_target:969
process.nextTick(()=> {throw err;});

Error [ERR_UNHANDLED_ERROR]: unhandled error.
error Command failed with exit code 1.

 

 

원인 파악 과정

  • 폐쇄망 자체가 문제가 되는지 확인
    동일한 소스코드, 환경설정으로 온라인 환경에서 네트워크를 끊고 빌드를 할땐 잘 됩니다
    (nodejs = v16.17.0, yarn = 1.22.19, npm = 8.15.0)

  • 소스코드 메모리 누수 확인
    Chrome을 사용해 소스코드의 메모리 누수 여부를 점검했으나, 크게 메모리를 낭비(반납하지 아니함)하는 부분은 발견하지 못함.

 

  • 폐쇄망 보안 프로그램 문제
    yarn build를 실행하면 폐쇄망에 설치되어있는 내부 보안프로그램의 CPU, Mem 사용률이 급격히 올라갔다.
    아무래도 build를 하면서 작업되는 파일들을 하나씩 검사하기에 그런 것으로 보였고, 영향도 테스트를 위해 보안부서에 프로그램 종료 권한을 요청했으나 당연하게 거절당했다. (이 대답으로 추측할 수 있는 것은, 고객사 입장에서는 타 프로젝트들도 보안 프로그램과 상관없이 빌드가 잘 되었을 것이라는 점이다)

  • 자원사용량 확인
    yarn build 시 CPU 사용률 100%, Mem 사용률 50%
    => 너무 많은 자원을 쓰고있음을 발견

  • nodejs 메모리 할당량 상향조정
    • node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'
      => 현재 사용중인 메모리 : 1024
    • export NODE_OPTIONS=--max_old_space_size=16000
      => 16G로 상향
    • node -e 'console.log(v8.getHeapStatistics().heap_size_limit/(1024*1024))'
      => 현재 사용중인 메모리 : 4096 (4G만 할당됨. 뭔가 이상한데??)
  • nodejs 비트확인
node -p "process.arch"

       => X32 (이럴수가 Win X64 운영체제에 X32 비트 Nodejs가 설치되어있었다)

 

 

 

해결 방법

  1. nodejs 64 비트 재설치
    온라인에서 재설치를 하고 오프라인 환경으로 반입
  2. yarn build
    node_modules에서 패키지 정보가 맞지 않다고 빌드 오류를 마구 뿜어냅니다.
    OS bit 에 영향을 받는 까다로운 친구임을 확인.
  3. yarn install
    온라인에서 yarn install로 node_module를 갱신해서 오프라인 환경으로 반입
  4. 잘 된다!!!

 

폐쇄망 Window에서 Linux로 Nodejs 프로젝트 옮기기

또 하나의 새로운 발견은, 윈도우에서 빌드한 node_modules는 리눅스에서 그대로 사용할 수 없다는 것 입니다.

node_modules를 까보면 폴더들 이름 끝에 _linux_64_182 같은 OS 정보가 붙어있습니다.

비트 뿐만 아니라 운영체제에도 의존성을 가진다는 것을 알 수 있었습니다.

(외부 리눅스에서 빌드해서 폐쇄망 리눅스로 반입하면 해결하실 수 있습니다.)

 

 

 

 

폐쇄망이라는 제약 속에서 다양한 경험을 하는것도 새로운 재미를 주는 것 같습니다.

감사합니다.