JVM 옵션

기본적으로 직접 튜닝을 해야할 필요는 없다. JVM옵션도 대부분 최적화된 옵션으로 제공되기 때문에 수정할 필요성은 낮다. (https://www.elastic.co/guide/en/elasticsearch/reference/current/heap-size.html)

하지만 기본으로 제공하는 옵션에는 힙의 크기가 1GB로 설정되어있기 때문에 이 부분은 수정해아한다.

힙 크기는 32GB 이하가 권장된다.

JVM에서는 32기가까지는 메모리 주소 공간 표현을 위해 사용되는 Object Pointer의 동작방식이 Compressed Ordinary Object Pointer를 사용한다.

이를 통해 메모리 공간을 효율적으로 표현하여 사용하는데, 이 표현방식이 32기가까지만 지원된다. 32기가를 넘어서면 Object Pointer는 64비트 기반 동작하게 되고 포인터 관리에 오버해드가 생기게 된다. 그래서 힙 크기를 32기가 이하로 설정하는 것이 권장된다. 또한 너무 큰 힙메모리는 긴 STW를 야기할 수 있다.

OS 옵션

https://www.elastic.co/guide/en/elasticsearch/reference/current/setting-system-settings.html

시스템 캐시 적극 활용

엘라스틱서치는 루씬 기반으로 세그먼트 생성과 관리를 위해 커널의 시스템 캐시를 적극 활용하고 있다. 그래서 물리메모리 공간의 50%정도는 운영체제가 자유롭게 사용할수 있도록 여유를 주는 것이 권장된다.

나머지 50%는 엘라스틱서치의 힙메모리로 할당되는 것이 적절하다.

ulimit 제한

최대 파일 디스크립터 수, 가상 메모리 제한 등이 넉넉한지 확인해야한다. 또한 NIO에서 버퍼 할당시에는 힙메모리가 아닌 OS 네이티브 영역에서 할당 받게 되므로 ulimit의 값 또한 중요하게 고려되어야한다.

vm.max_map_count 확인

루씬에서는 메모리맵 파일을 많이 사용하게 되는데, mmap 크기 제한을 넉넉하게 수정해야한다. 일반적인 시스템에서 max_map_count의 기본값은 65,530으로 설정되어있는데, 대용량 시스템에는 이 값이 너무 작을수 있다.