[서버/운영] 자원 최적화

by thdus

그동안 AWS 오토스케일러 서비스를 활용해서 1코어/1기가 인스턴스로 아침에는 2대~ 저녁에는 5대로 자동스케일링 되는 서버 구조를 유지해왔다. 그러나 업데이트 이후 메모리 누수를 일정 부분 잡으면서 t4g 인스턴스 하나로도 충분히 트래픽을 감당한다고 생각(..)했고 약 한 달 넘는 모니터링 기간 동안 이상이 없어 오토스케일러를 제거했다. 그러나 추후 트래픽이 증가할 것을 예상해서 최소한 앞단의 LB 는 남기기로 했다.(천만 다행)


그러다 사건이 발생했다.

잦은 버그가 많았던 첫 달 이후, 월 방문자 트래픽은 꾸준히 증가해서 4만 정도였던 월 활성 사용자수가 8만을 찍었다 인스턴스 자원 사용율을 모니터링 했을때는 cpu 사용율이 순간 25%로 치솟은 구간이 몇 차례 있었지만, 내가 예전에 대기업 일본 법인 서버 자원 사용율을 모니터링 할 때에 비해서는 아주 안정적인 수치라고 판단해서 별 다른 조치를 취하지 않았었다.

그렇게 안일하게 생각한지 일주일도 되지 않아, 서버가 터졌다.

황급히 죽은 서버를 lb 그룹에서 제외하고 새로운 서버를 띄웠고, 발견한 지 10분 만에 정상화 되었지만, lb health check 는 왜 정상인지 의문 투성이었다.

다음날 제외했던 ec2 instance에 접속하여 죽기 직전 앱 로그를 확인 하다가 그 원인을 찾았다. Heap Memory 가 부족해서 프로세스가 중지된 것이다.


인스턴스 자원이 곧 돈이기에, 우선 다음과 같은 가설을 세웠다.


1. ec2-user 권한으로 실행해서 메모리 limit 이 걸려있을 가능성

ulimit -m / -v 커멘드로 확인해봐도 unlimited로 잘 잡혀 있었다.


2. 필요가 없어서 작게 잡혀 있었을 가능성

45MB는 초기 할당 크기. Node.js는 --max-old-space-size로 설정한 최대 메모리를 처음부터 할당하지 않고, 필요에 따라 점진적으로 증가시킨다.

최초 모니터링 시점이 이른 저녁(사용자 ~100명 남짓)이었고, 연결수가 적은 시점에서 현재 애플리케이션이 더 많은 메모리를 요구하지 않으므로 힙 크기가 증가하지 않아 힙 메모리 사용율이 높았던게 아닐까

아무리 그래도 사용율이 90%인데 힙 메모리를 더 할당하지 않는게 이상했다.


3. 어딘가 심각한 메모리 누수가 있을 가능성

그 전부터 메모리 최적화가 마음에 걸렸던 나는 이 수치를 보고 마음이 뜨끔해져서 급하게 힙 덤프를 뜨기로 결심한다. 힙덤프를 뜬다는 것은 특정 시점 힙 메모리를 차지하고 있는 데이터를 확인하기 위해 스냅샷을 생성하는 것과 동일한 의미이다.

요즘은 다 너무 편리하고 좋아져서 덤프 뜨는 방법도 간단하다.

spacesheep은 pm2로 배포되어 있으므로 다음 커멘트를 사용하면 된다.


덤프 파일의 경로는 .pm2 폴더 밑이다.

현재 백엔드 서버는 private subnet에 위치시켜놓고 터널링용 인스턴스로 모니터링하고 있어서, 직접 로컬로 다운로드 받을 수는 없었다. 번거롭지만 ec2에서 터널링 인스턴스로, 그 다음 다시 로컬로 복사했다.

scp -i "your-secrete-key.pem" [username}@{instance-ip}:/path-to-dump/heap-1741098277610.heapsnapshot .


1. 인스턴스 시작 직후

2. 메모리 사용율 체크

3. 사용률이 급격히 증가하는 구간에 여러번 캡쳐


위 과정을 반복하여 여러 파일을 다운로드 받고, 분석에는 chrome 의 개발자도구를 활용한다.

heapsnapshot type 파일 여러개를 모두 올려놓고 이렇게 수치 비교가 가능하다.

스크린샷 2025-03-05 09.22.21.png



트래픽을 막아놓고 캡쳐했음에도 어쨌든 가장 큰 비중을 차지하는 부분이 소캣 연결쪽 코드인 것 같았다.

실제로 redis io adapter 쪽에 메모리가 누수될 위험이 심각한 코드를 발견했고, 수정하여 패치했다.

그래도 눈에 띄는 사용율 감소는 없었다.


결국 현재의 트래픽을 감당하기에, 특히 io 작업이 대부분을 차지하는 지금의 워크로드에서 ec2 스팩을 높이는 것이 최선이라는 판단을 하게 된다.


눈물을 머금고 t4g 패밀리에서 조금 더 큰 메모리 스펙을 가진 서버로 업그레이드 했다.

빨리 광고를 붙여서 서버비를 충당해야 할 텐데 ㅜㅜ


keyword