Невозможно изменить vm.max_map_count для эластичного поиска
предыстория
У меня есть эластичный поиск и SugarCRM7, работающие на CentOS 6.5. Каждый день я сталкиваюсь с одной и той же проблемой: ошибка Java OutOfMemory. Это происходит из-за малого значения vm.max_map_count, 65530 только тогда, когда рекомендуется 262144.
проблема
Проблема в том, что vm.max_map_count кажется неизменным:
Смена под рутом
sudo sysctl -w vm.max_map_count=262144
возвращается
ошибка: отказано в разрешении на ключ 'vm.max_map_count'
В то время как
ps aux | grep java
Возвращает только процесс grep
Изменение при запуске упругого поиска
sudo service elasticsearch start
Возвращает ошибку тоже
ошибка: отказано в разрешении на ключ 'vm.max_map_count'
Начальный поиск: [ OK ]
Ручные изменения через файл (грязный-грязный хак):
sudo vi /proc/sys/vm/max_map_count
Тоже не работает:
"/proc / sys / vm / max_map_count" [только для чтения] 1L, 6C
- ВСТАВИТЬ - W10: Предупреждение: изменение файла только для чтения
E45: опция "только для чтения" установлена (добавить! Для переопределения)
"/proc / sys / vm / max_map_count" E212: не удается открыть файл для записи
В то время как
ls -la /proc/sys/vm/ | grep max_map_count
Возвращает
-r w-r -r-- 1 корневой корень 0 апр. 10 09:36 max_map_count
(Но я думаю, что это нормально для linux, говорящего о каталоге /proc)
Итак, как я могу изменить значение этой переменной? Повторно запускать asticsearch каждую ночь не очень хорошая идея... Или, по крайней мере, может кто-то знает, почему эта ошибка происходит?
3 ответа
Вы почти там, не имеет значения, виртуальная машина или физическая машина, эти параметры всегда можно изменить.
Я покажу 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, настройки становятся активными мгновенно. Но они не сохраняются после перезагрузки. Вы можете поиграть со значениями и измерить изменения в производительности в asticsearh или любом другом приложении или метриках системы. Настройте свою систему, запишите значения на бумаге, сохраните лучшие значения. При любой ошибке перезагрузите компьютер, и все они вернутся к исходным значениям и начнут снова, пока все желаемые значения не станут оптимальными. В /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, он может не работать, если asticsearch запускается до его использования в качестве службы, но этот метод может быть полезен при другой настройке, если вам это потребуется в будущем, или вы можете использовать его следующим образом поместив их в ваш скрипт initsearch init, потому что скрипт init запускается как root, так что для использования внутри скриптов init используется тот же синтаксис, что и выше)
Вы также можете скопировать их сейчас и вставить их для мгновенных изменений. Указанные выше параметры действительны, настроены и работают на моем сервере 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, почти как вы делали:
вместо:
sudo sysctl -w vm.max_map_count=262144
пытаться:
echo 262144 | sudo tee /proc/sys/vm/max_map_count
Это работает на Ubuntu.
Убедитесь, что:
user@naos:~$ cat /proc/sys/vm/max_map_count
262144
Надеюсь, я каким-то образом помог, по крайней мере, предоставив 3 различных варианта решения проблемы, так как ваш вопрос уже почти год;)
С уважением, Рафаэль Прадо
Я думаю, что ваша "виртуальная машина" на самом деле является контейнером OpenVZ (что вы можете проверить это, запустив virt-what
).
В этом случае вы не можете изменить vm.max_map_count
sysctl или многие другие. Значения являются фиксированными.
Это хорошо известная проблема с asticsearch ( выпуск № 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