Отключение подкачки
Большинство операционных систем стараются использовать как можно больше памяти для кэшей файловой системы и активно подкачивают неиспользуемую системную память. Это может привести к тому, что части кучи 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 в выводе этого запроса:
resp = client.nodes.info(
filter_path="**.mlockall",
)
print(resp) response = client.nodes.info( filter_path: '**.mlockall' ) puts response
const response = await client.nodes.info({
filter_path: "**.mlockall",
});
console.log(response); 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
- Установите
LimitMEMLOCKна значениеinfinityв настройках 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/8.17/setup-configuration-memory.html