티스토리 뷰
모락 프로젝트를 진행하는 과정에서의 트러블 슈팅 내용을 다루고 있습니다.
오늘은 EC2 인스턴스에서 Swap Memory를 설정하는 방법에 대해 이야기해보려 합니다.
모락팀에서는 정적 분석 도구로 SonarQube를 사용합니다. SonarQube를 사용하기 위해서는 이를 위한 서버를 하나 띄워야합니다. 24시간 정적 분석이 가능하게 하려면 24시간 가동 중인 컴퓨터에 해당 서버를 띄워야겠죠? 그래서 저희는 SonarQube 용 EC2 인스턴스를 새로 띄우기로 결정했습니다.
그런데 이 과정에서 문제가 발생했습니다. SonarQube 설치까지는 정상적으로 완료했는데.. 서버가 띄워지지 않았습니다. 뭐가 문제일까? 고민을 하다 SonarQube 서버를 띄우기 위한 최소 메모리 요구사항이 있었던 것 같아 메모리 사용량을 확인해봤습니다.
top 명령어를 통해 메모리 사용량을 실시간으로 확인할 수 있습니다.
SonarQube 공식 문서를 보면 개인 사용자의 경우 최소 3GB의 메모리가 필요하다고 명시하고 있습니다. (역시 공식문서를 잘 읽어봐야겠죠?😅)
현재 사용 중인 EC2 인스턴스의 경우 1GB 메모리만을 사용할 수 있는 제약이 있었습니다. 저희는 추가적으로 2GB의 스왑 메모리(Swap Memory)를 설정해 이 문제를 해결하려 하였습니다.
스왑 메모리(Swap Memory)
그렇다면 스왑 메모리가 뭔지 알아봐야겠죠?
스왑 메모리란 실제 메모리(RAM)이 가득 찼지만 더 많은 메모리가 필요할 때 디스크 공간을 이용하여 부족한 메모리를 대체할 수 있는 공간(가상 메모리)을 의미합니다. 따라서 하드 디스크의 일부를 RAM 처럼 사용할 수 있게 하는 기술이라 볼 수 있습니다.
리눅스 커널은 실제 메모리에 올라와 있는 메모리 블록들 중 당장 쓰이지 않는 것을 디스크에 저장하므로써 사용 가능한 메모리 영역을 늘립니다.
하지만 스왑 메모리의 경우 그 크기를 유동성 있게 조절할 수 없기 때문에 하드 디스크의 공간을 항상 차지하고 있으며, 하드 디스크까지의 접근 시간이 추가되기 때문에 속도 측면에서는 성능이 떨어 질 수 있음에 유의해야합니다.
(토이 프로젝트 특성상?) 사실 속도적인 측면에서는 크게 체감한 부분은 없는 것 같습니다. 하지만 하드 디스크의 공간이 줄어든 다는 단점은 치명적일 수 있습니다. 저희 팀에서는 모든 EC2 인스턴스의 하드 디스크 크기를 8GB로 생성해주었습니다. 이 중 젠킨스(Jenkins)를 설치한 인스턴스의 경우 스왑 메모리를 설정하니 그 만큰 사용할 수 있는 하드 디스크의 크기가 줄어 젠킨스가 실행되지 않는 문제가 발생했습니다. (이 부분은 어쩔 수 없이 하드 디스크를 늘려 해결했습니다😂) 이 부분에 대해 인지하고 스왑 메모리를 설정하시면 좋겠습니다.
스왑 메모리 설정하기
이제 실제로 스왑 메모리를 설정해보려하는데요. 해당 과정은 AWS 공식 홈페이지를 참고하였으며, 실습 환경은 다음과 같습니다.
EC2 인스턴스 환경: Ubuntu, 64bit(Arm), t4g.micro(1GB), 8GB Storage
1. dd 명령을 사용하여 루트 파일 시스템에 빈 스왑 파일을 생성합니다.
$ sudo dd if=/dev/zero of=/swapfile bs=128M count=16
16+0 records in
16+0 records out
2147483648 bytes (2.1 GB, 2.0 GiB) copied, 14.3367 s, 150 MB/s
- of 옵션으로 스왑 파일의 위치와 이름을 지정할 수 있습니다. 저는 / 디렉토리에 swapfile이라는 이름으로 생성하였습니다.
- bs 옵션은 블록의 크기, count 옵션은 블록의 개수를 의미하며, 스왑 파일의 총 크기는 bs * count가 됩니다. 저는 총 2.1GB의 스왑 파일을 생성했습니다.
- bs(블록의 크기)는 인스턴스에서 사용 가능한 메모리보다 작아야 합니다. 그렇지 않으면 "memory exhausted" 오류가 발생합니다.
2. 스왑 파일의 읽기/쓰기 권한을 업데이트합니다.
$ sudo chmod 600 /swapfile
3. 앞서 만든 빈 파일(/swapfile
)을 스왑파일로 설정합니다.
$ sudo mkswap /swapfile
Setting up swapspace version 1, size = 2 GiB (2147479552 bytes)
no label, UUID=...
4. 스왑 공간에 스왑 파일을 추가해 스왑 파일을 즉시 활성화합니다.
$ sudo swapon /swapfile
이제 실제 메모리 1G + 가상 메모리 2G를 가지게 되었습니다😎
5. 스왑이 활성화된 파티션과 사이즈를 확인해봅니다.
$ sudo swapon -s
Filename Type Size Used Priority
/swapfile file 2097148 0 -2
6. /etc/fstab
파일 마지막 줄에 다음 내용을 추가해, 인스턴스가 재부팅되더라도 스왑 파일을 사용하도록 설정해줍니다.
/swapfile swap swap defaults 0 0
해당 설정을 해주지 않는다면 부득이한 경우로 EC2 인스턴스를 재부팅한 경우 스왑 파일이 적용되어 있지 않을 수 있습니다.
결론
다음과 같이 스왑 메모리 2GB가 추가되어 있으며, SonarQube 서버도 정상적으로 띄울 수 있었습니다😸
참고 자료
- https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/
- http://www.macnorton.com/csLab/886323
- https://jw910911.tistory.com/122
- https://it-serial.tistory.com/entry/Linux-Swap-%ED%8C%8C%ED%8B%B0%EC%85%98%EC%9D%B4%EB%9E%80-CPU-RAM-%ED%95%98%EB%93%9C-%EB%94%94%EC%8A%A4%ED%81%AC-%E2%91%A0
'Backend > Infra' 카테고리의 다른 글
내 통장에서 Amazon으로 돈이 새고 있었다.. (feat. AWS Lightsail, EC2) (3) | 2022.01.05 |
---|