відключити прозорі величезні сторінки


63

Ми встановлюємо SAP HANA в RAID- машині. Як частина кроку встановлення, зазначається, що,

 To disable the usage of transparent hugepages set the kernel settings 
 at runtime with echo never > /sys/kernel/mm/transparent_hugepage/enabled 

Отже, замість часу виконання, якщо я хотів зробити це постійною зміною, я повинен додати вищезазначений рядок у /proc/vmstatфайл?


2
Зауважте, що якщо ви використовуєте деякі з рішень, згаданих тут, у системі, яка також працює "налаштована", налаштування може змінити ці рішення. Дивіться тут для отримання додаткової інформації: bugzilla.redhat.com/show_bug.cgi?id=1189868
Dejay Clayton

Відповіді:


80

Щоб зробити такі параметри, як цей постійний, ви зазвичай додаєте їх у файл /etc/sysctl.conf. Ви можете побачити повний список доступних опцій за допомогою цієї команди:

$ sysctl -a

Приклад

$ sudo sysctl -a | head -5
kernel.sched_child_runs_first = 0
kernel.sched_min_granularity_ns = 6000000
kernel.sched_latency_ns = 18000000
kernel.sched_wakeup_granularity_ns = 3000000
kernel.sched_shares_ratelimit = 750000

Ви можете шукати hugepageу висновку так:

$ sudo sysctl -a | grep hugepage
vm.nr_hugepages = 0
vm.nr_hugepages_mempolicy = 0
vm.hugepages_treat_as_movable = 0
vm.nr_overcommit_hugepages = 0

Його там немає?

Однак переглядаючи вихідний, я не бачив transparent_hugepage. Погугливши трохи більше, я натрапив на цю сторінку Oracle, яка обговорює цю саму тему. Сторінка має назву: Налаштування HugePages для Oracle в Linux (x86-64) .

Зокрема, на цій сторінці вони згадують, як відключити функцію величезної сторінки .

витяг

Кращим способом відключення прозорих HugePages є додавання "transparent_hugepage = never" до рядка завантаження ядра у файлі "/etc/grub.conf".

   title Oracle Linux Server (2.6.39-400.24.1.el6uek.x86_64)
            root (hd0,0)
            kernel /vmlinuz-2.6.39-400.24.1.el6uek.x86_64 ro root=/dev/mapper/vg_ol6112-lv_root rd_NO_LUKS  KEYBOARDTYPE=pc KEYTABLE=uk
    LANG=en_US.UTF-8 rd_NO_MD SYSFONT=latarcyrheb-sun16  rd_NO_DM rd_LVM_LV=vg_ol6112/lv_swap rd_LVM_LV=vg_ol6112/lv_root rhgb quiet numa=off
    transparent_hugepage=never
            initrd /initramfs-2.6.39-400.24.1.el6uek.x86_64.img

Щоб це набуло чинності, сервер повинен бути перезавантажений.

Крім того, ви можете додати команду до свого /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

Думаю, я б підходив до другого варіанту, оскільки перший буде загрожувати невдалим під час оновлення з одного ядра на інше.

Ви можете підтвердити, що він працював із наступною командою після перезавантаження:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]

7
Ви можете зробити перший варіант пережити оновлення ядра, додавши transparent_hugepage = ніколи до опції GRUB_CMDLINE_LINUX_DEFAULT в / etc / default / grub у більшості дистрибутивів.
Rwky

2
Якщо вихід cat /sys/kernel/mm/transparent_hugepage/enabledє [always] madvise never, то стан є alwaysабо він увімкнено (зверніть увагу на []дужки навколо always)
ub3rst4r

4
Не плутайте величезні сторінки та прозорі величезні сторінки. Останнє може спричинити багато проблем, головним чином, високе використання процесора, постійно намагаючись дефрагментацію пам'яті та перетворення звичайних сторінок 4 КБ у величезні 2 Мб сторінки.
Marki555

2
@Rwky - під час налаштування відповідно до вашої пропозиції - я підкреслюю, що наступним дією після збереження файлу є виконання, sudo update-grubщоб отримати нові налаштування "написані каменем". +1 для вказівки на рядок файлу grub.
Фарон

2
Оновлення для тих, хто знаходиться на EC2, cloudimg додає файл /etc/default/grub.d/50-cloudimg-settings.cfg, який переосмислює налаштування в / etc / default / grub, додаючи файл /etc/default/grub.d/ 99-transparent-огромpage.cfg із вмістом GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = ніколи" це не вирішить.
Rwky

13

Я просто хотів додати до цього питання, оскільки я намагався відключити прозорі величезні сторінки на CentOS v6, щоб увімкнути TokuDB для MariaDB. Я додав сценарій, згаданий @slm, /etc/rc.localі відключив прозорі величезні сторінки. Однак через те, як сценарії запуску працюють в Linux, /etc/rc.localвиконується після запуску всіх служб. Тому прозорі величезні сторінки були відключені після того, як MariaDB вже був запущений і двигун TokuDB не ініціалізувався. Єдиний інший спосіб відключити прозорі величезні сторінки - це додавання transparent_hugepage=neverдо параметра ядра.

Я помітив коментар @ Rwky You can make the first option survive kernel updates by adding transparent_hugepage=never to the GRUB_CMDLINE_LINUX_DEFAULT option in /etc/default/grub on most distributions.і з’ясував, що CentOS не підтримує /etc/default/grubфайл і переживає, що transparent_hugepage=neverзникне з параметрів ядра при його оновленні. Але не хвилюйтеся, CentOS налаштований зберігати будь-які зміни, внесені до параметрів ядра в grub, тому при його оновленні вони зберігаються.

Щоб додати, належним чином змінити параметри ядра для grub є grubby. Я створив цей простий скрипт, щоб додати transparent_hugepage=neverдо кожного ядра за допомогою grubby:

#!/bin/sh

if [[ $EUID -ne 0 ]]; then
   echo "This script must be run as root" 1>&2
   exit 1
fi

for KERNEL in /boot/vmlinuz-*; do
    grubby --update-kernel="$KERNEL" --args='transparent_hugepage=never'
done

Для такого варіанта, як я, я б все-таки спробував додати його до /, etc/sysctl.confоскільки це буде послідовно застосовуватися до будь-якого ядра, яке коли-небудь може бути встановлене на коробці.
slm

Я просто хотів додати, що якщо ви зміните файл <code> / etc / default / grub </code>, вам потрібно запустити grub-mkconfigяк "root", щоб створити фактичний файл конфігурації для grub.
seattlegaucho

3
Для екземпляра ubuntu EC2 я повинен змінити /etc/default/grub.d/50-cloudimg-settings.cfgфайл замість того, /etc/default/grubщоб він працював.
zhengyue

Я використовую CentOS 6.6. Я змінив, /etc/rc.localале це не працює для мене. Чи можете ви поясніть мені кореневий випадок.
Сандіп Сінгх

@ s.singh Як я вже заявив, /etc/rc.local is executed after all the services are startedйого потрібно відключити на рівні ядра
ub3rst4r

6

Ось реалізація за допомогою лялечки:

exec { "disable_transparent_hugepage_enabled":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/enabled",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/enabled 2>/dev/null",
}

exec { "disable_transparent_hugepage_defrag":
  command => "/bin/echo never > /sys/kernel/mm/transparent_hugepage/defrag",
  unless  => "/bin/grep -c '\[never\]' /sys/kernel/mm/transparent_hugepage/defrag 2>/dev/null",
}

6

Все вищезазначене не працювало для мене на EC2 Ubuntu 16.04, але це зробило:

sudo apt install hugepages
sudo hugeadm --thp-never

4

Оскільки рядок ядро transparent_hugepage=neverвідключає тільки половину того , що мені потрібно (як, для дратівної MongoDB несправного / журналів), що я не наполягати через systemdсценарій запуску , але тепер є: echo never | sudo tee /sys/kernel/mm/transparent_hugepage/enabled. Це працює або в скрипті завантаження systemctl (при правильному налаштуванні одного в /etc/systemd/system), або прямо з кліпу, як є.


Чи можете ви, будь ласка, розширити свої вказівки, щоб також включити "правильно налаштований сценарій" та кроки, як все налаштувати? Офіційні інструкції MongoDB docs.mongodb.org/manual/tutorial/transparent-huge-pages показують старий спосіб, хоча тепер, коли systemd є більш поширеним, непогано було б це мати системним способом.
ssasa

3

У випадку Redis він також надсилає попередження, яке пропонує вимкнути THP. Але, як зазначається у звіті про помилку , у багатьох дистрибутивах /etc/rc.localвиконується після служб, і це не впливає на них, поки вони не перезапустяться. Також зауважте, що у віртуалізованих середовищах (наприклад, Digitalocean) ви не можете керувати налаштуваннями GRUB.

Рішенням у такому випадку є використання виділеного сценарію init для відключення прозорих величезних сторінок, як пропонує ця сторінка , за допомогою налаштувань X-Start-Before. Наприклад, сценарій init Debian для Redis:

#!/bin/bash
### BEGIN INIT INFO
# Provides:          disable-thp
# Required-Start:    $local_fs
# Required-Stop:
# X-Start-Before:    redis-server
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Disable THP
# Description:       disables Transparent Huge Pages (THP) on boot
### END INIT INFO

case $1 in
start)
  if [ -d /sys/kernel/mm/transparent_hugepage ]; then
    echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled
    echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag
  else
    return 0
  fi
;;
esac 

Саме те, що я шукав.
nelaaro

2

Завдяки github & PyYoshi
я знайшов цей приклад для systemd

Створіть файл

sudo vim /etc/systemd/system/disable-transparent-huge-pages.service

Помістіть це у службовий файл

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/usr/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

Для користувачів debian / ubuntu

[Unit]
Description=Disable Transparent Huge Pages

[Service]
Type=oneshot
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/enabled"
ExecStart=/bin/sh -c "/usr/bin/echo "never" | tee /sys/kernel/mm/transparent_hugepage/defrag"

[Install]
WantedBy=multi-user.target

Потім увімкніть послугу

systemctl enable disable-transparent-huge-pages
systemctl start disable-transparent-huge-pages
systemctl status disable-transparent-huge-pages

1

Якщо ви зіткнулися з проблемою

-bash: /sys/kernel/mm/transparent_hugepage/khugepaged/defrag: Permission denied

навіть із судо спробуйте наведені нижче команди:

sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/enabled'
sudo /bin/bash -c 'echo never > /sys/kernel/mm/transparent_hugepage/defrag'

Привіт, ласкаво просимо на Unix SE! Зауважте, було б набагато краще, якби ви також пояснили, що роблять ваші команди.
користувач259412

1

Ось швидкий злом для Ansible (я не хочу керувати шаблоном для /etc/rc.local):

- name: Disable Transparent Huge Pages at boot
  lineinfile:
    dest: /etc/rc.local
    line: "if [ -d /sys/kernel/mm/transparent_hugepage ]; then echo 'never' > /sys/kernel/mm/transparent_hugepage/enabled ; echo 'never' > /sys/kernel/mm/transparent_hugepage/defrag ; fi"
  register: transparent_hugepage
- name: Disable disabled rc.local
  lineinfile:
    dest: /etc/rc.local
    line: 'exit 0'
    state: absent
- name: Disable Transparent Huge Pages at run time 1/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/defrag
  when: transparent_hugepage|changed
- name: Disable Transparent Huge Pages at run time 2/2
  command: echo never > /sys/kernel/mm/transparent_hugepage/enabled
  when: transparent_hugepage|changed

0

У SLES11 SP3 з завантажувачем YAST та GRUB ми повинні додати transparent_hugepage=neverв [YAST-bootloader-edit- рядок з додатковим параметром ядра]. ПРИМІТКА. Цей інструмент змінює файл /boot/grub/menu.lst.

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


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