웹 개발
메모리 사용량이 슬금슬금 오를 때
당장 죽지는 않는데 메모리가 천천히 차오르는 서버. 누수인지 확인하고 원인을 좁힌 과정이다.
서버가 당장 죽지는 않는데 메모리가 시간이 갈수록 조금씩 차오르는 일이 있었다. 며칠에 한 번 재시작되는 패턴이라 누수가 의심됐다. 무작정 코드를 뒤지기 전에, 정말 우상향인지부터 확인했다.
추세부터 확인한다
한 시점의 메모리 수치는 의미가 없다. 시간에 따라 계속 오르는지를 봐야 한다.
# 컨테이너라면
docker stats --no-stream
# 프로세스라면
ps -o pid,rss,cmd -p <pid>
rss를 일정 간격으로 몇 번 찍어보고, 트래픽이 같은데도 우상향이면 누수로 본다. 트래픽에 따라 오르내리면 정상 부하일 가능성이 크다.
무엇이 안 풀리는지 본다
Node라면 힙 스냅샷을 두 번(부하 전, 부하 후) 떠서 비교한다.
node --inspect server.js
# 크롬 devtools의 Memory 탭에서 두 스냅샷의 차이를 본다
스냅샷 비교에서 계속 늘어나는 객체가 보이면 그게 단서다. 내 경우엔 이벤트 리스너를 등록만 하고 해제를 안 한 게 원인이었다. 요청마다 리스너가 쌓이니 천천히 올라갈 수밖에 없었다.
사용자 영향과 함께 기록한다
원인을 찾는 동안에도 서비스는 돌아야 한다. 어느 수치에서 응답이 느려지는지, 재시작 주기는 어떤지를 기록해두면 임시로 재시작 임계치를 잡아 시간을 벌 수 있다. 급한 불을 끄고 나서 누수를 잡는 게 마음이 편하다.