Распространенный вопрос о настройке ElasticSearch (ES): «Сколько памяти следует выделить виртуальной машине Java ElasticSearch?».

  • Длинная история:

Вы не должны никогда выделять всю доступную память сервера для ES!

В большинстве случаев ES Xmx, максимальный размер кучи виртуальной машины Java (JVM), должен быть равен половине памяти сервера.

Почему половина? Потому что ES использует другую половину для кеширования нескольких файлов. Все эти файлы представляют собой структуры данных Lucene, которые хранятся на диске. Фактически он использует автоматическую тенденцию Linux к кэшированию файлов, которые часто необходимо прочитать или записать, в памяти. Эти файлы читаются, когда ES вычисляет запросы, и записываются, когда индексирует документы.

И теперь вы задаетесь вопросом: «Хорошо, объяснение довольно простое. Зачем мне для этого нужен сценарий? ».

Ответ кроется в той части моего первого совета, «в большинстве случаев».

Есть два случая, когда вы хотите выделить для ES еще меньше памяти.

Во-первых, сервер запускает другие процессы, которые потребляют значительный объем памяти. В этом случае только половина доступной памяти должна быть выделена ES (память сервера минус память других процессов).

Во-вторых, у сервера 64 ГБ памяти или больше, и вот тут самое сложное. Больше - не всегда лучше. Предоставление JVM более ~ 32 ГБ памяти контрпродуктивно из-за настройки Java. Эта настройка, называемая сжатыми указателями обычных объектов (ООП), позволяет JVM использовать 32-разрядные указатели памяти даже в 64-разрядных операционных системах, когда объем памяти меньше ~ 32 ГБ. Это означает более короткие указатели и лучшую общую производительность. Этот момент лучше осветить в Документации по ЭП.

Фактически, требуется около 40–50 ГБ выделенной кучи, прежде чем у вас будет такая же эффективная память, как у кучи, чуть менее 32 ГБ при использовании сжатых опций.

- Документация ES

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

java -Xmx32766m -XX:+PrintFlagsFinal 2> /dev/null | grep UseCompressedOops
bool UseCompressedOops := true <- it is enabled

К сожалению для нас точка переключения для активации этого флага не является постоянной. Это зависит от вашей установки.
Скрипт сокращает доступную память вдвое. Он проверяет, включен ли еще твик для этого Xmx. В противном случае простой рекурсивный цикл выводит максимальное значение памяти перед отключением настройки.

Это немного, но, надеюсь, сэкономит вам время. :)

Как всегда, есть место для улучшения, пожалуйста, фиксируйте проблемы в репозитории github.

Спасибо Дэвиду Бирдмору, Фрэнсису Шарпену, Николя Куиллери, Лоику Дюше, Микаэлю Жанрою, Бенуа Латтрингеру и Жереми Пикар.