Как мне изменить "/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 ответов
Вы можете
установить
sysfsutils
пакет:sudo apt install sysfsutils
и добавить строку с этим параметром в
/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 вы можете сделать
Установите
sysfsutils
пакет:sudo apt install sysfsutils
и добавьте строку в
/etc/sysfs.conf
:kernel/mm/transparent_hugepage/enabled = never
затем перезагрузите
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?