Я использую 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
Ты можешь
установить
sysfsutils
пакет:sudo apt install sysfsutils
и добавьте строку с этой настройкой в
/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
) и все готово.