Skip to content

[Error] docker image로 서버 실행 시 'Javascript heap out of memory' 현상 #105

@tastekim

Description

@tastekim

❗️Error : Javascript heap out of memory

스크린샷 2022-11-22 오전 5 57 37

docker를 이용해서 서버 파일을 image화 한 후,
docker 에서 실행시키면 memory usage가 계속 증가하다가 제목과 같은 에러를 발생하는 상황이 생겼습니다.

스크린샷 2022-11-22 오전 4 45 10

에러를 검색해보니 말 그대로 heap memory 가 부족하거나 메모리가 누수되고 있기 때문이라고 합니다.

⁉️시도 내용

시도 1. node --max-old-space-size=2048

일단 node.js 의 기본 할당 메모리는 512MB이기 때문에 node --max-old-space-size=2048로 임시로 최대 2GB까지 늘린 상태로 다시 한번 테스트해보았으나 memory usage 가 계속 증가하다가 결국 서버가 또 종료됩니다. 그래서 미친짓같지만 4096으로 증가시켜서 다시 한번 테스트해 보았습니다^^ 그런데 약 5분 정도 시간이 지날때까지 메모리가 3기가를 넘어서 계속 커지나 싶더니 갑자기 cpu usage랑 같이 뚝 떨어지고 그 상태로 계속 유지가 되었습니다. 그래서 서버가 규모가 조금 있어서 그런건가 싶어서 노마드코더 강의에서 진행했던 zoom 클론 코딩의 파일도 똑같이 image화 한 후에 실행시켜보았는데 클론 코딩한 파일도 똑같이 memory usage가 계속 증가하다가 javascript heap out of memory라는 에러와 함께 종료됬습니다.

스크린샷 2022-11-22 오전 5 54 34

첫 번째 container는 안정화가 된 현재 프로젝트 서버입니다.

결국 서버 파일과 상관없이 docker 에서 빌드할 때 초기에 많은 메모리가 사용되는건가 싶습니다.

시도 2. 메모리 누수 체크

메모리가 누수되는 주요 원인들이라고 합니다.

  • 전역변수
  • 다중참조
  • 클로저
  • 콜백함수

일단 chrome://inspect로 켜는 노드 크롬 디버거를 이용해서 확인해보았습니다.
로컬에서 node --inspect server.js로 실행한 후 크롬 창에서 chrome://inspect를 입력해서 들어가 간단하게 확인했습니다.
스크린샷 2022-11-22 오전 6 23 17

파란색 게이지가 팍 솟구치는 부분이 메모리가 사용되는 곳이고 회색 부분은 GC에 의해 수거된 부분이라고 합니다.

분명 아까 테스트할 때는 뒷 부분 파란색이 계속 남아있었는데 지금은 또 시간이 지날때마다 회색으로 바뀌고 있네요,, 여튼 변수에 값을 담는 과정 자체가 자바스크립트가 메모리에 데이터를 할당하는 과정이고 다시 null로 임의로 비우지 않는 이상 참조카운트가 0이 되지 않으면 불필요한 데이터가 메모리에 계속 남아있을 수도 있고 우리가 의도한 클로저 함수는 autoIncrease 함수 뿐이지만 의도하지 않은 클로저 함수가 있거나 그 외에 다중참조로 인해 참조카운트가 0이 되지 않고 있는 의도하지 않은 클로저나 콜백함수가 있는지 코드부분도 다시 한번 살펴봐야겠습니다.

❓해결 방법

일단은 시도 1 에서 일정 시간이 지난 후 안정화가 되는걸 확인했기 때문에 ec2 인스턴스의 메모리를 늘려본 후 서버에서도 테스트해봐야 할 것 같습니다.
사실 docker 를 공부하게 된 이유도 webRTC에 필요한 STUN / TURN / Media 서버들을 어떻게 쉽게 구현할까 하다가 mediasoup이랑 openvidu를 알게됬는데 플랫폼을 활용해 서버를 배포하는 것이 다 docker를 사용하고 있어서 docker를 먼저 공부하고 나면 저 방식들을 조금은 이해할 수 있으려나 해서 시작하게 됬는데 만약 이 부분이 잘 해결 된다면 dockerhub에 nginx image도 있으니 ec2 인스턴스에서 각 서버들을 docker로 관리하면 편리할 수 있겠다 싶었습니다. 또 후에 여유가 된다면 CI/CD 환경도 구축해보고 싶기 때문에 나쁘지않은 시도 같습니다.
다만 걱정되는게 있다면 openvidu에 docker로 배포하기위한 인스턴스 조건이 프리티어를 넘어서기 때문에 서버비가 얼마나 과금될 지가 정말 두렵습니다^^,,,,,

스크린샷 2022-11-22 오전 6 44 28

환경 설정

OS: Windows 10
Node:  v16.15.1 (@unchaptered), v16.13.1(@axisotherwise)
npm : v8.11.0 (@unchaptered), v8.2.2 (@axisotherwise)

Metadata

Metadata

Assignees

Labels

bugSomething isn't working

Projects

Status

Done

Relationships

None yet

Development

No branches or pull requests

Issue actions