Отключение подкачки
Большинство операционных систем стараются максимально использовать память для кэширования файловой системы и активно подкачивают неиспользуемую системную память. Это может привести к тому, что части кучи JVM или даже выполняемые страницы будут подкачиваться на диск.
Подкачка очень негативно сказывается на производительности, стабильности узла и должна быть полностью исключена. Она может привести к тому, что сборка мусора будет длиться минуты, а не миллисекунды, а узлы будут медленно реагировать или даже разъединяться из кластера. В устойчивой распределенной системе эффективнее позволить операционной системе завершить работу узла.
Существует три способа отключения подкачки. Предпочтительный вариант — полное отключение подкачки. Если это невозможно, то выбор между уменьшением swappiness и блокировкой памяти зависит от вашей среды.
Отключение всех файлов подкачки
Обычно Elasticsearch является единственной службой, работающей на компьютере, и её использование памяти контролируется опциями JVM. В этом случае нет необходимости в включенном механизме подкачки.
В Linux вы можете временно отключить подкачку, выполнив:
sudo swapoff -a
Это не требует перезапуска Elasticsearch.
Чтобы отключить подкачку постоянно, необходимо отредактировать файл /etc/fstab и закомментировать все строки, содержащие слово swap.
В Windows аналогичный результат можно получить, отключив страницу файла полностью через System Properties → Advanced → Performance → Advanced → Virtual memory.
Настройка swappiness
Еще один вариант, доступный в Linux, заключается в установке значения sysctl vm.swappiness на 1. Это уменьшает склонность ядра к подкачке и обычно не должно приводить к подкачке в нормальных условиях, позволяя при этом системе подкачивать память в экстренных случаях.
Включение bootstrap.memory_lock
Еще один вариант — использовать mlockall в системах Linux/Unix или VirtualLock в Windows, чтобы заблокировать адресное пространство процесса в ОЗУ, предотвращая подкачку кучи Elasticsearch.
Некоторые платформы всё ещё подкачивают внекучную память при использовании блокировки памяти. Чтобы предотвратить подкачку внекучной памяти, отключите все файлы подкачки вместо этого.
Чтобы включить блокировку памяти, установите значение bootstrap.memory_lock на true в файле elasticsearch.yml:
bootstrap.memory_lock: true
mlockall может привести к завершению работы JVM или сеанса оболочки, если он попытается выделить больше памяти, чем доступно!
После запуска Elasticsearch вы можете проверить, было ли это значение успешно применено, проверив значение mlockall в выводе этого запроса:
GET _nodes?filter_path=**.mlockall
Если вы видите, что значение mlockall равно false, это означает, что запрос mlockall не удался. Вы также увидите строку с дополнительной информацией в журналах со словами Unable to lock JVM Memory.
Наиболее вероятная причина в системах Linux/Unix заключается в том, что у пользователя, запускающего Elasticsearch, нет прав на блокировку памяти. Это можно предоставить следующим образом:
-
.zipи.tar.gz -
Установите
ulimit -l unlimitedот имени root перед запуском Elasticsearch. В качестве альтернативы, установите значениеmemlockнаunlimitedв файле/etc/security/limits.conf:# allow user 'elasticsearch' mlockall elasticsearch soft memlock unlimited elasticsearch hard memlock unlimited
- RPM и Debian
- Установите значение
MAX_LOCKED_MEMORYнаunlimitedв файле конфигурации системы (файл конфигурации системы) (или см. ниже для систем, использующихsystemd). - Системы, использующие
systemd - Установите значение
LimitMEMLOCKнаinfinityв конфигурации systemd (конфигурация systemd).
Еще одна возможная причина неудачи mlockall заключается в том, что временная директория JNA (обычно поддиректория /tmp) смонтирована с опцией noexec. Это можно исправить, указав новую временную директорию для JNA с помощью переменной среды ES_JAVA_OPTS:
export ES_JAVA_OPTS="$ES_JAVA_OPTS -Djna.tmpdir=<path>" ./bin/elasticsearch
или задав этот флаг JVM в файле конфигурации jvm.options.
© 2023-2025 Elasticsearch
As of September 2024, Elasticsearch is available under a choice of three licenses: the Server Side Public License (SSPL), the Elastic License, or the AGPLv3 (OSI approved).
Elasticsearch and the Elasticsearch logo are trademarks of Elasticsearch B.V., registered in the U.S. and in other countries.
https://www.elastic.co/guide/en/elasticsearch/reference/7.17/setup-configuration-memory.html