Elasticsearch: служба падает из-за размера кучи JVM
Куча JVM выделяется при старте и не может превышать доступную память. Если размер кучи задан больше предела памяти службы, процесс убивают почти сразу — и выглядит это как загадочное падение без сообщений.
Вероятные причины
По порядку: сверху то, что встречается чаще.
-
Куча больше предела памяти службы
Предел контрольной группы жёстче любых настроек JVM. При превышении процесс убивает ядро.
-
Куча больше половины памяти машины
Рекомендация Elasticsearch — не больше половины памяти: остальное нужно файловому кешу, от которого зависит скорость поиска.
-
Размер кучи задан в двух местах
Настройки в основном файле и в каталоге дополнений могут конфликтовать, и применяется не то, что вы правили.
Диагностика
Команды идут в том порядке, в котором их стоит выполнять: каждая следующая проверяет то, что осталось после предыдущей.
Все объявления размера кучи.
grep -rE "^-Xm" /etc/elasticsearch/ 2>/dev/nullПредел памяти службы и пик потребления.
systemctl show elasticsearch -p MemoryMax -p MemoryPeakУбивало ли процесс ядро.
journalctl -k -b --no-pager | grep -i "killed process" | grep -i javaРешение
Решение своё для каждой причины. Сначала определите, какая из них ваша, — иначе правки наложатся друг на друга.
- Почему происходит
- Предел контрольной группы жёстче любых настроек JVM. При превышении процесс убивает ядро.
- Как проверить
-
Сравните размер кучи и предел службы.
grep -E "^-Xm" /etc/elasticsearch/jvm.options* 2>/dev/null systemctl show elasticsearch -p MemoryMax -p MemoryPeak
- Как исправить
- Задавайте предел службы с запасом к размеру кучи: JVM расходует память и вне кучи. Запас в треть от размера кучи — разумная отправная точка.
- Почему происходит
- Рекомендация Elasticsearch — не больше половины памяти: остальное нужно файловому кешу, от которого зависит скорость поиска.
- Как проверить
-
Посмотрите память машины и размер кучи.
free -h grep -E "^-Xm" /etc/elasticsearch/jvm.options* 2>/dev/null
- Как исправить
- Уменьшите размер кучи до половины памяти или меньше. Больше 32 ГБ задавать не стоит: теряется сжатие указателей.
- Почему происходит
- Настройки в основном файле и в каталоге дополнений могут конфликтовать, и применяется не то, что вы правили.
- Как проверить
-
Посмотрите все объявления.
grep -rE "^-Xm" /etc/elasticsearch/ 2>/dev/null
- Как исправить
- Оставьте размер кучи в одном месте — в файле дополнений, как рекомендует документация.
Пример вывода
Куча больше предела памяти службы. Пример показательный: он собран на тестовой машине специально для этой страницы, а не взят из чужого журнала.
$ grep -E "^-Xm" /etc/elasticsearch/jvm.options.d/heap.options
-Xms8g
-Xmx8g
$ systemctl show elasticsearch -p MemoryMax
MemoryMax=6442450944
kernel: Out of memory: Killed process 1200 (java) total-vm:12812480kB
Связанные ошибки
- Failed with result 'oom-kill' Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
- Cannot allocate memory в журнале службы Не удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Elasticsearch: max virtual memory areas vm.max_map_count is too low Elasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Elasticsearch: индексы переведены в режим только для чтения Elasticsearch блокирует запись при нехватке места: пороги watermark. Как снять блокировку правильно.
- Hardware Error / EDAC: ошибки памяти в журнале Ядро сообщает об ошибках памяти. Что считать безобидным, а что поводом менять модуль.
- Java-служба: OutOfMemoryError и куча Служба на JVM падает с нехваткой памяти: размер кучи, предел контрольной группы, дампы кучи.
- MySQL убит из-за памяти: буферный пул больше доступной памяти MySQL падает сразу после старта или через минуты: размер innodb_buffer_pool_size превышает память машины.
- RabbitMQ: тревога по свободному месту блокирует отправителей Брокер перестаёт принимать сообщения: сработала тревога по диску или памяти. Как снять и что настроить.
Где встречается чаще всего
Источники
- Документация Elasticsearch: размер кучи
-
Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)
Воспроизведено кучей 8 ГБ при MemoryMax 6 ГБ.