EC2 메모리 부족 문제
EC2 상태
EC2 서비스가 배포되어 있던 인스턴스의 상태 검사가 아래와 같이 Green으로 표시되어야 하는데 연결 불가능으로 나와 있던 걸 발견하였다.

EC2가 종료된 원인을 파악해 보다가 아래와 같이 CPU 사용률이 100%가까이 찍히고 그 뒤로 종료된 것을 확인할 수 있었다.

CPU 사용량이 급증한 원인을 찾아보니 메모리가 부족해 질 경우 이런 식으로 CPU의 사용량이 증가해서 문제가 생기는 것을 알 수 있었다.
메모리가 부족할 때 CPU의 사용량이 증가하는 이유
- 페이지 폴트 증가
- 페이지 Fault란 프로세스가 요청한 데이터가 메모리에 존재하지 않을 때 발생한다.
- 컨텍스트 스위치 증가
- 메모리가 부족하면 애플리케이션은 더 많은 쓰레드를 생성해서 작업을 처리하려 시도할 수 있다. 이 과정에서 스레드간의 컨텍스트 스위치가 자주 발생될 수 있다.
해결 방안
현 시점에서 메모리가 더 높은 인스턴스로 변경은 좋은 선택이 아니라 판단해서 스왑메모리를 사용하기로 하였다.
스왑 메모리란 운영체제 에서 메모리가 부족할 때 디스크의 일부 공간을 메모리 처럼 사용하는 기술이다. 현재 볼륨 디스크의 용량이 4기가 정도 남아 있어서 절반인 2기가를 스왑메모리로 설정하고자 하였다.
# 2GB 크기의 스왑 파일을 생성
sudo fallocate -l 2G /swapfile
# 생성된 스왑 파일의 권한을 설정
sudo chmod 600 /swapfile
# /swapfile을 스왑 영역으로 설정
sudo mkswap /swapfile
# /swapfile 스왑 파일을 사용하도록 활성화
sudo swapon /swapfile
# /etc/fstab 파일에 스왑 파일에 대한 정보를 추가하여, 시스템 부팅 시 자동으로 스왑 파일을 활성화하도록 설정
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 현재 활성화된 스왑 공간의 목록을 표시
sudo swapon --show
# 시스템의 메모리 사용량을 표시
free -h
스왑 메모리의 상태를 확인하기 위해서는 vmstat 1 명령어를 사용해서 확인해 볼 수 있다.
스왑 메모리 변경
# 기존 스왑 메모리 비활성화
sudo swapoff /swapfile
# 스왑 메모리 파일 생성(4기가)
# -ㅣ(--length) 생성할 파일의 크기를 지정한다.
sudo fallocate -l 4G /swapfile
# 생성된 스왑 파일의 권한을 설정
sudo chmod 600 /swapfile
# /swapfile을 스왑 영역으로 설정
sudo mkswap /swapfile
# /swapfile 스왑 파일을 사용하도록 활성화
sudo swapon /swapfile
# /etc/fstab 파일에 스왑 파일에 대한 정보를 추가하여, 시스템 부팅 시 자동으로 스왑 파일을 활성화하도록 설정
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab
# 현재 활성화된 스왑 공간의 목록을 표시
sudo swapon --show
# 시스템의 메모리 사용량을 표시
free -hecho의 /swapfile none swap sw 0 0의 의미
/swapfile : 스왑 파일의 경로 none : 장치에 대한 마운트의 의미 ⇒ 스왑파일은 필요 없음 swap : 사용된 파일 시스템 또는 마운트 유형을 지정 ⇒ 스왑 파일이므로 swap 지정 sw : 스왑 파일을 사용할 때 필요한 옵션 ⇒ 스왑 사용 허용 0 0: 첫 번째는 백업 설정, 두 번째는 시스템 검사 ⇒ 백업과 검사가 필요 없으므로 0
/etc/fstab파일의 역할
리눅스 및 유닉스 시스템에서 파일 시스템과 스토리지 장치를 자동으로 마운트 하기 위한 구성파일이다.
- 파일 시스템의 자동 마운트
- 부팅 시 디스크 파티션 및 스토리지 장치를 특정 경로에 자동으로 마운트합니다.
- 스왑 메모리 활성화
- 스왑 파티션이나 스왑 파일을 자동으로 설정합니다.
- 네트워크 파일 시스템(NFS) 마운트
- 원격 파일 시스템을 네트워크를 통해 자동으로 마운트합니다.
- 장치와 파일 시스템 설정 관리
- 특정 파티션에 대한 읽기/쓰기 권한과 같은 마운트 옵션을 설정합니다.