[AWS/Infra] EC2 서버 instance(인스턴스)가 운영 중 죽을 때, Out of memory: kill process 메모리 부족 해결 방법(swap memory)



1. 문제

AWS 서버 호스팅(혹은 다른 클라우드 서비스도 동일합니다)을 사용하다보면, EC2 서버 instance(인스턴스)가 운영 중 죽을 때가 있습니다. 저는 이전에 다른 클라우드 서비스와 aws ec2 를 사용하면서 이러한 문제를 겪었습니다.

aws 의 첫 가입자들에게는 ec2 t2.micro 를 1년 무료로 제공해주는데, 이 때 대여해주는 서비스의 자원이 넉넉하지 않다보니 이러한 현상을 겪을 가능성도 더더욱 높아지는 것 같습니다. 저는 기존 서비스 운영의 경우에 트래픽이나 서비스가 무겁지 않은 서비스인데 이러한 현상이 발생하여, 원인을 찾아보게 되었습니다. 처음에는 이유를 잘 모르는 상태에서 서비스가 죽으면 오는 메일을 보고 서비스를 직접 가서 구동 시켰지만, 반복적으로 불편하게 직접 서버에 접속을 해야 하는 불편함이 존재했습니다. 또, 자주 죽는 서비스 자체가 비정상적인 현상이기 때문에 원인을 찾아보았습니다.

2. 해결과정

처음에는 정확히 어떻게 원인을 찾아야 할 지 몰라 굉장히 해맸는데, 이것저것 찾으면서 인스턴스 서버 linux 의 로그를 살펴보았습니다. 인스턴스에 직접 들어가서 /var/log 를 입력하여 로그를 확인해보니, Out of memory: kill process로 인하여 해당 서비스가 자동으로 죽은 것이었습니다(aws 는 문제가 발생하는 ec2 인스턴스에 들어가서 작업 -> 모니터링 및 문제 해결 -> 시스템 로그 가져오기 과정을 통해서 로그를 볼 수 있습니다).

즉, 서버의 메모리 부족 현상으로 인하여 죽은 것인데요. 매우 간단한 웹 서비스였고 동일한 자원을 가진 다른 EC2에서 다른 분들은 문제를 겪지 않는 것 같아서 원인을 좀 더 살펴보았습니다. 바로 해결책이 떠오르지 않았고, 어느 날 swap 메모리 문제가 아닐까라는 생각에 아래의 명령어를 입력하여 인스턴스의 swap 메모리를 확인해보았습니다.

$ free -m

명령어를 입력하여 확인해보니 Swap 메모리는 0을 사용하고 있었습니다. 해당 서비스의 경우 이미지를 불러오는 데 많은 리소스를 사용(이미지를 link 방식으로 저장소에서 가져오는 것이 아니라, Base64 방식으로 직접 서비스가 그려주기 때문)했었는데요. 이 때, 많은 리소스를 서비스가 사용하여 간헐적으로 서비스가 죽는 것으로 확인했습니다.

image

인스턴스의 성능에 따라 잡아야 하는 swap 메모리는 다르지만, 저는 1GB Memory 인스턴스를 사용했기 때문에 2GB 의 swap 메모리를 잡았습니다. How much swap do I need? 링크에 들어가서 확인해보면 위의 이미지와 같은 값을 설정해 주면 된다고 말해주고 있습니다. 저는 적절한 Swap 메모리 값 중, Maximum 값을 사용한 것이죠.

스왑 파일을 사용하여 Amazon EC2 인스턴스에서 스왑 공간으로 사용할 메모리를 할당하는 방법은 무엇입니까? 아마존에서 설명하고 있는 링크를 따라 명령어를 입력해주면 swap 메모리를 손쉽게 설정할 수 있습니다. 아래와 같은 명령어들을 입력해주어야합니다.

image

swap 메모리 설정 이후에는 서비스가 한 번도 죽지않고 정상적으로 운영되었습니다. 서비스 운영을 하다보면 많은 문제가 발생할 수 있을 것 같은데요. 이러한 문제로 어려움을 겪고 계신다면 위의 방법으로 해결할 수 있는지, swap 메모리가 잘 설정되어 있는지 확인해보시면 좋을 것 같습니다!


reference

  • https://aws.amazon.com/ko/premiumsupport/knowledge-center/ec2-memory-swap-file/