
최근 EC2 인스턴스에서 여러 마이크로서비스를 운영하던 중 메모리 부족으로 SSH 접속이 불가능한 상황이 발생했다.
단순히 인스턴스를 재부팅하는 응급조치로는 근본적인 문제를 해결할 수 없었기 때문에,
원인 분석과 함께 스펙 업그레이드 및 추가 대안을 검토해보았다 !
📌 문제 상황
운영 중인 EC2 인스턴스(t3.medium)에서 서비스가 불안정해지고 SSH 접속이 끊겼다.
top 명령어를 확인했을 때, 메모리 사용량은 이미 포화 상태였다.

- 사용 중인 메모리: 3791.7 MiB / 3.8 GiB
- 남은 메모리: 101.9 MiB
- 주요 프로세스에서 java가 다수의 메모리를 사용 중
- 시스템 응답 속도가 느려지고 SSH 접속조차 어려운 상황 발생
✅ 원인
- EC2 인스턴스 유형: t3.medium (2 vCPU / 4GB RAM)
- 실행 중인 서비스 수: 약 13개
- 문제의 핵심: Java 기반 마이크로서비스들이 JVM 힙 메모리를 각자 크게 사용하면서 전체 메모리 부족(OOM)이 발생
🔧 해결 방법
1. EC2 인스턴스 중지
메모리가 포화된 상태라 SSH로 접근이 어려웠기 때문에, AWS 콘솔에서 인스턴스를 직접 중지(Stop)했다.
이 과정에서 EBS 볼륨이 삭제되지 않도록 ‘Delete on Termination’ 옵션을 반드시 확인했다.
2. 인스턴스 유형 변경
인스턴스를 중지한 후, 콘솔에서 다음 경로로 이동
EC2 > 인스턴스 > 인스턴스 선택 > 작업 > 인스턴스 설정 > 인스턴스 유형 변경
- 변경 전: t3.medium (2 vCPU / 4GB)
- 변경 후: t3.large (2 vCPU / 8GB)
3. 인스턴스 시작
인스턴스 유형 변경 후 다시 시작(Start) 하면, 설정한 인스턴스 유형으로 부팅됩니다.
이 상태에서 SSH 접속도 정상적으로 가능해졌고, 서비스도 안정적으로 동작했다
🔥 추가적인 근본 대안
스펙 업그레이드는 가장 빠르고 확실한 해결책이지만, 비용이 증가한다는 단점이 있다.
장기적으로는 다음과 같은 최적화 방안도 고려해야 한다 !
(1) JVM 메모리 최적화
- 각 서비스 실행 시 -Xmx, -Xms 옵션을 조정해 불필요한 메모리 점유를 최소화
java -Xms256m -Xmx512m -jar service.jar
(2) 서비스 구조 점검
- 항상 실행할 필요 없는 서비스는 On-Demand 실행으로 전환하거나, 모듈 통합을 고려
(3) 스왑 메모리 설정
- 물리 메모리가 부족한 경우를 대비해 스왑 파일을 생성해 Out-of-Memory 상황을 완화
sudo dd if=/dev/zero of=/swapfile bs=1M count=2048
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
(4) 모니터링 도입
- Prometheus + Grafana, Micrometer 등을 통해 각 서비스별 메모리 사용량을 시각화해 병목 서비스 파악
💡 마무리
이번 경험을 통해 단순 재부팅은 응급조치일 뿐, 근본 해결책이 될 수 없다는 점을 다시금 느꼈다.
메모리 부족 문제를 해결하기 위해 스펙 업그레이드를 진행했지만, 앞으로는 JVM 튜닝, 서비스 구조 최적화, 모니터링을 통해 지속적으로 안정적인 서버 환경을 만들어 나가야 할 것이다.
'Study > TIL | AWS' 카테고리의 다른 글
| VYBZ 서비스 도메인 & Nginx 라우팅 설정 완벽 가이드 (1) | 2025.07.21 |
|---|---|
| Route53부터 Certbot까지 : HTTPS 서버 구축 초기 과정 (2) | 2025.07.21 |
| EC2 인스턴스 EBS 볼륨 확장 및 파일 시스템 확장 방법 (0) | 2025.06.15 |
| AWS S3 사용 전 꼭 알아야 할 IAM 권한 설정 가이드 (2) | 2025.06.15 |
| 2차 개인 프로젝트 CI/CD 배포 자동화 구축 (0) | 2025.05.22 |