Closed tastekim closed 1 year ago
Openvidu Doc 기본적인 openvidu의 flow가 나와있는 공식문서인데 다른 공식문서에 비해 그나마 쉽게 설명이 되어 있는 듯 합니다. 공식문서 안에도 많은 예제가 언어별로 잘 나와있어서 테스트해보면 좋을 것 같습니다.
처음 위에서 언급했던 내용의 원인을 아직 찾아내지는 못했습니다. 평소와 비슷한 방식으로 똑같이 도커라이징해서 로컬에서 테스트하던 중에 평소와 다르게 memory 사용량이 현저히 줄어들고 증가하지 않게 됬고 지금 ec2 인스턴스에 배포되어서 pm2 로 돌아가고 있는 서버를 끄고 docker 설치 후 docker 로 실행했는데 nginx 에 설정해둔 https 와 reverse proxy 및 socket 관련 설정들이 그대로 따라가네요.
앞 전에서 배포테스트할 때와 다른 점이 딱 하나있는데 Dockerfile 안에서 WORKDIR /usr/src/app
을 추가했다는 점입니다.
WORKDIR
은 쉘(shell)의 cd 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환을 위해서 사용됩니다. WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행됩니다. 처음 도커라이징을 할 땐 저 구문이 필요없다고 생각했습니다. 이미지가 생성되고 실행되는 첫 위치가 최상위 디렉토리고 그 곳에 프로젝트 폴더대로 그대로 COPY 하면 되지 않나 라는 생각으로 안썼다가 이번에 다시 해본다고 node.js 공식문서에서 docker image 만드는 법을 따라하다가 보니 이렇게 됐습니다...
WORKDIR
을 생략했을 때 발생할 수 있는 부분을 다시한번 찾아봐야겠습니다.
docker로 서버 띄우기 성공
처음 위에서 언급했던 내용의 원인을 아직 찾아내지는 못했습니다. 평소와 비슷한 방식으로 똑같이 도커라이징해서 로컬에서 테스트하던 중에 평소와 다르게 memory 사용량이 현저히 줄어들고 증가하지 않게 됬고 지금 ec2 인스턴스에 배포되어서 pm2 로 돌아가고 있는 서버를 끄고 docker 설치 후 docker 로 실행했는데 nginx 에 설정해둔 https 와 reverse proxy 및 socket 관련 설정들이 그대로 따라가네요.
의심 부분
앞 전에서 배포테스트할 때와 다른 점이 딱 하나있는데 Dockerfile 안에서
WORKDIR /usr/src/app
을 추가했다는 점입니다.WORKDIR
은 쉘(shell)의 cd 명령문처럼 컨테이너 상에서 작업 디텍토리로 전환을 위해서 사용됩니다. WORKDIR 명령문으로 작업 디렉터리를 전환하면 그 이후에 등장하는 모든 RUN, CMD, ENTRYPOINT, COPY, ADD 명령문은 해당 디렉터리를 기준으로 실행됩니다. 처음 도커라이징을 할 땐 저 구문이 필요없다고 생각했습니다. 이미지가 생성되고 실행되는 첫 위치가 최상위 디렉토리고 그 곳에 프로젝트 폴더대로 그대로 COPY 하면 되지 않나 라는 생각으로 안썼다가 이번에 다시 해본다고 node.js 공식문서에서 docker image 만드는 법을 따라하다가 보니 이렇게 됐습니다...WORKDIR
을 생략했을 때 발생할 수 있는 부분을 다시한번 찾아봐야겠습니다.
이 내용이 도움이 될 지는 모르겠는데요 ; ㅁ; 제가 알아봤을 때, WORKDIR을 설정하는 이유가 설정하지 않을 경우 도커 이미지를 build 할 때 copy하는 파일들이 root 디렉토리(도커 컨테이너 입장에서) 에 같이 만들어지게 된다고 알고 있습니다. 그래서 주의해야 할 점이 혹시 root 디렉토리에 생성되는 파일 이름들과 겹치게 될 경우 내가 직접 copy하는 파일들이 기본 설정 파일을 덮어쓰기 때문에 따로 생성하는 것이 좋다고 합니다.
= > 내가 직접 COPY 하는 파일들이 섞인 상태
최상위 폴더에 그대로 이미지를 빌드함으로 인해서 파일이 실행될 때 해당 디렉토리에 있는 전체를 다 읽어버리게 되서 메모리 사용량이 늘어나는 것이 아닐까 하는 추측도 되네요...
❗️Error : Javascript heap out of memory
docker를 이용해서 서버 파일을 image화 한 후, docker 에서 실행시키면 memory usage가 계속 증가하다가 제목과 같은 에러를 발생하는 상황이 생겼습니다.
에러를 검색해보니 말 그대로 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
라는 에러와 함께 종료됬습니다.결국 서버 파일과 상관없이 docker 에서 빌드할 때 초기에 많은 메모리가 사용되는건가 싶습니다.
시도 2. 메모리 누수 체크
메모리가 누수되는 주요 원인들이라고 합니다.
일단 chrome://inspect로 켜는 노드 크롬 디버거를 이용해서 확인해보았습니다. 로컬에서
node --inspect server.js
로 실행한 후 크롬 창에서 chrome://inspect를 입력해서 들어가 간단하게 확인했습니다.분명 아까 테스트할 때는 뒷 부분 파란색이 계속 남아있었는데 지금은 또 시간이 지날때마다 회색으로 바뀌고 있네요,, 여튼 변수에 값을 담는 과정 자체가 자바스크립트가 메모리에 데이터를 할당하는 과정이고 다시 null로 임의로 비우지 않는 이상 참조카운트가 0이 되지 않으면 불필요한 데이터가 메모리에 계속 남아있을 수도 있고 우리가 의도한 클로저 함수는 autoIncrease 함수 뿐이지만 의도하지 않은 클로저 함수가 있거나 그 외에 다중참조로 인해 참조카운트가 0이 되지 않고 있는 의도하지 않은 클로저나 콜백함수가 있는지 코드부분도 다시 한번 살펴봐야겠습니다.
❓해결 방법
일단은 시도 1 에서 일정 시간이 지난 후 안정화가 되는걸 확인했기 때문에 ec2 인스턴스의 메모리를 늘려본 후 서버에서도 테스트해봐야 할 것 같습니다. 사실 docker 를 공부하게 된 이유도 webRTC에 필요한 STUN / TURN / Media 서버들을 어떻게 쉽게 구현할까 하다가 mediasoup이랑 openvidu를 알게됬는데 플랫폼을 활용해 서버를 배포하는 것이 다 docker를 사용하고 있어서 docker를 먼저 공부하고 나면 저 방식들을 조금은 이해할 수 있으려나 해서 시작하게 됬는데 만약 이 부분이 잘 해결 된다면 dockerhub에 nginx image도 있으니 ec2 인스턴스에서 각 서버들을 docker로 관리하면 편리할 수 있겠다 싶었습니다. 또 후에 여유가 된다면 CI/CD 환경도 구축해보고 싶기 때문에 나쁘지않은 시도 같습니다.
다만 걱정되는게 있다면 openvidu에 docker로 배포하기위한 인스턴스 조건이 프리티어를 넘어서기 때문에 서버비가 얼마나 과금될 지가 정말 두렵습니다^^,,,,,
환경 설정