Elasticsearch не хватило памяти кучи Java
«java.lang.OutOfMemoryError: Java heap space» и «fatal error in thread ..., exiting» в журнале Elasticsearch: узлу не хватило памяти кучи, и процесс завершился. Как выбрать размер кучи и что её съедает.
Что это значит
Elasticsearch работает на Java, и всё, что он держит в памяти (структуры индексов, агрегации, кэши), живёт в куче ограниченного размера. Когда её не хватает, Java выбрасывает OutOfMemoryError: Java heap space, а Elasticsearch при такой ошибке завершает процесс, перед этим записав fatal error in thread [...], exiting.
Частые причины: куча слишком мала для объёма данных и числа шардов; тяжёлая агрегация или запрос с огромным результатом; слишком много шардов на узле.
Как проверить
grep -E "OutOfMemoryError|fatal error" /var/log/elasticsearch/*.log | tail
curl -s localhost:9200/_cat/nodes?h=name,heap.percent,heap.max
curl -s localhost:9200/_cat/shards | wc -l
Что сделать
- Увеличить кучу параметрами
-Xmsи-Xmx(одинаковые значения, не больше половины памяти сервера и не больше примерно 31 ГБ). В решении вендора «Мониторинг Directum RX» это параметрes_java_memory_GBв секции мониторинга Directum Launcher. - Сократить число шардов: объединять мелкие ежедневные индексы, удалять старые. Подробнее в статье про логи RX и шарды.
- Найти тяжёлые запросы в журнале медленных запросов и ограничить их.
Ошибка повторяется?
Запустите Диагностика: за полминуты он покажет состояние базы, брокера, поиска и сервера. С отчётом разберём причину за 30 минут бесплатного созвона.
Написать