인프런 커뮤니티 질문&답변
RAM & 스왑메모리 폭증하는 문제
작성
·
29
·
수정됨
0
안녕하세요! 강의 늘 잘 듣고 있습니다!
CI/CD 배포하다가 서버가 자꾸 죽어서 스왑 메모리까지 도입을 했는데도 비정상적으로 RAM과 스왑메모리가 꽉 차는 이슈가 있는데 도저히 어떻게 해결해야할 지 몰라서 이렇게 질문 남깁니다!
서버 인프라 환경
ELB - EC2(t3.small, EBS: 30GiB)
EC2 내부 : Docker 기반 Spring Boot + MySQL 8.0 + Redis
문제 상황
어디가 구체적으로 문제인지 몰라서 그냥 구구절절 다 설명드릴게요.
처음부터 CI/CD가 안된건 아닙니다. 원래 잘 됐었는데요.
인증 도메인(일반/소셜 로그인) 정상 작동하는거 확인하고 push 해서 배포완료 후 docker-compose.yml 수정해서 push 하고나니까 갑자기 CICD 할때마다 서버가 다운되는 문제를 발견했습니다.
yml 파일을 바꾸게 된 경위는, 토큰 받아오는 과정에서 에러 뜨는거 보고 docker-compose.yml에 redis 관련 환경변수를 등록하는걸 깜빡했구나 싶어서 그거 추가한게 다 입니다. 이게 전혀 문제가 안될텐데 이상하게 이 시점 이후로 계속 문제가 터져서 좀 난감합니다.
애플리케이션이래봤자 아직 인증도메인 & 유저 간단한 CRUD가 전부라서 무거울게 없기 때문에 t3.small로도 충분할거라 생각했지만, 혹시나 하는 마음에 t3.medium으로 scale up을 해봤습니다.
그랬더니 이번엔 RAM 4GB와 Swap Memory를 5.9GB 까지 잡아먹는 비정상적인 현상이 계속 반복되더라구요.
혹시 한꺼번에 docker build를 해서 그런가 싶어서 container 별로 나눠서 빌드시키고 각 단계마다 sleep을 줘봤는데도 결과는 똑같았습니다.
아래가 이제 t3.small (Swap 4GB 설정)이구요

이게 t3.medium (Swap 6GB)입니다. (위와 로직이 좀 달라요. 근데 이러나 저러나 결과는 똑같아서..)

배포 관련 파일
대상 : deploy.yml, docker-compose.yml, Dockerfile
글자 수 제한 이슈로 노션에다가 코드 올렸습니다.
https://hooby.notion.site/CICD-OOM-2a6f6c063f3e805ba105d78284365fbe?source=copy_link
질문
혹시 제 deploy.yml이나 docker-compose.yml 에 문제가 있나요? 메모리 80% 이상 차지하는게 전부 Docker 관련 프로세스여서요.
Update 2: 테스트 결과에 따라 하단의 질문들이 원인이 아니라는게 검증됨
아니면.. t3.small이 docker 기반 Spring Boot + MySQL + Redis를 빌드 못할 수준인가요? (아닐 것 같긴해요.)
아니면 제 인증 구현 방식에 문제가 있어서 저럴 수도 있는건가요? Redis 기반으로 Token에 블랙리스트 설정하고, 클라이언트한테 쿠키로 토큰 심어서 내보내는 방식인데, 혹시 이게 문제가 될 수도 있는건가요? 근데 로컬에서 redis 랑 스프링부트 가동하고 htop으로 메모리 변화를 봤을 땐 문제 없어보이긴 했습니다.
긴 글 읽어주셔서 감사합니다.
Update 1: EC2에 직접 실행해본 결과
EC2에서 docker-compose.yml을 그 안에다가 직접 만들어서 mysql, redis만 띄우고
Spring Boot는 클론해서 환경변수 직접 세팅해주고 실행해봤습니다. 이는 혹시나 혹시나 애플리케이션이 너무 비정상적으로 설계되서 메모리를 많이 잡아먹진 않을까 하는 우려에 임시로 이렇게 세팅해뒀습니다.
결과적으로 잘 돌아갑니다. 메모리가 1.36GB 정도 잡히긴 하지만...? 그래도 redis + mysql + spring boot 다 돌렸을 때 이정도고 Swap 메모리 있으니까 괜찮지 않을까 하는 판단 중입니다. (아니면 호되게 지적해주세요) 하단은 임시로 세팅하기 위한 docker-compose.yml 입니다.
https://hooby.notion.site/CICD-OOM-2a6f6c063f3e805ba105d78284365fbe?source=copy_link
한번 이것도 CI/CD로 돌려봐야겠긴 한데, 우선 문제가 됐던 deploy.yml과 docker-compose.yml에서 어떤 문제가 있었길래 저런 사태가 발생했던건지 알고싶습니다.
Update 2: 우선 대안으로 SCP 활용
강의에서 초기 프로젝트에 좋다고 했던 방법대로 해결했습니다. CICD 과정에서 메모리는 900MB 미만 수준에서 안정적으로 돌았습니다. 근데 제가 원했던 설계는 Docker로 Spring Boot + MySQL + Redis 일원화였기 때문에 개발 완료되는대로 다시 찾아봐야겠습니다.
답변 1
0
안녕하세요, 인프런 AI 인턴입니다. Hooby님 질문 주셔서 감사합니다.
현재 발생하는 문제는 EC2 인스턴스에서 Docker 기반 애플리케이션을 실행할 때 메모리 및 스왑 메모리가 비정상적으로 많이 사용되는 것 같습니다. 몇 가지 고려해볼 수 있는 점을 아래에 설명드리겠습니다.
가능성 있는 문제와 해결책
리소스 과부하 확인:
htop명령어로 인스턴스의 리소스 사용률을 확인한 결과, Docker 관련 프로세스들이 메모리를 많이 사용하고 있는 것으로 보입니다. 각 컨테이너에 할당된 메모리를 줄이거나 필요한 리소스를 최적화할 수 있는지 확인해야 합니다.
Docker Compose 설정 확인:
docker-compose.yml파일에서 각 컨테이너의 메모리 제한을 설정할 수 있습니다.mem_limit및mem_reservation같은 설정을 통해 각 컨테이너가 사용할 수 있는 메모리 양을 최대치로 제한하면 메모리 과부하를 방지할 수 있습니다.
Spring Boot 및 MySQL 최적화:
- Spring Boot 애플리케이션의 JVM 메모리 설정을 조정해보세요. 기본적으로 JVM은 시스템 메모리를 많이 사용하려 하므로,
-Xmx및-Xms옵션을 통해 메모리 사용을 제한할 수 있습니다.
- MySQL의 InnoDB 버퍼 풀 크기 및 기타 메모리 관련 설정을 검토하여 최적화하십시오.
- Spring Boot 애플리케이션의 JVM 메모리 설정을 조정해보세요. 기본적으로 JVM은 시스템 메모리를 많이 사용하려 하므로,
Redis 설정 확인:
- Redis에서 사용하는 메모리 양도 최적화할 필요가 있습니다.
maxmemory설정을 통해 Redis의 메모리 사용 한계를 지정하고,maxmemory-policy를 적절히 설정하여 메모리 부족 상황에서의 처리를 정의할 수 있습니다.
- Redis에서 사용하는 메모리 양도 최적화할 필요가 있습니다.
비정상적인 동작 로그 분석:
- 배포 로그에서 특정 시점에 메모리 사용량이 급증하는 시점과 관련된 로그를 분석하여, 어떤 프로세스가 메모리를 많이 차지하는지 파악해야 합니다. 특히 로그 수준을 낮추어 불필요한 로그 기록을 줄이는 것도 도움이 될 수 있습니다.
- 배포 로그에서 특정 시점에 메모리 사용량이 급증하는 시점과 관련된 로그를 분석하여, 어떤 프로세스가 메모리를 많이 차지하는지 파악해야 합니다. 특히 로그 수준을 낮추어 불필요한 로그 기록을 줄이는 것도 도움이 될 수 있습니다.
관련 질문 및 답변
유사한 문제에 대한 다른 사용자의 경험을 참고하시면 도움이 될 수 있습니다:
- docker compose up 시 느려짐 + 프로젝트 실행 안되는 문제: 이 게시물에서는 Docker Compose 설정과 관련된 조언 및 해결책을 제공합니다.
현재 제공해 드린 안내가 도움이 되길 바랍니다. 저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크도 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.




