Як змінити "/ 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.