Як змінити "/ sys / ядро ​​/ mm / transparent_hugepage / enable"


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, але файл раніше не існував у нашій системі, і додавання його та перезавантаження зовсім не змінило попередження про виведення монго. Також спробували поради ради clayzermk1 нижче, попередження 'defrag' все ще з’являється. Офіційний сценарій mongo docs init видалив обидва попередження.
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.


Я спробував це на моєму сервері додатків MongoDB одним натисканням на DigitalOcean, і це не спрацювало. Ще отримує те саме повідомлення попередження.
scaryguy

Дякую за частину про EC2 та50-cloudimg-settings.cfg
Мартін Конечний

16

Ось рішення, яке було протестовано для роботи на Ubuntu 16.04 на AWS EC2. Ubuntu 16.04 використовує системну систему init, і цей конфігураційний файл виражає, що ці параметри слід змінити перед завантаженням 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 init замість systemd.


1
Системний виправлення ідеально підходить для сучасних встановлень MongoDB, дякую.
чотири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

Це запуститься при перезавантаженні сервера.


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, тому, можливо, ми повинні додати службу перезавантаження монго в кінці rc.local, як це

якщо тест -f / sys / ядро ​​/ mm / transparent_hugepage / увімкнено; тоді
  echo never> / sys / ядро ​​/ mm / transparent_hugepage / увімкнено
фі

якщо тест -f / sys / kernel / mm / transparent_hugepage / defrag; тоді
   echo never> / sys / kernel / mm / transparent_hugepage / defrag
фі

зачекайте перезавантаження 1 && servie mongod

чи, можливо, хтось успішно додав рядки вище в скрипт init в Ubuntu 14.04?


0

Оскільки ми розгортаємо машини з Ansible, мені не подобається змінювати файли rc.

Я спробував використати sysfsutils/ sysfs.confале зіткнувся з проблемами в часі при запуску послуг на швидких (або повільних машинах). Виглядало так, що іноді монгод заводили перед сисфсутілами. Іноді це працювало, іноді - ні.

Оскільки 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) і готово.


Зауважте, що це рішення використовує систему "instart" init, тоді як Ubuntu 16.04 базується на системній системі init.
Марк Стосберг

0

Прочитавши трохи в журналі попереджень, я додав ці два рядки в /etc/sysfs.confy voilá

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

Перезавантажте машину після застосування цих змін.


Для цього ще потрібен sysfsutilsпакет (див. Мою відповідь).
Девід Фоерстер

напевно це потрібно
Ulv3r
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.