요약 : EC2 디스크 용량(8G) 문제였다.
운영하고 있는 서비스에서 EC2가 지속적으로 중단되는 문제가 발생했다……우리의 문제 상황은 다음과 같았다.
- 브랜치에 머지된 후 git workflow를 통한 CI/CD과정 중 중단
- 서비스 사용 중 갑자기 중단.
서치를 해보니 swap 메모리 부족… 코드 자체 문제(무한 루프)등등.. 많은 문제 상황과 해결방법이 나왔지만 우리에게 적용되지는 않았다.
우리는 AWS에서 인스턴스를 재부팅했을 때 다시 정상적으로 구동되었고, 시간이 흘렀을 때 1, 2의 상황에서 EC2가 중지되었다.
현재 운영 중인 서비스인데 계속 중단되어 PM과 프론트 팀에게 너무 미안했다ㅜㅜ… 어떻게든 해결해보려 다시 미친듯이 구글링을 했지만 뚜렷한 문제 파악을 못했다….
결국 모니터링 도구(프로메테우스, 그라파나)를 붙여 몇 주간 지켜보기로 했는데, 그라파나 대시보드에서 ec2의 디스크 사용량이 8~90%정도에 웃도는 것을 발견했다.
뭔가 이상함을 감지하고 EC2에 접속해서 df -h 명령어를 통해 충격적인 디스크 사용량을 보게 되었다.
루트 볼륨의 Use가 100%였다……
EC2가 지속적으로 터지는 이유가 이거였구나 싶었다. 문제 해결을 위해 EC2의 루트 볼륨을 늘려주었다.
AWS 프리티어는 30G까지 무료이므로, 늘릴 수 있을만큼 늘리자.
EC2 디스크 용량 늘리기
우선 AWS에 접속해서 인스턴스 → 스토리지에서 볼륨을 클릭한다.
볼륨에 접속해서 우측 상단 [수정]을 클릭한다.
원하는 만큼 크기를 눌러준 후 저장한다.
사이트에서만 수정하면 증가하는 것이 아니고, 터미널에서 별도의 작업이 필요하다.
이미 8기가를 꽉 채우고 시도하면 No space left on the block device이라는 오류가 발생할 수 있다. 아래 명령어는 이를 방지하기 위해 임시 파일 시스템인 tmpfs로 tmp를 마운트해서 임시 파일 저장 공간을 확보하는 작업이다. (참고)
sudo mount -o size=10M,rw,nodev,nosuid -t tmpfs tmpfs /tmp
그 다음 디스크를 확장한다. 우선 lsblk 명령어를 통해 확장할 디스크 이름을 확인한다. 저기서 nvme0n1 이 확장할 디스크이다.
아래 명령어로 디스크를 확장한다. 명령어 구성은 아래와 같다.
- growpart : 특정 디스크의 파티션 크기를 확장하는 명령어
- /dev/nvme0n1 : 확장할 디스크
- 1 : 디스크의 첫번째 파티션 번호, 위에서 nvme0n1p1 에 해당한다.
sudo growpart /dev/nvme0n1 1
- 파일 시스템을 조정한 디스크 크기에 맞게 확장한다.
sudo resize2fs /dev/root
- 위에서 마운트했던 tmpfs를 언마운트한다.
sudo umount /tmp
그러면 디스크(nvme0n1)와 파일 시스템에도 반영이 완료되었음을 확인할 수 있다.
만약에 도커로 컨테이너화된 모니터링 도구를 통해 서버 자체를 모니터링 하고 있었다면 docker compose up 명령어를 통해 다시 한 번 돌려주자.
조정 후 대략 이주일 정도의 기간이 지났는데 이제 서버가 터지지 않는다!
참고