Назад | Перейти на главную страницу

Невозможно изменить vm.max_map_count для elasticsearch

Предыстория

У меня есть elasticsearch и SugarCRM7, работающие на CentOS 6.5. Каждый день сталкиваюсь с одной и той же проблемой: ошибка java outOfMemory. Это происходит из-за небольшого значения vm.max_map_count, 65530, только когда рекомендуется 262144.

Проблема

Проблема в том, что vm.max_map_count кажется неизменным:

  1. Смена под root

    sudo sysctl -w vm.max_map_count=262144
    

    возвращается

    ошибка: отказано в разрешении на ключе vm.max_map_count

    Пока

    ps aux | grep java
    

    Возвращает только процесс grep

  2. Изменение при запуске elasticsearch

    sudo service elasticsearch start
    

    Тоже возвращает ошибку

    ошибка: отказано в разрешении на ключе vm.max_map_count

    Запуск elasticsearch: [OK]

  3. Ручные изменения через файл (грязный-грязный хак):

    sudo vi /proc/sys/vm/max_map_count
    

    Тоже не работает:

    "/ proc / sys / vm / max_map_count" [только для чтения] 1L, 6C

    - ВСТАВИТЬ - W10: Предупреждение: изменение файла, доступного только для чтения

    E45: установлена ​​опция readonly (добавить! Для отмены)

    "/ proc / sys / vm / max_map_count" E212: не удается открыть файл для записи

    Пока

    ls -la /proc/sys/vm/ | grep max_map_count
    

    Возврат

    -rw-r - r-- 1 корень root 0 10 апр 09:36 max_map_count

    (Но я думаю, что это нормально, если Linux говорит о каталоге / proc)

Итак, как я могу изменить значение этой переменной? Перезапускать elasticsearch каждую ночь - не лучшая идея ... Или, по крайней мере, может быть кто-то знает, почему возникает эта ошибка?

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

Я покажу 3 метода.

Некоторая предварительная информация:

1) По возможности лучше выполнять как root.

2) / proc в unix это не настоящая файловая система, это файловая система ядра в памяти, но она выглядит как обычная файловая система на диске. Вы можете назвать это «поддельной файловой системой» или «специальной файловой системой», вы не можете редактировать эти поддельные файлы с помощью vi или любого другого редактора, потому что они не файлы, они просто выглядят как файлы. Много лет назад я столкнулся с той же проблемой.

Но их значения просто изменить, просто потребуется другая «механика» для их редактирования.

Я объясню: во-первых, это должен быть root: (sudo действительно работает в некоторых дистрибутивах, но не работает в некоторых других дистрибутивах, как вы пробовали, этот первый метод универсален и работает на любых Linux, macOS или любых Unix-системах. . Надеюсь, у вас есть доступ к паролю root.

Продолжить при подсказке:

    $ su root

Введите пароль root.

Теперь вы root, давайте проверим текущее значение: / proc / sys / vm / max_map_count

    $ cat /proc/sys/vm/max_map_count  
    65536

Давайте изменим это:

    echo 262144 > /proc/sys/vm/max_map_count

Проверим:

    cat /proc/sys/vm/max_map_count
    262144

Это сделано! И это уже применяется и работает. При изменении значений любого псевдофайла в / proc настройки мгновенно становятся активными. Но они не сохраняются после перезагрузки. Вы можете поиграть со значениями и измерить изменения производительности на эластичный или любые другие показатели приложения или системы. Настройте свою систему, запишите значения на бумаге, сохраните лучшие значения. При любой ошибке перезагрузитесь, и все они вернутся к исходным значениям, и начните снова, пока все желаемые значения не станут оптимальными. В / proc есть множество настраиваемых параметров диска и памяти. И они имеют огромное значение и прирост производительности, если вы их хорошо настроите (и у вас будет на это время). Вы на правильном пути.

Когда будете удовлетворены, сделаем их постоянными:

Первый способ:

с помощью /etc/rc.local

    vi /etc/rc.local 

поместите все параметры в файл rc.local, например:

    echo 220000000 > /proc/sys/vm/dirty_background_bytes
    echo 320000000 > /proc/sys/vm/dirty_bytes
    echo 0 > /proc/sys/vm/dirty_background_ratio
    echo 0 > /proc/sys/vm/dirty_ratio
    echo 500 > /proc/sys/vm/dirty_writeback_centisecs
    echo 4500 > /proc/sys/vm/dirty_expire_centisecs
    echo 1 > /proc/sys/net/ipv4/tcp_rfc1337
    echo 10 > /proc/sys/vm/swappiness
    echo never > /sys/kernel/mm/transparent_hugepage/enabled
    echo never > /sys/kernel/mm/transparent_hugepage/defrag
    echo 120 > /proc/sys/net/ipv4/tcp_keepalive_time
    echo 0 > /proc/sys/vm/zone_reclaim_mode
    echo deadline > /sys/block/sda/queue/scheduler
    echo 8 > /sys/class/block/sda/queue/read_ahead_kb
    echo 1048575 > /proc/sys/vm/max_map_count

выйти из редактора vi, сохранив файл.

Эти параметры будут устанавливаться при каждой перезагрузке ПОСЛЕ запуска всех служб инициализации, незадолго до появления приглашения на вход.

(/etc/rc.local файл выполняется после всех запускаемых служб Linux, он может не работать, если elasticsearch запускается до него как служба, но этот метод может быть полезен при другой настройке, если вам понадобится в будущем, или вы можете использовать это, поместив их в свой elasticsearch init скрипт, потому что скрипт инициализации запускается от имени пользователя root, поэтому внутри скриптов инициализации используется тот же синтаксис, что и выше)

Вы также можете скопировать их сейчас и вставить для мгновенных изменений. Приведенные выше параметры действительны, настроены и работают на моем сервере apache cassandra. Если хотите, попробуйте их в качестве отправной точки для настройки своего.

Второй способ сделать их постоянными:

Параметры теперь будут установлены ПЕРЕД запуском любой службы в Linux.

редактировать /etc/sysctl.conf, поместите параметры внутрь

 vm.max_map_count=1048575
 vm.zone_reclaim_mode=0
 vm.dirty_background_bytes=220000000
 vm.dirty_background_ratio=0
 vm.dirty_bytes=320000000
 vm.dirty_ratio=0
 vm.swappiness=10

продолжай идти с другими, экономь /etc/sysctl.conf, перезагрузите сервер, чтобы применить изменения, или выполните: sysctl -p чтобы применить изменения без перезагрузки. Они будут постоянными после перезагрузки.

Два вышеуказанных метода являются наиболее распространенными. Есть еще один, и он может сработать для вас, используя судо, почти как и вы:

вместо того:

  sudo sysctl -w vm.max_map_count=262144

пытаться:

  echo 262144 | sudo tee /proc/sys/vm/max_map_count

Работает на убунту.

Проверить:

   user@naos:~$ cat /proc/sys/vm/max_map_count
   262144

Надеюсь, я каким-то образом помог, по крайней мере, предоставив 3 разных варианта решения проблемы, так как вашему вопросу почти год;)

С уважением, Рафаэль Прадо

Я думаю, что ваша «виртуальная машина» на самом деле является контейнером OpenVZ (что вы можете проверить, запустив virt-what).

В этом случае вы не можете изменить vm.max_map_count sysctl или многие другие. Значения фиксированы.

Это хорошо известная проблема с elasticsearch (Выпуск # 4978). Это не только Elasticsearch. Хорошо известно, что приложения Java плохо работают с различными поставщиками OpenVZ, в основном потому, что хосты часто плохо настроены, и вы ничего не можете с этим поделать. Один из комментаторов по этой проблеме повторил мою рекомендацию в точности:

joshuajonah прокомментировал 20 октября 2015 г.
Это безумие. Думаю, я собираюсь перейти на KVM VPS.

Вы можете следовать официальным инструкциям:

sysctl -w vm.max_map_count=262144

Чтобы сделать изменение постоянным, обновите параметр vm.max_map_count в /etc/sysctl.conf

Видеть https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html