Elastic Search

Ch10. 대용량 처리를 위한 시스템 최적화 - 분산환경에서의 메모리 스와핑

webmaster 2025. 10. 10. 12:08
728x90

메모리 스와핑

대부분 운영체제에서는 효율적인 메모리 관리를 위해 스와핑이라는 기술을 사용하며, 이를 통해 사용되지 않는 애플리케이션의 물리 메모리를 디스크로 스왑 한다.

메인 메모리와 Disk

  • 스와핑이 일어나면 가상 메모리의 일부 내용을 디스크로 쓰기 위해 디스크의 일정 영역을 스왑 영역으로 만든다.
    • 이때 일어나는 동기화 작업에 의해 순식간에 시스템 성능이 떨어지고 장애가 발생할 수도 있다.
    • 시스템 리소스가 넉넉하면 스와핑이 일어나지 않도록 설정하는 것이 안전하다.(지속적인 스왑 인/아웃 과정을 통해 성능이 급격히 나빠질 수도 있다.)
  • 운영체제 관점에서는 스와핑은 많은 리소스를 사용하므로 모니터링을 철저히 해야 한다.

free: 스왑 상태 체크

free

cat /proc/swaps: 스왑 영역이 디스크상 생성된 위치 확인

cat proc/swaps

sar: 스왑 인/아웃이 일어나고 있는 메모리 상태 확인

sar -r -s 21:00:00 //스왑핑 메모리 상태 보기
sar -B 2 5 //스왑 통계 보기

엘라스틱서치에서 스와핑을 비활성화해야 하는 이유

  • 엘라스틱서치가 동작하는데 필요한 메모리도 스와핑으로 인해 언제든지 디스크로 스와핑 될 수 있으며, 스와핑이 발생할 경우 노드 안정성에 치명적이기 때문에 이를 최대한 피해야 한다.
    • 스와핑 작업으로 GC가 수분동안 지속되거나, 노드 응답이 느려질 수 있다.
    • 클러스터 연결이 불안정해서 연결됨과 끊어짐이 반복될 수 있다.
  • 클러스터를 구성하는 노드에는 가능한 엘라스틱서치만 단독 운영하는 것이 좋다.
    • 엘라스틱서치가 물리 메모리를 독점할 수 있기 때문에 스와핑이 필요 없다.
    • 스와핑 작업이 일어나지 않도록 시스템에서 비활성화할 수도 있다.

스와핑을 피하는 법

1) 스와핑 비활성화

sudo swapoff -a
//vi /etc/fstab //영구 비활성화
  • 엘라스틱서치 노드 전용으로 사용하면 스와핑을 비활성화하는 것이 좋다.

2) 스와핑 최소화

sudo sysctl vm.swappiness=1 //swappiness = 1 설정
//cat /proc/sys/vm/swappiness //vm.swappiness 정보 확인
  • 스와핑 주기를 조절해서 발생 빈도를 최소화하는 것도 가능하다.
  • vm.swappiness 값을 1로 설정 시, 스와핑을 최대한 이용하지 않는다는 의미며, 일반적인 상황에서 스와핑을 일어나지 않게 할 수 있다.

3) memory_lock 설정

vi /elasticsearch.yml

bootstrap.memory_lock: true
  • 사용자 권한만 가지고 있다면, vm.swappiness를 수정할 수 없기 때문에 엘라스틱서치의 bootstrap.momory_lock 속성을 이용하면 된다.
    • 활성화 시, mlockall() 함수와 동일한 방식으로 애플리케이션 차원에서 스와핑을 최대한 방지할 수 있다.
  • momory_lock 방식은 애플리케이션 레벨에서만 제한적인 기술로 운영체제 차원에서 메모리 부족으로 판단될 경우 이 설정이 무시되고 스와핑이 일어날 수 있다.
mlockall() 함수
커널 수준에서 제공하는 저수준 함수 중 하나로, 호출한 프로세스의 페이징을 금지시키고 모든 메모리가 RAM에 상주하는 것을 보장한다. 애플리케이션을 개발할 때 사용하는 memory_lock 기술인데, 이를 활용하면 애플리케이션이 최초 실행될 때 할당받은 메모리를 스와핑 하지 못하도록 강제로 메모리를 잡을 수 있다.
GET _nodes?filter_path=**.mlockall
{
  "nodes": {
    "e6YYBK_6Su2qugjROIfPZw": {
      "process": {
        "mlockall": true
      }
    }
  }
}
  • 엘라스틱서치를 실행해서 해당 명령어로 확인할 수 있다.
  • false가 나오면 memory_lock에 실패한 것으로 로그를 확인해 원인을 확인해야 한다.
  • memory_lock 설정에 실패하는 대부분 케이스는 운영체제의 리소스 제한 설정이 주원인이고 ulimit 명령어로 unlimited로 변경하면 된다.

기본적으로 swapoff 명령어로 운영체제에서 스왑핑이 발생하지 않도록 하고,엘라스틱서치 환경설정을 이용해 bootstrap.memory_lock 속성을 활성화하는 것을 추천한다.

 

728x90