У меня есть elasticsearch и 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
Изменение на запуске elasticsearch
sudo service elasticsearch start
Ошибка возвратов, также
ошибка: разрешение, отклоненное на ключе 'vm.max_map_count'
Запуск elasticsearch: [хорошо]
Ручные изменения через файл (грязно-грязный взлом):
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
Возвраты
- rw-r - r - 1 корень базируются 0 10 апреля 9:36 max_map_count
(Но я предполагаю, что это может быть нормально для Linux, говорящего о/proc каталоге),
Таким образом, как я могу изменить значение этой переменной? Перезапуск elasticsearch каждую ночь не является хорошей идеей... Или по крайней мере кто-то может быть, знает, почему эта ошибка происходит?
] Я думаю, что ваша «виртуальная машина» на самом деле является контейнером OpenVZ (что вы можете проверить, запустив virt-what
).
В этом случае вы не можете изменить vm.max_map_count
sysctl или многие другие. Значения фиксированы.
Это хорошо известная проблема с elasticsearch (, проблема № 4978 ). Это не только Elasticsearch. Хорошо известно, что приложения Java плохо работают с различными поставщиками OpenVZ, в основном потому, что хосты часто плохо настроены, и вы ничего не можете с этим поделать. Один из комментаторов по этой проблеме в точности повторил мою рекомендацию:
joshuajonah прокомментировал 20 октября 2015 г.
Это безумие. Думаю, я собираюсь перейти на KVM VPS.
вы почти у цели. Неважно, виртуальная машина или физическая машина, эти настройки всегда можно изменить.
Я покажу 3 метода.
Некоторые предварительные -information:
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 настройки мгновенно становятся активными. Но они не сохраняются после перезагрузки. Вы можете поиграть со значениями и измерить изменения производительности в elasticsearh или в любых других показателях приложения или системы. Настройте свою систему, запишите значения на бумаге, сохраните лучшие значения. При любой ошибке перезагрузитесь, и все они вернутся к исходным значениям, и начните снова, пока все желаемые значения не станут оптимальными. В / 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, потому что сценарий инициализации запускается от имени пользователя 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 , почти как вы:
вместо:
sudo sysctl -w vm.max_map_count=262144
try:
echo 262144 | sudo tee /proc/sys/vm/max_map_count
Он работает в ubuntu.
Подтвердите:
user@naos:~$ cat /proc/sys/vm/max_map_count
262144
Надеюсь, я каким-то образом помог, по крайней мере, предоставив 3 различных варианта решения проблемы, поскольку вашему вопросу уже почти год;)
С уважением, Рафаэль Прадо
Ungalandela imiyalelo esemthethweni:
sysctl -w vm.max_map_count=262144
Ukwenza utshintsho olusisigxina vm.max_map_count setting kwi /etc/sysctl.conf
Bona https://www.elastic.co/guide/en/elasticsearch/reference/current/vm-max-map-count.html