Elasticsearch를 프로덕션 환경에서 구성시 vm.max_map_count 값을 조정해주어야 합니다.
이번 포스팅에서는 vm.max_map_count 값을 조정하지 않았을 때 발생하는 오류와 처리 방법을 소개해보도록 하겠습니다.
포스팅 환경
- CentOS 7
- Elasticsearch 7.16.2
오류
ERROR: [1] bootstrap checks failed
[1]: max virtual memory areas vm.max_map_count [65530] is too low, increase to at least [262144]
vm.max_map_count 값을 조정하지 않고 Elasticsearch를 구동하면 위와 같은 오류가 발생합니다.
해결 방법
오류 메시지대로 vm.max_map_count 값을 262,144로 상향하면 해결이 가능하며, 두 가지 방법이 있습니다.
일시 변경
sysctl -w vm.max_map_count=262144
현재 세션 기간 동안 지속되며, 재부팅 시 리셋됩니다.
영구 변경
vi /etc/sysctl.conf
vm.max_map_count=262144
재부팅 시에도 설정값이 유지됩니다.
왜 변경해야 할까?
vm.max_map_count는 무엇일까?
리눅스 커널 공식 문서를 보면 아래와 같이 설명하고 있습니다.
==============================================================
max_map_count:
This file contains the maximum number of memory map areas a process
may have. Memory map areas are used as a side-effect of calling
malloc, directly by mmap, mprotect, and madvise, and also when loading
shared libraries.
While most applications need less than a thousand maps, certain
programs, particularly malloc debuggers, may consume lots of them,
e.g., up to one or two maps per allocation.
The default value is 65536.
=============================================================
이 파일은 프로세스가 가질 수 있는 최대 메모리 맵 영역 수를 포함합니다. 메모리 맵 영역은 mmap, mprotect, madvice에 의한 malloc 호출의 사이드 이펙트로 사용되며, 공유 라이브러리를 로드할 때도 사용됩니다.
대부분의 애플리케이션이 천 개 미만의 메모리 맵을 필요로 하지만 특정 프로그램들(특히 malloc 디버거)은 더 많은 메모리 맵을 소비할 수 있습니다.
Elasticsearch는 많은 메모리 맵을 사용 하나 봅니다.
Elasticsearch 공식 도큐먼트에서는 아래와 같이 가상 메모리에 대해 설명해주고 있습니다.
Elasticsearch uses a mmapfs directory by default to store its indices. The default operating system limits on mmap counts is likely to be too low, which may result in out of memory exceptions.
Elasticsearch는 인덱스를 저장할 때 기본적으로 mmapfs 디렉터리를 사용합니다. 운영 체제의 기본 mmap 개수 제한은 너무 낮아 Out of memory 예외를 유발할 수 있습니다.
아, 그렇군요. Elasticsearch는 mmapfs를 사용하고 있고, 기본 제한 값은 너무 낮기 때문에 상향 조정해야 한다고 합니다. 그렇다면 mmapfs는 대체 무엇일까요?
mmapfs 란?
Elasticsearch 공식 도큐먼트에서 mmapfs에 대한 설명이 존재했습니다.
The MMap FS type stores the shard index on the file system (maps to Lucene MMapDirectory) by mapping a file into memory (mmap). Memory mapping uses up a portion of the virtual memory address space in your process equal to the size of the file being mapped. Before using this class, be sure you have allowed plenty of virtual address space.
MMap FS 타입은 파일을 메모리에 매핑하여(mmap) 파일 시스템(Lucene의 MMapDirectory에 대응됨)에 샤드 인덱스를 저장합니다. 메모리 매핑은 매핑되는 파일과 동일한 크기의 프로세스 내 가상 메모리 주소 공간의 일부를 사용합니다. 이 클래스를 사용하려면 충분한 가상 주소 공간이 허용되어야 합니다.
Elasticsearch는 mmapfs로 샤드 인덱스를 메모리에 매핑해 저장하고 있고, 이 메모리 매핑 작업이 가상 메모리 주소 공간을 사용하기 때문에 가상 메모리 주소 공간을 충분히 확보해줘야 했군요!
MMapDirectory 란?
MMapDirectory는 Lucene의 인덱스를 저장 및 관리하는 디렉터리 구현입니다.
자세한 내용은 아래 블로그에서 아주 잘 정리해주셔서 글을 인용하기보다 소개해드리고 싶어 링크로 남깁니다.
References
'📦 ETC' 카테고리의 다른 글
[Elasticsearch] 마스터노드 선출 실패 오류 (0) | 2022.03.17 |
---|---|
[Elasticsearch] X-Pack Security 활성화 시 오류 (0) | 2022.03.15 |
[Jenkins Blue Ocean] 젠킨스가 어려운 개발자를 위해 (0) | 2021.08.28 |
[Swagger] Swagger를 이용해 API 문서를 자동으로 만들어보자 (0) | 2020.11.05 |
[Swagger] API 명세도구를 사용해보자 (0) | 2020.10.31 |