EC2 내에서 Airflow 시스템을 구축하여 동작을 확인하던 도중,
dags 디렉토리에 DAG 파일들을 올리자 EC2 인스턴스가 shut down되는 상황이 발생했습니다.
-> Docker Container들이 차지하는 리소스로 인해 t3.medium의 최대 메모리 3.8GB에 도달한 것으로 추정
먼저, 원인이 메모리 부족인지 확인하기 위해 메모리 사용량에 대한 모니터링을 시도해보겠습니다.
기본적으로 제공되는 Cloudwatch는 메모리 사용량을 제공하지 않기 때문에 EC2에 CloudWatch Agent 설치하여 더 다양한 지표를 수집해보겠습니다.
정책 부여
대상이 되는 EC2 인스턴스에
CloudWatchAgentServerPolicy정책을 부여해줘야합니다.
Cloudwatch Agent 설치
(참조 : 공식문서)
# 설치
wget https://amazoncloudwatch-agent.s3.amazonaws.com/ubuntu/amd64/latest/amazon-cloudwatch-agent.deb
sudo dpkg -i -E ./amazon-cloudwatch-agent.deb
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-config-wizard
# Cloudwatch Agent 실행
sudo /opt/aws/amazon-cloudwatch-agent/bin/amazon-cloudwatch-agent-ctl -a fetch-config -m ec2 -c file:/opt/aws/amazon-cloudwatch-agent/bin/config.json -s
# 동작 확인
sudo amazon-cloudwatch-agent-ctl -m ec2 -a status

지속적으로 메모리 대부분이 사용 중인 것으로 보아 메모리 부족 문제가 맞는 것으로 보입니다.
따라서, Swap Memory를 통해 디스크 공간을 이용하여 메모리를 대체해보겠습니다.
단점 :
RAM 비해 디스크의 속도가 매우 느리므로, 성능 저하로 이어질 수 있습니다.
-> Scale up이 정답에 가깝겠지만 AWS 계정을 지원받아 사용하는 상황이기 때문에 선택지는 없습니다.
Swap Memory는 램 메모리의 2배 또는 그 이상을 추천한다고 합니다.
t3.medium은 메모리가 대략 4GB이니 128M x 64= 8192, 8GB로 Swap Memory를 설정하겠습니다.
sudo dd if=/dev/zero of=/swapfile bs=128M count=64
- dd : 블록 단위로 파일 복사 및 변환 명령어
- if : 지정한 파일을 입력 대상으로 설정
- of : 지정한 파일을 출력 대상으로 설정
- bs : 한 번에 작업 가능한 byte 크기
- count : 지정한 블록 수 만큼 복사
# swapfile 권한 설정
sudo chmod 600 /swapfile
# swap 공간 생성
sudo mkswap /swapfile
# swap 공간에 swap memory 추가
sudo swapon /swapfile
# 동작 확인
sudo swapon -s
# 스왑 영역 비활성화
sudo swapoff -a
# 시스템 부팅 시마다 자동으로 활성화되도록
# swap 파일시스템 설정
sudo vi /etc/fstab
# /etc/fstab의 가장 마지막에 추가
/swapfile swap swap defaults 0 0
-> 설정 이후 메모리 부족에 따른 딜레이 없이 정상적으로 작동하는 것을 확인했습니다.