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

Предыстория

У меня есть elasticsearch и 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. Изменение на запуске elasticsearch

    sudo service elasticsearch start
    

    Ошибка возвратов, также

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

    Запуск elasticsearch: [хорошо]

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

    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 каждую ночь не является хорошей идеей... Или по крайней мере кто-то может быть, знает, почему эта ошибка происходит?

13
задан 10 April 2015 в 10:52
3 ответа

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

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

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

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

4
ответ дан 2 December 2019 в 21:25

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

Я покажу 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 различных варианта решения проблемы, поскольку вашему вопросу уже почти год;)

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

12
ответ дан 2 December 2019 в 21:25

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

0
ответ дан 2 December 2019 в 21:25

Теги

Похожие вопросы