프로젝트가 진행되어가면서 배포환경에 설치해주어야할 패키지들도 점점 늘어갔다.
최근에 오디오 파일 여러개를 Celery를 통해 하나로 합쳐주는 기능을 추가하면서 몇 가지 패키지들을 설치했다.
Celery
와 오디오 파일을 다룰 수 있게 해주는 pydub
, 그리고 코덱 패키지인듯한 ffmpeg
, libavcodec-ffmpeg-extra56
를 설치했고 Dockerfile에도 추가하였다.
그런데 로컬환경에서 Docker를 실행해서 잘 작동하는 것까지 테스트해보고 eb deploy
명령을 실행했는데 아래와 같은 에러메세지가 뜨면서 실패했다.
...
Failed to pull Docker image nachown/soundhub:latest: 810cda0c698: Download complete 78322efe1025: Verifying Checksum 78322efe1025: Download complete failed to register layer: ApplyLayer fork/exec /proc/self/exe: cannot allocate memory stdout: stderr: . Check snapshot logs for details.
...
Docker image를 가져오지 못했다길래 Dockerfile에 문제가 있나 싶어서 Dockerfile을 새로 작성해보기도 하고, Dockerhub에 올라가있는 베이스 이미지도 다시 push 해주기도 했는데 그래도 여전히 배포가 안됐다.
삽질을 거듭한 결과 이 에러의 원인이 EC2의 메모리 용량부족임을 알게되었고 EC2의 Swap Memory를 늘려주는 명령을 ebextensions
에 추가해주었더니 배포가 되었다.
Swap Memory
스왑 메모리는 RAM에 공간이 부족해서 저장되지 못한 데이터를 저장하기 위해 사용하는 하드디스크의 일부 공간을 말한다. RAM은 속도가 매우 빠르기 때문에 상대적으로 더 중요한 처리를 RAM에서 하고 덜 중요한 처리를 스왑 메모리로 옮겨서 천천히 처리하게끔 하는 용도로도 쓰인다고 한다.
리눅스를 설치할 때 스왑 메모리를 위한 파티션을 따로 설정하라는 과정에서 이게 뭐지? 하면서 의아해했던 기억이 난다.
스왑 메모리를 사용하면 아래와 같은 장단점이 있다고 한다.
- 장점
- 메모리가 다 찼을 경우 보조 공간을 제공한다.
- 상대적으로 더 중요한 작업을 메모리에서 처리할 수 있도록 돕는다.
- 최대 절전 기능을 사용할 수 있게 한다.
- 단점
- 스왑 메모리를 위한 파티션은 동적으로 설정할 수도 없고 결국 하드디스크 공간의 일부이기 때문에 설정한 만큼 하드 용량이 작아진다.
- 하드디스크의 소모율이 늘어날 수 있다.
- 항상 성능 향상에 도움이 되는것은 아니다.
EC2 Swap Memory 늘려주기
Celery를 이용하여 오디오 믹싱을 처리하는 기능이 추가된 새로운 버전의 프로젝트가 배포가 안된 이유는 새로운 패키지들이 추가된 Docker Image를 모두 불러오기에는 EC2의 메모리가 부족했기 때문이었다.
ebextensions
를 이용하면 EC2의 스왑 메모리를 늘려주어서 메모리가 부족한 경우 하드디스크에 나머지를 저장할 수 있도록 해줄 수 있다.
.ebextensions
폴더에 01_setup_swap.config
라는 파일을 추가한 다음 아래와 같이 작성해준다.
files:
"/home/ec2-user/setup_swap.sh":
mode: "000755"
owner: root
group: root
content: |
#!/bin/bash
# based on http://steinn.org/post/elasticbeanstalk-swap/
SWAPFILE=/var/swapfile
SWAP_MEGABYTES=2048
if [ -f $SWAPFILE ]; then
echo "Swapfile $SWAPFILE found, assuming already setup"
exit;
fi
/bin/dd if=/dev/zero of=$SWAPFILE bs=1M count=$SWAP_MEGABYTES
/bin/chmod 600 $SWAPFILE
/sbin/mkswap $SWAPFILE
/sbin/swapon $SWAPFILE
commands:
01setup_swap:
command: "bash setup_swap.sh"
cwd: "/home/ec2-user/"
SWAP_MEGABYTES
에다가 설정할 스왑 메모리 크기를 MB 단위로 넣어주면 된다.
보통 RAM의 2배 정도로 설정한다고 하니 2048MB를 넣어주었다.
스왑 메모리 크기 설정에 관한 가이드라인 같은 것도 있는 것 같던데 나중에 한 번 알아보아야겠다.
파일을 추가하고나서 다시 배포를 한 다음 eb ssh
로 Elastic-beanstalk의 EC2에 들어가서 메모리 사이즈를 확인해보았다.
$ free
total used free shared buffers cached
Mem: 1017292 604324 412968 356 9512 148500
-/+ buffers/cache: 446312 570980
Swap: 2097148 23984 2073164
Swap
항목에 용량이 생긴 것을 볼 수 있었고, 배포도 잘 되는 것을 확인했다.
Reference
stein.org:http://steinn.org/post/elasticbeanstalk-swap/
서지스윈 블로그: http://sergeswin.com/1034