Неможливо змінити vm.max_map_count для еластичного пошуку


14

Доісторія

У мене еластичний пошук і SugarCRM7 працює на CentOS 6.5. Щодня я стикаюся з однією і тією ж проблемою: помилка java outOfMemory. Це відбувається через мале значення vm.max_map_count, 65530 лише тоді, коли рекомендується 262144.

Проблема

Проблема полягає в тому, що vm.max_map_count видається незмінним:

  1. Зміна під корінь

    sudo sysctl -w vm.max_map_count=262144
    

    повертає

    помилка: у ключі "vm.max_map_count" відхилено дозвіл

    Поки

    ps aux | grep java
    

    Повертає лише процес grep

  2. Зміна при запуску еластичного пошуку

    sudo service elasticsearch start
    

    Повертається також помилка

    помилка: у ключі "vm.max_map_count" відхилено дозвіл

    Початок еластичного пошуку: [OK]

  3. Зміни вручну через файл (брудно-брудний злом):

    sudo vi /proc/sys/vm/max_map_count
    

    Не працює також:

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

    - INSERT - W10: Попередження: Зміна файлу, який читається тільки

    E45: Встановлено опцію 'readonly' (додати!

    "/ proc / sys / vm / max_map_count" E212: Не вдається відкрити файл для запису

    Поки

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

    Повертається

    -rw-r - r-- 1 корінь кореня 0 10 квітня 09:36 max_map_count

    (Але я думаю, це може бути нормально для Linux, що розмовляють про / proc каталог)

Тож як я можу змінити значення цієї змінної? Перезапуск еластичного пошуку щовечора - це не дуже гарна ідея ... Або, принаймні, може хтось знає, чому трапляється ця помилка?


3
Що це за машина? Віртуальний? Якщо так, яка віртуалізація використовується? Зауважте, що деякі віртуалізації, наприклад, контейнери OpenVZ, накладають обмеження на ваш контейнер, і не дозволяють "налаштувати" ядро ​​та інші речі низького рівня.
Мирослав Кошкар

@MiroslavKoskar Я не знаю, на жаль. Як я можу це дізнатися?
Валентина

@MiroslavKoskar Забув згадати - машина віртуальна, звичайно
Валентина

1
Як це дізнатися? Ну де він розміщується? Це має бути досить очевидним, оскільки це, як правило, частина вашого договору з вашим хостинг-провайдером. Якщо ви все ще сумніваєтесь, зверніться до служби підтримки вашого оператора хостингу, IMHO - це найкраще місце для початку (оскільки зазвичай це частина угоди і те, що ви, ймовірно, платите).
Мирослав Кошкар

@MiroslavKoskar добре, провайдер відповів, не згадуючи технології, що вони не можуть мені допомогти у цій проблемі (це досить розумно). Дякуємо за вашу допомогу
Валентина

Відповіді:


13

Ви майже там, Неважливо, це віртуальна машина чи фізична машина, ці налаштування завжди змінні.

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

Деякі попередні відомості:

1) Краще виконати як root, якщо це можливо.

2) / proc на unix не є реальною файловою системою, це файлова система ядра в пам'яті, але схоже на звичайну файлову систему диска. Ви можете назвати це "підробленою файловою системою" або "спеціальною файловою системою", ви не можете редагувати ці підроблені файли з vi або будь-яким іншим редактором, оскільки це не файли, вони просто схожі на файли. Я з тією ж проблемою застряг років тому.

Але змінити їх значення просто, просто для редагування потрібен інший тип "механіки".

Я поясню: По-перше, потрібно мати root: (sudo працює в деяких дистрибутивах, але не в інших дистрибутивах, як ви намагалися; цей перший метод є універсальним і працює на будь-якому Linux, macOS або будь-якій Unix-основі) Сподіваюся, у вас є доступ до пароля root.

Продовжуйте оперативно:

    $ su 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

вийти з редактора збереження файлу.

Ці параметри будуть встановлені при кожному перезавантаженні, ПІСЛЯ всіх запущених служб init, безпосередньо перед тим, як з'явиться запит на вхід.

( /etc/rc.local файл виконується після всіх запуску лінукс-сервісів, він може не працювати, якщо запускається розширення пошуку перед ним як послуга, але цей метод може бути корисним для іншої установки, якщо вам потрібно в майбутньому, або ви можете використовувати подібний помістивши їх всередині свого сценарію elastsearch 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 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 різні варіанти впоратися з проблемою, оскільки це питання вже майже рік;)

З повагою, Рафаель Прадо


3
Вони вже це зробили , і це не вдалося.
Майкл Хемптон

1
Привіт Майкл, так, ти маєш рацію. Спочатку я зрозумів, що проблема пов'язана з операційною системою CentOS та дозволами користувачів Unix, тому я дотримувався цього рядка у своїй відповіді. Але новіша інформація ставить фокус проблеми на "хост" OpenVZ, що обмежує деякі налаштування. Мої знання є у Centos та VmWare, але не у OpenVZ.
user62739

4

Я думаю, що ваша "віртуальна машина" насправді є контейнером OpenVZ (ви можете перевірити це, запустивши virt-what).

У цьому випадку ви не можете змінити vm.max_map_countsysctl або багато інших. Значення фіксуються.

Це добре відомий випуск з еластичним пошуком ( випуск № 4978 ). Це не лише Elasticsearch. Добре відомо, що додатки Java працюють погано на різних постачальниках OpenVZ, головним чином тому, що хости часто погано налаштовані, і ви нічого з цим не можете зробити. Один з коментарів із цього питання повторив те, що саме було б моєю рекомендацією:

joshuajonah прокоментував 20 жовтня 2015
Це божевільно. Я здогадуюсь перейти на KVM VPS.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.