[EC2] 서버 멈춤 (메모리 스왑)

2024. 1. 25. 17:07

들어가며

Tweaver 프로젝트의 서버 작업을 하던 도중 서버가 멈추는 상황이 발생했다. 프로젝트를 같이 진행한 백엔드 개발자 한 분과 함께 화면을 공유하며 페어 프로그래밍을 진행했다. 그 과정을 기록하고자 한다.


문제 상황

[그림1] EC2 인스턴스 접속 직후의 상태

EC2에 접속 후 docker run... 명령을 실행했다. 동작은 잘 됐고 로그도 잘 뜨는 걸 확인했다. 하지만 몇 초 뒤 이상증상이 발생했다. 각자 로컬환경에서 해당 서버로 접속한 뒤 각자 문제를 파악했다. 화면을 공유하며 정리한 증상은 다음과 같았다.

  1. EC2 서버내 docker를 이용해 컨테이너를 올린 후 몇 초뒤 서버가 느려진다.
  2. HTTP 접속을 해도 응답을 해주지 않았다.
  3. 느려지고 난 뒤에는 다른 사용자가 EC2 서버에 SSH 접속을 해도 오랜시간 기다려야 한다.

 

첫 번째

[그림2] 인바운드 규칙

우선적으로 생각해 볼 수 있는건 보안 설정이었다. Tweaver 동작과 로그에는 이상이 없었는데 HTTP 접속을 하면 응답을 하지 않았기 때문이다. 하지만 인바운드, 아웃바운드 규칙 역시 모두 허용되어있었다.

보안 문제는 아니었다. 증상을 바탕으로 찾아보니 EC2 메모리 부족 현상일 수 있다고 한다.

 

두 번째

스왑 메모리를 늘리기 위해 https://ko.linux-console.net/?p=473 페이지를 참조했다. 스왑 메모리의 용량은 레드햇에서 권장크기를 설명하고 있다. 이에 따라 EC2 인스턴스 램의 2배인 2기가로 설정했다. ssh 접속후 바로 슈퍼유저로 접속했기 때문에 sudo는 생략했다. 또한 링크의 fallocate 명령어 대신 동일한 더미파일 생성 명령어인 dd를 사용했다.

기본적으로 새로 만들어진 인스턴스라 메모리 확인 과정은 넘어갔었다. 모든 작업 이후 확인($ df -h)해보니 /dev/root 의 총 메모리는 29G이고 그중 24G를 사용할 수 있는걸 확인했다.

$ swapon --show
$ dd if=/dev/zero of=/swapfile bs=128M count=16  # 128M * 16 == 2048M (2G)
$ chmod 600 /swapfile
$ mkswap /swapfile
$ swapon /swapfile
$ swapon -s
$ echo "/swapfile swap swap defaults 0 0" >> /etc/fstab  # 스왑 공간을 영구적으로 만들기

[그림3] /etc/fstab 내용


최종 결과

[그림4] 메모리가 잘 나누어진 모습
[그림5] ssh 접속 직후의 개요

결과는 성공적이었다. 진짜 별의별 곳에서 문제가 생기는구나 싶었다.

다른 개발자와 실시간으로 화면과 생각을 공유하니 뭐라 표현하기 힘든 뿌듯함이 있었다. 해당 작업이 엄밀하게 따지면 코드 작성과 길잡이가 명확히 나뉜 페어프로그래밍은 아니었다. 하지만 해당 작업의 이유를 설명하는 것에 중점을 둔 것과 문제를 넓은 관점에서 파악하는 것, 이러한 관점에서의 페어프로그래밍이었다. 

뿌듯함과 동시에 나는 메모리 관련 지식의 부족함을 느꼈고, 같이 진행해주신 개발자님을 보며 논리적인 문제 접근 방식에 대해 배울 수 있었다.

BELATED ARTICLES

more