안녕하세요, Kernel360 크루 이강민 입니다. 오늘 포스팅에서는 AWS 프리티어를 효율적으로 사용하는 방법에 대해 이야기해보려고 합니다.
왜?
이번 내용을 준비한 이유는 개인적인 프로젝트나 실험적인 프로젝트를 진행 할 때 AWS 환경에서 최저의 비용으로 운용하여 장기간 서버를 유지하고자 할 필요성을 느꼈기 때문에 준비했습니다. 우리의 자원은 생각보다 넉넉하지 않죠 😰
비용을 절감하는 방법
사실 가장 확실한 방법은 홈서버를 운용하는 겁니다. 하지만 이 방법에는 여러 문제가 있습니다.
초기 구성하기가 어렵다.
- 사실 한번 세팅해본 분은 알지만 여간 까다로운게 아닙니다. 공유기 세팅부터 컴퓨터 운영체제까지 직접 세팅해야되죠.
보안의 이슈가 생긴다.
보안의 이슈는 피해갈 수 없는데요. 아무래도 집에서 서버를 운용하면 어떤 클라이언트가 우리 서버에 들어올지 모르기 때문에 홈서버를 운용할 때는 항상 조심스럽게 운용해야합니다.
그럼 어떻게?
제가 제시하는 방법은 다음과 같습니다.
내부적인 애플리케이션의 리소스 제한
인스턴스의 가상메모리 할당
제가 이 방법을 추천하는 이유는 AWS 인스턴스의 장점을 살리면서 비용을 최대한 낮게 사용할 수 있기 때문입니다.
내부적인 애플리케이션의 리소스 제한
들어가기 앞서
먼저 저희 팀의 애플리케이션을 이야기 드리자면 도커 환경에서 스프링 부트 애플리케이션을 운용하고 있습니다. 프리티어를 사용하다 보면 생각보다 리소스가 낮다는 걸 아실겁니다.
CPU : 1core, 주 기억장치 : 1GB, 보조 기억장치 : 10GB
어느 순간 서버가 알 수 없는 이유로 다운되는 현상이 있었는데요. 다운되는 현상을 파악하고자 모니터링을 해보았습니다.
CPU 리소스 부족 현상으로 가정하여 접근하였는데 사실 CPU 사용량은 높지 않은 시기에도 다운되는 현상이 있었습니다. 100%가까운 리소스는 서버를 처음 시작할 때 발생한 것을 로그 시간을 통해 알 수 있었죠. 그래서 저희는 애플리케이션 리소스를 모니터링 하였습니다.
아뿔사!
이미 리소스가 98% 이상 사용하고 있었더군요.
도커의 리소스 할당
앞서 저희 팀은 도커로 애플리케이션을 띄우고 있었습니다. 도커에서 기본적으로 필요한 사양을 무시하고 도커로 프로젝트를 무리하게 띄운것이 원인이 되었습니다.
그럼 어떻할까?
사실 우리의 주머니 사정이 넉넉하다면 프리티어를 업그레이드 하면 됩니다. 그러나 우리는 이 과정을 마치고도 프로젝트를 지속적으로 운용할 필요가 있었습니다. 애플리케이션의 메모리 사용량은 사실 많지 않았습니다. 많아보았자 400mb 안밖이였죠. 다른 모듈까지 합쳐도 800MB 가 안되었습니다. 그러나 도커 자체적으로 애플리케이션의 메모리 사용량에 따라 영역을 늘리는데요. 도커에게 할당되는 메모리 사용량 자체를 조절하여 리소스를 절약할 수 있었습니다.
도커의 메모리 제한은 쉽게 세팅할 수 있습니다. 도커 컴포즈 기준으로 아래와 같이 세팅하면 됩니다.
주의사항⚠️
도커의 메모리 사용량을 줄이는 것은 만능이 아닙니다.❗️ 도커의 사용량을 줄이게 되면 JVM의 영역도 줄어듭니다. 만약 애플리케이션의 사용량이 급증하면 가비지 컬렉터의 동작시간보다 메모리 사용량이 더 빠르게 넘쳐서 Out Of Memory 예외가 발생할 수 있습니다. 그러니 평소 각자의 애플리케이션 메모리 사용량을 체크하는 것이 중요합니다!
인스턴스의 가상메모리 할당
다음 방법으로 인스턴스 자체의 가상메모리를 할당하는 방법이 있습니다. AWS는 기본 스왑영역을 제공하고 있지 않습니다. 유저가 스스로 세팅해야되죠.
가상메모리 스왑 세팅하는 방법
- dd 명령을 사용하여 루트 파일 시스템에 스왑 파일을 생성. 명령에서 bs는 블록 크기이고 count는 블록 수입니다.
sudo dd if=/dev/zero of=/swapfile bs=128M count=32
- 스왑 파일의 읽기 및 쓰기 권한을 업데이트
sudo chmod 600 /swapfile
- Linux 스왑 영역을 설정합니다.
sudo mkswap /swapfile
- 스왑 공간에 스왑 파일을 추가하여 스왑 파일을 즉시 사용할 수 있도록 합니다.
sudo swapon /swapfile
- 절차가 성공적으로 완료되었는지 확인
sudo swapon -s
- 부팅 시 /etc/fstab 파일을 편집하여 스왑 파일을 시작합니다. 편집기에서 파일을 열기
sudo vi /etc/fstab
- 파일 끝에 다음 새 줄을 추가하고 파일을 저장한 다음 종료
/swapfile swap swap defaults 0 0
위와 같이 세팅했다면 아래 사진 처럼 확인할 수 있습니다.
top
1Gb 메모리에 2Gb를 스왑영역으로 설정한 모습입니다. 적절히 잘 이용되고 있군요.
정리
정리하자면 제가 추천드리는 방법은 도커의 메모리 제한과 더불어 인스턴스의 가상메모리 영역을 스왑으로 전환하여 사용하는 것입니다. 이 2가지 방법은 서로 다른 트레이드 오프가 존재합니다. 도커는 JVM 사용량에 영향을 직접적으로 준다는 것과 스왑영역에 과도한 메모리 할당시 잦은 컨텍스트스위칭으로 인한 성능저하 이슈 및 실제 보조 기억장치 영역의 축소가 있습니다.
그래서!
본인이 사용하는 애플리케이션에 맞춰서 적절히 사용량을 찾아가야한다
운용하는 애플리케이션에 맞춰서 도커와 인스턴스 환경 세팅을 맞춰가야 제한된 리소스환경에서 잘 운용할 수 있을 것 입니다.
긴 글 읽어주셔서 감사합니다. 🤟