Как мне изменить «/ sys / kernel / mm / transparent_hugepage / enabled»

50

Я использую mongodb 3.0 и нахожу предупреждение:

MongoDB shell version: 3.0.0
connecting to: test
Server has startup warnings: 
2015-03-13T16:28:29.405+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.406+0800 I CONTROL  [initandlisten] 
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten] **        We suggest setting it to 'never'
2015-03-13T16:28:29.407+0800 I CONTROL  [initandlisten]

~# cat /sys/kernel/mm/transparent_hugepage/enabled
[always] madvise never

~# cat /sys/kernel/mm/transparent_hugepage/defrag
[always] madvise never

Я пытаюсь использовать эхо, но оно не является постоянным, после перезагрузки будет сброшено.

echo never > /sys/kernel/mm/transparent_hugepage/defrag

Как я могу изменить /sys/kernel/mm/transparent_hugepage/enabledнавсегда?

Фэн Ю
источник
1
Ниже могут быть хорошие ответы, но IMO, вы должны взглянуть на официальную документацию MongoDB: docs.mongodb.org/master/tutorial/transparent-huge-pages
hgoebl

Ответы:

70

Ты можешь

  1. установить sysfsutilsпакет:

    sudo apt install sysfsutils
    
  2. и добавьте строку с этим параметром в /etc/sysfs.conf:

    kernel/mm/transparent_hugepage/enabled = never
    

Это самое чистое решение, поскольку оно хранит всю конфигурацию sysfs в одном месте, а не полагается на пользовательские сценарии запуска. Другие ответы, со сценариями и условными выражениями, подходят, если вы не знаете, по какому пути ядро ​​будет выставлять эту настройку, т. Е. Если у вас даже нет приблизительного представления о версии ядра, работающей на зараженной машине.

Дэвид Фёрстер
источник
4
Это ничего не сделало для меня в Ubuntu 14.04 на экземпляре AWS EC2. Я не очень много знаю о sysfs.conf, но, похоже, это конфигурация, поддерживаемая Ubuntu, но файл ранее не существовал в нашей системе, и добавление его и перезагрузка не изменили предупреждения вывода mongo вообще. Также воспользовался советом clayzermk1 ниже, предупреждение «дефрагментация» все еще появлялось. Официальный скрипт инициализации Mongo Docs удалил оба предупреждения.
Neek
Какой выход cat /sys/kernel/mm/transparent_hugepage/enabled? Существует ли оно вообще? sysfs.confобычно оценивается при загрузке с /etc/init.d/sysutils. Это включено? Что происходит, когда вы вызываете /etc/init.d/sysutils start?
Дэвид Фёрстер
3
У меня также нет sysfs.confфайла и /etc/init.d/sysutils. Ubuntu 16.04
HEX
1
@unhammer: Нет, у обоих разные сферы применения. sysctlдля настроек, которые вы также можете достичь с помощью параметров ядра; sysfs.confдля записей в /sys.
Дэвид Фёрстер
1
@navossoc: Не могли бы вы открыть новый вопрос, если у вас есть новый или дополнительный вопрос? Раздел комментариев не подходит или предназначен для новых вопросов или расширенного обсуждения. Вы можете отправить мне комментарий с уведомлением, чтобы привлечь мое внимание к нему. Благодарю.
Дэвид Фёрстер
25

В документации MongoDB есть несколько предложений. http://docs.mongodb.org/manual/reference/transparent-huge-pages/

«Предпочтительный» способ заключается в редактировании /etc/default/grubи присоединять transparent_hugepage=neverк а GRUB_CMDLINE_LINUX_DEFAULTзатем запустить , update-grubчтобы восстановить конфигурацию GRUB.

Следующий двухслойный будет делать именно это. Обязательно проверьте вывод!

sed -r 's/GRUB_CMDLINE_LINUX_DEFAULT="[a-zA-Z0-9_= ]*/& transparent_hugepage=never/' /etc/default/grub | sudo tee /etc/default/grub
sudo update-grub

Обратите внимание, что update-grubэто обертка для grub-mkconfig. grub-mkconfigбудет забивать записи /etc/default/grubс теми из /etc/default/grub.d/*. Если случайно вы работаете в AWS, вам нужно будет отредактировать /etc/default/grub.d/50-cloudimg-settings.cfg.

«Альтернативный» метод заключается в редактировании /etc/rc.localи добавлении следующего exit 0:

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

Лично я закончил тем, что сделал оба «предпочтительных» и «альтернативных» метода, так как они не являются взаимоисключающими, и это устраняет предупреждение о дефрагментации.

* Работал для меня на Ubuntu 14.04, MongoDB 3.0.2 и AWS.

clayzermk1
источник
Я попробовал это на моем сервере приложений MongoDB одним нажатием на DigitalOcean, и это не сработало. По-прежнему получаю то же предупреждение.
страшно
Спасибо за часть про EC2 и50-cloudimg-settings.cfg
Martin
16

Вот решение, которое было протестировано для работы на Ubuntu 16.04 на AWS EC2. Ubuntu 16.04 использует systemd init system, и этот файл конфигурации показывает, что эти параметры должны быть изменены до загрузки MongoDB.

Создайте файл с именем /etc/systemd/system/mongodb-hugepage-fix.serviceи добавьте следующее содержимое:

[Unit]
Description="Disable Transparent Hugepage before MongoDB boots"
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
Before=mongodb.service      

[Service]
Type=oneshot
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
ExecStart=/bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

[Install]
#WARN: check service name on your system
# If you are using MongoDB Cloud, service name is "mongodb-mms-automation-agent.service"
RequiredBy=mongodb.service

Чтобы загрузить файл в systemd:

systemctl daemon-reload

Чтобы активировать файл как загрузочную зависимость MongoDB

systemctl enable mongodb-hugepage-fix

Если вы хотите активировать изменения немедленно (до следующей загрузки)

systemctl start mongodb-hugepage-fix
systemctl restart mongod

Это решение не подходит для Ubuntu 14.04, в которой вместо systemd используется решение инициализации Upstart.

Марк Стосберг
источник
1
Исправление systemd идеально подходит для современных установок MongoDB, спасибо.
4:43
7

Добавьте следующие строки ниже в /etc/rc.local.

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

Это запустится при перезагрузке сервера.

PKumar
источник
1
Есть ли файл конфигурации по этому поводу? rc.localне очень хорошая идея, потому что rc.local будет выполняться в конце загрузки системы. Так что сервис mongodb по-прежнему будет использовать настройки по умолчанию.
Фэн Ю
2
отредактируйте файл / etc / default / grub и внесите изменения в строку "GRUB_CMDLINE_LINUX_DEFAULT =" transparent_hugepage = never "и выполните команду update-grub, затем перезапустите сервер
PKumar
2
Спасибо, это работает. Но есть ли подобный способ изменить /sys/kernel/mm/transparent_hugepage/defrag? Когда я перезагружаюсь, оболочка mongo также говорит мне: «** ПРЕДУПРЕЖДЕНИЕ: / sys / kernel / mm / transparent_hugepage / defrag - это всегда».
Фэн Ю
@FengYu попробуйте эту страницу docs.mongodb.org/manual/tutorial/transparent-huge-pages
PKumar
0

GRUB изменится после обновления, а rc.local будет работать только после запуска mongo, поэтому, возможно, нам следует добавить перезапуск службы mongo в конце rc.local, например так

если проверка -f / sys / kernel / mm / transparent_hugepage / включена; тогда
  echo never> / sys / kernel / mm / transparent_hugepage / enabled
фи

if test -f / sys / kernel / mm / transparent_hugepage / defrag; тогда
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
фи

подождите 1 && servie mongod restart

или, может быть, кто-то успешно добавил строки выше в сценарий инициализации в Ubuntu 14.04?

Эдик Мкоян
источник
0

Поскольку мы разворачиваем машины с помощью Ansible, я не люблю модифицировать rc-файлы.

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

Поскольку mongod - процесс выскочки, я обнаружил, что самым чистым решением было добавить файл /etc/mongo_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

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

Whyhankee
источник
Обратите внимание, что в этом решении используется система инициализации Upstart, а Ubuntu 16.04 основана на системе инициализации systemd.
Марк Стосберг
0

Прочитав немного в журнале предупреждений, я добавил эти две строки в /etc/sysfs.confy voilá

kernel/mm/transparent_hugepage/enabled = never
kernel/mm/transparent_hugepage/defrag = never

Перезагрузите машину после применения этих изменений.

Ulv3r
источник
Это все еще требует sysfsutilsпакета (см. Мой ответ).
Дэвид Фёрстер,
конечно, это необходимо
Ulv3r