요약: 프로젝트에 heapdump 추가하고 새로 만든 API 이용해서 스냅샷 촬영함. 크롬 개발자 도구 열어서 스냅샷 내용 확인함.
프로젝트에 heapdump 모듈 설치하기
npm install heapdump
yarn add heapdump
만일 설치 시 아래와 같은 error가 난다면? [해결책] node-modules 삭제 후 yarn으로 다시 만들기. 후에 yarn add heapdump 하면 정상적으로 깔림
$ yarn add heapdump
yarn add v1.22.18
warning package-lock.json found. Your project contains lock files generated by tools other than Yarn. It is advised not to mix package managers in order to avoid resolution inconsistencies caused by unsynchronized lock files. To clear this warning, remove package-lock.json.
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
warning "firebase-admin > @firebase/database-compat > @firebase/database > @firebase/auth-interop-types@0.1.6" has unmet peer dependency "@firebase/app-types@0.x".
[4/4] Building fresh packages...
[1/3] ⢀ protobufjs
[-/3] ⢀ waiting...
error C:\Users\choo0\Documents\Repository\RecorDream-Server\node_modules\heapdump: Command failed.
Exit code: 1
Command: node-gyp rebuild
Arguments:
Directory: C:\Users\choo0\Documents\Repository\RecorDream-Server\node_modules\heapdump
Output:
C:\Users\choo0\Documents\Repository\RecorDream-Server\node_modules\heapdump>if not defined npm_config_node_gyp (node "C:\Program Files\nodejs\node_modules\npm\bin\node-gyp-bin\\..\..\node_modules\node-gyp\bin\node-gyp.js" rebuild ) else (node "" rebuild )
gyp info it worked if it ends with ok
gyp info using node-gyp@8.4.1
gyp info using node@16.14.2 | win32 | x64
gyp info find Python using Python version 3.10.4 found at "C:\Users\choo0\AppData\Local\Programs\Python\Python310\python.exe"
gyp ERR! find VS
...
index.ts에 아래 코드 추가하기. "C:/Users/choo0/Desktop/" 부분은 각자 본인이 희망하는 snapshot 저장 장소로 바꾸기. (중요!) (저는 제 컴퓨터(choo0)의 바탕화면으로 했습니다)
var heapdump = require("heapdump");
app.use("/heapdump", function (req, res, next) {
var filename = "C:/Users/choo0/Desktop/" + Date.now() + ".heapsnapshot";
heapdump.writeSnapshot(filename);
res.send("Heapdump has been generated in " + filename);
});
http://localhost:8000/heapdump에 접속하면 지정해둔 장소에 snapshot이 만들어짐. (8000은 본인이 설정한 포트번호로 바꾸기)
(생성된 파일의 연결 프로그램은 중요치 않습니다. 제 컴퓨터에선 워드로 보이는데 무시하셔도 됩니다. 파일 형식만 HEAPSNAPSHOT 파일(.heapsnapshot)이면 됩니다. )
메모리 부하를 일으킨 후, 다시http://localhost:8000/heapdump에접속해서 snapshot 만들기. (이 snapshot은 현재 node.js가 사용중인 메모리 양이 클수록 추출하는 속도가 느려집니다.)
크롬 개발자 도구(오른쪽 상단 더보기(점 3개) > 도구 더보기 > 개발자 도구) 열기.
메모리/프로필에서 로드 버튼 눌러 앞서 만든 힙덤프 파일(snapshot) 올리기.
snapshot 클릭해서 열어서 수없이 반복되는 객체가 있나 확인하기. 이를 통해 어떤 객체들이 메모리를 많이 점유해서 메모리 누수를 유발하는지 찾아낼 수 있습니다.
추가) 아래 코드 중 하나를 Controller에 추가해서 api를 여러 번 반복적으로 돌려보며 변하는 메모리 추이를 보고 간이로 누수를 체크해볼 수도 있습니다. (계속해서 크게 증가한다면 누수 가능성 큼)