Руководство по использованию памяти Elasticsearch

Процесс Elasticsearch очень требователен к памяти. Elasticsearch использует JVM (Java Virtual Machine), и около 50% памяти, доступной на узле, должно быть выделено под JVM. Машина JVM использует память, поскольку процесс Lucene должен знать, где искать значения индексов на диске. Остальные 50% требуются для кэша файловой системы, который хранит в памяти данные, к которым регулярно обращаются.

Elasticsearch

Требования к памяти Elasticsearch

jvm.mem

Наиболее важной секцией памяти является куча JVM.

Вывод может выглядеть следующим образом:

Обратите внимание, что значение heap_used_in_bytes в здоровой JVM будет иметь пилообразный характер из-за процесса сборки мусора: оно постоянно увеличивается примерно до 70%, а затем резко уменьшается до 30%, когда происходит сборка мусора.

Значение heap_max JVM зависит от значения, заданного в файле jvm.options, и его следует установить на уровне 50% от объема оперативной памяти, доступной для вашего контейнера или сервера.

Объяснение различных типов статистики памяти

Рассматривая статистику памяти, мы должны учитывать, что многие приложения Elasticsearch выполняются внутри контейнеров на гораздо больших машинах. Это типично, если вы используете хостинговый сервис, например AWS Elasticsearch или облако Elastic, или если вы запускаете Elasticsearch на Docker или Kubernetes. В таких случаях важно внимательно относиться к интерпретации доступной нам статистики памяти.

В API-интерфейсах мониторинга Elasticsearch доступны различные статистические данные о памяти, которые описаны ниже:

Приведенная статистика относится к узлу разработки, работающему на docker. Проинтерпретируем полученные здесь участки:

os.mem

Первая секция "mem" относится к хост-серверу, на котором запущена машина. В данном случае мы работаем с docker, поэтому 16 ГБ относится к памяти хост-машины, на которой запущен контейнер. Обратите внимание, что использование машиной почти 100% памяти является вполне нормальным явлением, и это не свидетельствует о наличии проблемы.

os.swap

Секция swap снова относится к хост-машине. В данном случае мы видим, что хост-машина разрешает свопинг. Это вполне нормально, если мы запускаем контейнер на хосте с включенной свопингом. Мы можем дважды проверить, что внутри контейнера docker свопинг не разрешен, выполнив команду:

os.cgroup

Наконец, мы видим раздел cgroup, который относится к самому контейнеру. В данном случае контейнер использует 4 Гбайт памяти.

process.mem

Мы также имеем доступ к статистике виртуальной памяти:

Заметим, что "total_virtual_in_bytes" включает всю память, доступную процессу, в том числе и виртуальную память, доступную через mmap.

Понравилась статья? Поделиться с друзьями:
Добавить комментарий