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

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

Я использую 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, но это не навсегда, после перезагрузки все сбрасывается.

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

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

решение1

Ты можешь

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

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

    kernel/mm/transparent_hugepage/enabled = never
    

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

решение2

В документации 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.

решение3

Вот решение, которое было протестировано на работоспособность в Ubuntu 16.04 на AWS EC2. Ubuntu 16.04 использует систему инициализации systemd, и этот файл конфигурации указывает, что эти настройки следует изменить до загрузки 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, который использует решение инициализации Upstart вместо systemd.

решение4

Поскольку мы развертываем машины с помощью 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) и все готово.

Связанный контент