Как избежать прозрачного предупреждения_очистки/дефрагментации от mongodb? - программирование
Подтвердить что ты не робот

Как избежать прозрачного предупреждения_очистки/дефрагментации от mongodb?

Я получаю следующее предупреждение от mongodb о THP

2015-03-06T21:01:15.526-0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-06T21:01:15.526-0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'

Но мне удалось отключить THP вручную

[email protected]:~$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
[email protected]:~$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]

Я сделал трюк, добавив transparent_hugepage=never в GRUB_CMDLINE_LINUX_DEFAULT в /etc/default/grub и добавив

if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

до /etc/rc.local

Как я могу избежать предупреждения?

4b9b3361

Ответ 1

Официальная документация MongoDB дает несколько решений для этой проблемы. Вы также можете попробовать это решение, которое сработало для меня:

Примечание. Попробуйте официальные директивы документации, если версия MongoDB больше 3.0

  • Откройте /etc/init.d/mongod файл.
    (если нет такого файла, вы можете проверить /etc/init.d/mongod, /etc/init/mongod.conf файлы - кредит: приведенные ниже комментарии)

  • Добавьте строки ниже сразу после chown $DAEMONUSER /var/run/mongodb.pid и до end script.

  • Перезагрузите mongod (service mongod restart).

Вот строки, которые нужно добавить в /etc/init.d/mongod:

if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
   echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
   echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi

Что это!

Ответ 3

Для Ubuntu 14.04 с использованием upstart:

Поскольку мы развертываем машины с Ansible, мне не нравятся модификации файлов rc или GRUB.

Я попытался использовать sysfsutils/sysfs.conf, но столкнулся с проблемами синхронизации при запуске служб на быстрых (или медленных машинах). Похоже, что иногда mongod был запущен до sysfsutils. Иногда это сработало, иногда это не так.

Поскольку mongod - это процесс выскочки, я обнаружил, что самым чистым решением было добавить файл /etc/init/mongod_vm_settings.conf со следующим содержимым:

# Ubuntu upstart file at /etc/init/mongod_vm_settings.conf
#
#   This file will set the correct kernel VM settings for MongoDB
#   This file is maintained in Ansible

start on (starting mongod)
script
  echo "never" > /sys/kernel/mm/transparent_hugepage/enabled
  echo "never" > /sys/kernel/mm/transparent_hugepage/defrag
end script

Это приведет к запуску script перед запуском mongod. Перезапустите mongod (sudo service mongod restart) и выполните.

Ответ 4

  • Открыть/etc/default/grub

    sudo vi/etc/default/grub

  • Обновление
    GRUB_CMDLINE_LINUX_DEFAULT = "в GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never"

  • Сохранить файл
    : wq (in vi)
  • Запустите update-grub

    sudo update-grub

  • Перезагрузите компьютер

Обновление. Если вы используете виртуального хостинг-провайдера, это будет работать. DigitalOcean НЕ поддерживает загрузку grub.

Ответ 5

Проверено, что дефрагментация проверена без учета включенного:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
$ cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never
$ service mongod start
... (in log) WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'
$ echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
$ cat /sys/kernel/mm/transparent_hugepage/defrag
always madvise [never]
$ service mongod stop
$ service mongod start
... (no warning in log)

Таким образом, исправление этой ошибки заключается в том, чтобы сначала просмотреть прозрачность_hugepage/enabled, а если это не так, не смотрите на нерелевантную настройку transparent_hugepage/defrag.

Источник.

Ответ 6

Ubuntu 16.04 с помощью systemd:

systemctl edit mongod

Вставьте следующее:

[Service]
PermissionsStartOnly=true
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/enabled"
ExecStartPre=/bin/sh -c "echo never > /sys/kernel/mm/transparent_hugepage/defrag"