SystemdDoctor
elasticsearch.service поискjvm

Elasticsearch в systemd: почему не запускается

Elasticsearch — служба на JVM с высокими требованиями к системным пределам. Отказы почти всегда сводятся к четырём вещам: не хватило памяти под JVM, занижен vm.max_map_count, мал предел дескрипторов, или нет прав на каталоги данных.

О службе

Elasticsearch при запуске проверяет системные настройки и отказывается стартовать, если они не соответствуют требованиям. Это осознанное поведение: вместо медленной работы и потери данных служба сразу говорит, что не так. Сообщения проверок понятные, и их стоит читать буквально.

Самая частая из проверок — vm.max_map_count: требуется не меньше 262144. Значение по умолчанию в дистрибутивах меньше, и его нужно поднимать через sysctl. Вторая — предел дескрипторов: нужно не меньше 65535.

Память под JVM задаётся в настройках самого Elasticsearch, а не в unit-файле. Если задать MemoryMax= в unit меньше, чем размер кучи JVM, службу будут убивать по нехватке памяти вскоре после старта.

Как устроена

Требование к vm.max_map_countне меньше 262144, иначе служба не стартует
Требование к дескрипторамLimitNOFILE не меньше 65535
Память JVMзадаётся в jvm.options самого Elasticsearch, не в unit-файле
Журнал/var/log/elasticsearch/ — там причины отказа проверок
Время запускадесятки секунд и больше; таймаут в unit должен это учитывать

Частые ошибки

12 записей базы отмечены за этой службой.

Коды выхода

  • status=1/FAILURE в systemdКод 1/FAILURE означает, что программа запустилась и сама завершилась с ошибкой. Как найти настоящую причину в журнале службы.

Состояния результата

  • Failed with result 'oom-kill'Состояние oom-kill: процесс службы убит из-за нехватки памяти. Как понять, упёрлись в предел службы или в память машины.
  • Failed with result 'timeout'Состояние timeout: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.

Ресурсы и ограничения

Сообщения журнала

  • Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.

Ошибки служб

Коды выхода этой службы

Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.

statusЧто означает у этой службыКуда смотреть
1/FAILURE не прошла одна из проверок системных настроек или ошибка конфигурации. разбор
78 ошибка конфигурации по набору sysexits. разбор
убит сигналом KILL JVM вышла за предел памяти службы. разбор

Диагностика

Сообщения проверок и точная причина отказа.

sudo tail -60 /var/log/elasticsearch/elasticsearch.log

Первое, что проверяет Elasticsearch при старте.

sysctl vm.max_map_count

Пределы службы: дескрипторы и память.

systemctl show elasticsearch -p LimitNOFILE -p MemoryMax

Код и сигнал завершения.

systemctl status elasticsearch --no-pager -l

Параметры unit, которые тут важны

  • LimitNOFILE=обязательно 65535 и выше
  • LimitMEMLOCK=при блокировке памяти JVM нужен infinity
  • MemoryMax=если задаёте, значение должно быть больше кучи JVM с запасом
  • TimeoutStartSec=запуск занимает десятки секунд

Источники