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: служба не уложилась в отведённое время при запуске, остановке или перезагрузке настроек.
Ресурсы и ограничения
- Too many open files в журнале службыСлужба исчерпала лимит файловых дескрипторов. Как правильно поднять LimitNOFILE и когда дело в утечке.
- No space left on device в журнале службыНет места на устройстве: разбор по свободным блокам, по inode, по журналу systemd и по удалённым, но открытым файлам.
- Cannot allocate memory в журнале службыНе удалось выделить память: предел службы, память машины, настройка overcommit, исчерпанные области отображения.
- Служба не создаёт потоки: упор в пределОшибка создания потока: исчерпан TasksMax или системный предел процессов. Как посчитать нужное значение.
Сообщения журнала
- Permission denied в журнале службыОтказ в доступе у службы systemd: права на файл, каталоги по пути, пользователь службы, параметры изоляции, SELinux и AppArmor.
Ошибки служб
- Elasticsearch: max virtual memory areas vm.max_map_count is too lowElasticsearch отказывается стартовать из-за заниженного vm.max_map_count. Как поднять значение и закрепить его.
- Elasticsearch: индексы переведены в режим только для чтенияElasticsearch блокирует запись при нехватке места: пороги watermark. Как снять блокировку правильно.
- Elasticsearch: служба падает из-за размера кучи JVMРазмер кучи больше доступной памяти или больше предела службы: падение при старте или под нагрузкой.
- Java-служба: OutOfMemoryError и кучаСлужба на JVM падает с нехваткой памяти: размер кучи, предел контрольной группы, дампы кучи.
Коды выхода этой службы
Числа в status=N ниже 200 назначает сама программа, 200 и выше — systemd, когда не смог подготовить запуск.
Диагностика
Сообщения проверок и точная причина отказа.
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=запуск занимает десятки секунд
Источники
- Документация Elasticsearch: важные системные настройки
- Воспроизведено на тестовой машине, systemd 255 (Ubuntu 24.04)