서버 운영
서버 메모리 누수 원인 찾는 방법
서버의 메모리가 점점 줄어들 때, 어디부터 확인해야 하는지 체계적으로 접근하는 방법을 정리했다.
서버 리소스 문제는 보통 조용히 진행되다가 갑자기 터진다. 메모리가 떨어지기 전에 먼저 정상 상태를 기준으로 무엇이 다른지를 파악해야 한다.
현재 상태를 먼저 기록하기
메모리 사용량이 이상할 때는 화면의 숫자만 보지 말고, 어느 프로세스가 얼마나 쓰고 있는지 먼저 파악한다. 전체 메모리, 사용 중인 메모리, 여유 메모리를 동시에 본다. 그리고 그 값이 정상인지 비정상인지를 판단하려면 배포 초기의 상태를 알고 있어야 한다.
- 먼저 볼 값: 메모리 점유율, 프로세스별 사용량
- 같이 비교할 값: 배포 후 처음 1시간의 메모리 상태
- 기록해둘 것:
ps,free명령 출력, 재시작 전후 메모리
메모리 누수인지 확인하기
메모리 사용량이 계속 늘어나는 건 누수일 가능성이 높다. 몇 시간 동안 모니터링하면서 메모리가 증가 추세인지 안정적인지를 본다. 특정 작업 후에만 메모리가 증가하는 패턴이 있는지도 확인한다.
# 프로세스별 메모리 사용량 확인
ps aux | grep node
# 시스템 전체 메모리 상태
free -h
# 지속적 모니터링
watch -n 1 'free -h && ps aux | grep node'
어느 프로세스가 문제인지 찾기
메모리를 많이 쓰는 프로세스를 찾았으면, 그것이 정상 범위인지 확인한다. 예를 들어 데이터베이스, 캐시 서버, 애플리케이션 프로세스마다 정상 사용량이 다르다. 각 서비스별로 예상되는 메모리 사용량을 미리 알아두면 빠르게 판단할 수 있다.
디스크와 스왑도 함께 확인
메모리가 부족하면 디스크를 스왑으로 쓰게 되는데, 이 경우 성능이 급격히 떨어진다. 디스크 I/O가 높아지고 응답 시간이 길어지는 현상이 나타난다. 따라서 메모리뿐만 아니라 디스크와 스왑 상태도 함께 봐야 한다.
df -h
free | grep Swap
재시작 후 기록해두기
메모리 문제로 서버를 재시작하면 일단 해결된다. 하지만 같은 문제가 반복되지 않게 하려면, 재시작 전의 상태를 정리해 둬야 한다. 그 시점에 떠 있던 프로세스, 메모리 사용량, 발생한 에러 메시지를 기록해 두면 원인 파악에 큰 도움이 된다.