Post

Elasticsearch 설정 파일: 주요 옵션과 시스템 최적화

elasticsearch.yml, jvm.options 설정값 구성, 리눅스 시스템 제한 해제, 가상 메모리 최적화 방법

Elasticsearch 설정 파일: 주요 옵션과 시스템 최적화

1. elasticsearch.yml

  • network.host
    • 개발 모드에서도 부트스트랩 체크를 수행하긴 하나 실패했을 경우 경고 로그만 출력할 뿐 시스템은 정상 동작한다. 하지만 운영 모드에서는 부트스트랩 체크에 실패하면 로그와 함께 즉시 노드의 실행이 중단된다.
    • network.host 값이 로컬 호스트이면 개발 모드이고 그 외는 운영 모드이다. 엘라스틱서치는 network.host 설정을 통해 해당 클러스터가 외부 네트워크를 통해 정식으로 운영 모드에 들어섰다고 판단한다.
    • 개발 모드: network.host를 수정하지 않았다면 기본적으로 로컬 호스트로 인식한다.
    • 운영 모드: network.host: [_local_, _site_, global_]
      • _local_: 로컬 네트워크
      • _site_: 내부 네트워크
      • _global_: 외부 네트워크 별칭
  • ML 옵션
    • xpack.ml.enabled: false
  • 메모리 스왑 비활성화
    • bootstrap.memory_lock: true
    • bootstrap.memory_lock 설정은 노드 실행 시 물리 메모리를 미리 할당받아 스왑 영역을 사용하지 않도록 방어하는 설정이다. 메모리 부족으로 인해 디스크의 스왑 영역을 참조할 경우 심각한 성능 저하가 발생할 수 있기 때문에 필수적으로 설정해야 한다.
    • 이는 스왑 영역 사용을 방지하기 위한 목적이므로 OS의 스왑 자체를 비활성화해 해결하는 방법도 있다.
  • 보안 기능 활성화
    • xpack.security.enabled: true
    • 운영 환경에서 보안 기능이 활성화되어 있고 다중 노드인 경우 반드시 TLS를 구성해야 한다. 그렇지 않으면 부트스트랩 체크에 실패한다.
  • 단일 노드 구성
    • discovery.type: single-node

2. jvm.options

  • 힙 메모리 설정
    • Xms와 Xmx 수치를 동일하게 할당한다
      • Xms는 최소 힙 크기, Xmx는 최대 힙 크기
      • 최소와 최대 힙 크기를 동일하게 할당하지 않으면 힙 메모리 할당량을 확장하는 과정에서 노드가 일시적으로 멈출 수 있다. 기본값은 1기가로 설정되어 있다.
    • 힙 크기는 최대 시스템 물리 메모리의 절반으로 한다
      • 엘라스틱서치는 빠른 검색과 인덱싱 성능을 위해 파일 시스템 캐시를 적극적으로 활용한다. 이 또한 상당한 메모리를 사용하므로 충분한 여유 메모리를 확보하지 않으면 성능상 문제가 될 수 있다.
    • 힙 크기는 최대 30~31GB를 넘기지 않는다
      • 자바에는 힙 메모리를 좀 더 빠르고 효율적으로 활용할 수 있도록 Compressed Ordinary Object Pointers 기술이 적용되어 있는데 이는 시스템마다 차이가 있지만 일반적으로 힙 메모리가 최대 32GB를 넘기면 비활성화된다.
      • 이 경우 충분히 큰 힙 메모리를 할당했음에도 오히려 성능이 급격히 저하되는 현상을 겪을 수 있다.
      • 예를 들어, 물리 장비당 단일 노드만 실행한다는 가정하에 물리 메모리가 32GB인 장비라면 16GB 힙 크기를 할당하고, 물리 메모리가 64GB인 장비라면 30~31GB 수준의 힙 크기를 할당하는 것이 적정하다.
      • 간혹 물리 장비에 128GB 이상의 메모리를 확보해 적정 수준 이상의 힙 메모리를 할당하는 경우가 있는데 이는 아무리 힙 크기가 커지더라도 성능상 이점이 없으므로 권장치는 넘기지 않는 것이 좋다.
      • 물리 메모리에 많은 여유가 있어 이를 충분히 활용하는 경우라면 동일 장비에 복수의 노드를 실행하는 방식을 검토하자
  • 임시 파일과 경로 설정
    • Djava.io.tmpdir=${ES_TMPDIR}
    • Djava.io.tmpdir는 임시 디렉토리 루트를 설정한다
    • 운영체제에서 기본 /tmp 임시 디렉토리의 경우 리눅스에서 주기적으로 정리하며 파일이 소실되어 문제가 발생하는 경우가 있으니 사용하지 않는 편을 권장
    • 임시 디렉토리의 경우 리눅스 패키지 매니저를 이용해 설치했을 때는 별도로 설정할 필요가 없지만, 아카이브 파일을 해제하고 설치했을 때는 노드를 실행하는 계정에서 읽기/쓰기가 가능한 디렉토리를 확보해 해당 경로를 입력해주자
  • 덤프 파일 경로 설정
    • -XX:HeapDumpPath=data
    • XX:HeapDumpPath는 힙 덤프 파일이 생성되면 저장되는 경로이다. 힙 덤프 파일 경로가 제대로 설정되어 있지 않다면 OutOfMemory 오류가 발생했을 때 원인 분석을 위한 덤프 파일을 찾는 데 문제가 발생할 수 있다.
    • 아카이브 파일을 해제하고 설치한 후 /config/elasticsearch.yml의 path.data를 별도로 수정하지 않았을 경우 기본적으로 data 디렉토리(elastic경로/data/)를 가리킨다. 하지만 리눅스 패키지 매니저를 사용해 설치했다면 해당 위치가 존재하지 않으므로 읽기/쓰기가 가능한 디렉토리를 확보해 경로를 수정해주자.

3. /etc/security/limits.conf

  • 리눅스 시스템 수준 제한 해제
    • es -nofile 65535
      • nofile은 최대 파일 디스크립터 수를 의미하며 시스템에서 최대로 열 수 있는 파일 수를 제한한다. 엘라스틱서치는 샤드 하나당 몇 개씩의 파일들을 열어놓고 사용하며, 인덱스가 늘어남에 비례해 이 숫자가 증가하기 때문에 운영 초기에는 문제가 없다가도 시간이 지남에 따라 샤드가 늘어나 파일 디스크립터 수 제한에 의해 문제가 발생하는 경우가 종종 있기 때문에 최소 65535 이상의 값으로 넉넉하게 잡아준다.
    • es -nproc 4096
      • nproc은 최대 프로세스 수를 제한하는 설정이다. 검색, 인덱싱, 머지 등 많은 작업들을 실행하다 보면 프로세스가 많이 생성된다. 별도의 스레드 풀을 통해 처리하는 엘라스틱서치 특성상 넉넉히 잡아주는 것이 좋다. 설정을 변경하지 않을 경우 기본값을 1024다.
    • es soft memlock unlimited
      • memlock unlimited는 메모리 내 주소 공간의 최대 크기를 지정하는데, 엘라스틱 가이드에 따라 무한대로 잡아준다.
      • soft와 hard는 프로그램 시작 시 적용하는 기본 한도와 최대 한도이며, 대시(-)는 soft와 hard를 동시에 적용한다.
      • 파일 수정 후 시스템을 리부팅하면 내용이 적용된다. 프로세스 리소스 한도 설정을 위한 리눅스 ulimit -a 명령으로 확인할 수 있다.
    • es hard memlock unlimited
    • es는 엘라스틱서치를 실행하는 사용자 계정명이라고 가정
    • 영구적으로 설정을 반영할 때는 limit.conf를 수정하고, 일시적인 테스트 목적이나 즉각적인 반영을 위해서는 ulimit 명령을 사용하자.
    • ulimit는 일반 사용자 계정으로 실행하면 안 되기 때문에 root 계정으로 들어간 다음 ulimit 명령을 이용하면 된다. -n은 파일 디스크립터 수, -u는 최대 프로세스 수, -l은 메모리 락을 설정한다.
      • ulimit -n 65535
      • ulimit -u 4096
      • ulimit -l unlimited

4. /etc/sysctl.conf

  • 최대 가상 메모리 개수 변경
    • vm.max_map_count = 262144
    • 엘라스틱서치는 기본적으로 파일 입출력 성능 향상을 위해 파일을 메모리에 매핑하는 nmap파일 시스템을 사용하는데, 이는 가상 메모리 공간을 사용하므로 충분한 공간을 확보할 필요가 있다.
This post is licensed under CC BY 4.0 by the author.