EC2에서 엘라스틱서치 메모리 부족 문제 해결 경험

안녕하세요. 이번 글에서는 제가 직접 겪은 AWS EC2에서 Docker로 띄운 엘라스틱서치(Elasticsearch) 메모리 부족 문제를 해결한 경험을 공유하려고 합니다. 제가 개발한 하잇(HowToEat) 앱은 음식 데이터가 15만 건 이상이라 검색 안정성이 생명인데, 어느 날 “김밥” 검색 시 아무 결과가 나오지 않아 당황스러운 경험을 했습니다.

 

AWS EC2에서 Docker로 띄운 엘라스틱서치가 OOM으로 종료될 때, 실제 경험 기반으로 메모리 튜닝과 Swap 활성화 방법을 설명드립니다. 안정적인 검색 환경 확보 방법, heap 조정, Swap 설정까지 상세하게 설명되어 있으니 누군가에게는 꼭 도움이 되었으면 하네요.

 

문제 상황 분석

 

 

AWS 콘솔과 터미널을 통해 확인해보니, EC2(t3.small, 2GB)에서 메모리가 거의 바닥난 상태였습니다. free -h 명령어로 확인해보니 available 메모리가 고작 165Mi밖에 남지 않은 상황이었고, Docker로 띄운 엘라스틱서치가 OOM(Out Of Memory)으로 종료된 것이 원인이었습니다.

 

원인 파악

 

엘라스틱 서치 Out Of Memory

 

docker-compose.yml 파일을 열어보니, 엘라스틱서치에 1GB heap을 고정할당해두었더군요. 즉, 총 2GB 중 1GB는 Elasticsearch, 나머지 1GB는 OS와 Docker가 사용하고 있었던 것입니다. 트래픽이 조금만 늘어나도 메모리 부족이 발생할 수밖에 없는 구조였습니다.

 

문제 해결 접근법

 

해결 방법은 세 가지로 나뉘었습니다:

  1. EC2 업그레이드: t3.small → t3.medium으로 확장. 비용 부담 때문에 보류.
  2. Elasticsearch heap 조정: 기존 1GB → 512MB로 감소. 성능 약간 저하 가능하지만 충분.
  3. Swap 활성화: 디스크 일부를 가상 메모리처럼 활용. RAM 부족 시 안정성 확보 가능.

 

최종 해결 방법 적용

 

결국 2번과 3번을 함께 적용했습니다. 먼저 docker-compose.yml에서 heap 사이즈를 512MB로 줄였습니다.

services:
  elasticsearch:
    environment:
      - ES_JAVA_OPTS=-Xms512m -Xmx512m
    restart: always

 

 

적용 후 free -h를 확인하니 available 메모리가 670Mi까지 확보되어 안정성이 크게 향상되었습니다.

 

 

Swap 설정

 

1GB Swap 파일을 생성하고 활성화하여 물리 메모리 부족 시 가상 메모리를 활용하도록 설정했습니다.

sudo fallocate -l 1G /swapfile
sudo chmod 600 /swapfile
sudo mkswap /swapfile
sudo swapon /swapfile
echo '/swapfile none swap sw 0 0' | sudo tee -a /etc/fstab

결과와 느낀 점

 

ES heap 512MB + Swap 설정으로, available 메모리가 확보되고 OOM으로 인한 서버 다운 문제를 예방할 수 있었습니다. 이번 경험을 통해 서버 메모리 튜닝이 얼마나 중요한지 깨달았고, 단순히 돌아가는 서버가 아니라 안정적으로 운영되는 서버가 진짜 운영이라는 사실을 다시 느꼈습니다.