Как мне изменить "/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 never > /sys/kernel/mm/transparent_hugepage/defrag

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

7 ответов

Решение

Вы можете

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

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

    kernel/mm/transparent_hugepage/enabled = never
    

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

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

Вот решение, которое было протестировано для работы на 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.

Добавьте следующие строки ниже в /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

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

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

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

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

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

В Ubuntu 20.04 вы можете сделать

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

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

     kernel/mm/transparent_hugepage/enabled = never
    
  3. затем перезагрузите

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?

Другие вопросы по тегам