RECENT POSTS

최근에 작성한 글

01 / 03

전체 글

전체 보기

[Infra] 운영 서버 메모리와 Swap 필요성

🚨 운영 서버에서 확인한 메모리 상태

배포 서버에서 free -h 명령어를 실행했다.

$ free -h

              total        used        free      shared  buff/cache   available
Mem:          908Mi       723Mi        11Mi        72Mi       173Mi       184Mi
Swap:         2.0Gi       197Mi       1.8Gi
 

처음에는 free 메모리가 11MB밖에 남지 않았다!!

  • 물리 메모리(RAM)는 거의 한계까지 사용 중이다.
  • Swap 메모리를 이미 197MB 사용 중이다.
  • available 메모리도 약 184MB 수준이다.

즉, 서버는 이미 Swap을 사용하면서 버티고 있는 상태였다.


Swap이란 무엇일까?

Swap은 RAM이 부족할 때 디스크 공간 일부를 메모리처럼 사용하는 가상 메모리이다.

메모리가 부족해지면 Linux는 당장 사용하지 않는 메모리 페이지를 디스크로 이동시키는데 이를 Swap-out이라고 한다.

반대로 해당 데이터가 다시 필요해지면 디스크에서 RAM으로 가져오는데 이를 Swap-in이라고 한다.

즉,

RAM이 부족할 때 디스크를 임시 메모리처럼 사용하는 기술

이라고 이해하면 된다.


왜 Swap을 사용할까?

처음에는

"RAM이 부족하면 RAM만 늘리면 되는 것 아닌가?"

라고 생각했다.

하지만 실제 운영 환경에서는 그렇지 않다.

1. 서버가 죽는 것을 막아준다.

트래픽이 순간적으로 증가하거나 특정 작업 때문에 메모리가 일시적으로 부족해질 수 있다.

이때 Swap이 없다면 서버는 바로 메모리 부족 상태에 빠지게 된다.

Swap은 이런 순간적인 메모리 부족을 완화하는 안전장치(Buffer) 역할을 한다.


2. 비용을 줄일 수 있다.

RAM은 상대적으로 비싼 자원이다.

반면 SSD 공간은 훨씬 저렴하다.

모든 피크 상황에 맞춰 RAM을 크게 구성하기보다는 일정 수준의 Swap을 함께 사용하는 것이 현실적인 선택인 경우가 많다.


만약 Swap이 없었다면?

Swap이 없는 상태에서 메모리가 모두 소진되면 Linux 커널은 OOM Killer(Out Of Memory Killer) 를 실행한다.

OOM Killer는 시스템 전체가 멈추는 것을 막기 위해 메모리를 많이 사용하는 프로세스를 강제로 종료한다.

대표적으로

  • Spring Boot
  • PostgreSQL
  • Redis

같은 프로세스가 종료될 가능성이 있다.

그러면 서버 자체는 살아 있어도

  • API가 모두 502 Bad Gateway를 반환하거나
  • DB 연결이 끊기거나
  • 서비스가 정상적으로 동작하지 않는 장애

가 발생할 수 있다.

이번 서버에서는

Swap: 197Mi 사용
 

중이었기 때문에 약 200MB 정도를 Swap이 대신 처리해 주면서 서비스가 계속 동작할 수 있었던 것으로 보인다.


그렇다고 Swap을 계속 사용하면 좋은 걸까?

그렇지는 않다.

Swap은 디스크를 사용하는 메모리이다.

RAM보다 훨씬 느리기 때문에 Swap 사용량이 계속 증가하면 디스크 I/O가 증가하고 응답 속도가 급격하게 느려질 수 있다.

심한 경우에는 Thrashing 현상이 발생한다.

Thrashing은 CPU가 실제 작업보다 Swap-in과 Swap-out 작업에 대부분의 시간을 사용하는 상태를 의미한다.

이 상태가 되면 CPU 사용률은 높지만 실제 서비스는 매우 느려진다.

즉, Swap은 서버를 살려주는 응급처치일 뿐, 지속적으로 사용하는 메모리는 아니다.


실무에서는 메모리를 어떻게 관리할까?

운영 환경에서는 일반적으로 다음 기준을 많이 사용한다.

Available Memory

가능하면 RAM의 20~30% 정도는 항상 여유를 두는 것을 권장한다.

여유 메모리가 10% 이하로 내려가면 모니터링 시스템(Prometheus, Datadog 등)에서 Alert를 발생시키도록 설정하는 경우도 많다고 한다..


AWS EC2에서는?

메모리가 작은

  • t3.micro
  • t3.small

같은 인스턴스에서는 Swap을 설정하는 경우가 많다.

보통 RAM의 1~2배 정도를 Swap으로 구성한다.


Kubernetes에서는?

흥미롭게도 Kubernetes에서는 Swap 사용을 권장하지 않는다.

컨테이너는 느리게 버티는 것보다 빠르게 종료(OOMKilled)시키고 새로운 컨테이너를 다시 생성(Self-Healing)하는 것이 더 안정적인 구조이기 때문이다.