отключить прозрачные страницы


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
Дежей Клэйтон

Ответы:


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) .

В частности, на этой странице они упоминают, как отключить функцию огромной страницы .

выдержка

Предпочтительный метод отключения Transparent 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 = never в параметр 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 = never" решит эту проблему.
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поскольку она будет последовательно применяться к любому ядру, которое может быть когда-либо установлено на коробке.
СЛМ

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

3
Для экземпляра EC2 Ubuntu мне нужно изменить /etc/default/grub.d/50-cloudimg-settings.cfgфайл вместо того, /etc/default/grubчтобы он работал.
Женгюэ

Я использую CentOS 6.6. Я изменил, /etc/rc.localно это не работает для меня. Можете ли вы объяснить корень случай для меня.
Сандип Сингх

@ s.singh Как я уже говорил, /etc/rc.local is executed after all the services are startedего нужно отключить на уровне ядра
ub3rst4r

6

Вот реализация, использующая puppet:

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 более распространен, было бы неплохо иметь это системным способом.
ссаса

3

В случае с Redis также выдается предупреждение, в котором предлагается отключить THP. Но, как отмечается в сообщении об ошибке , во многих дистрибутивах /etc/rc.localвыполняется после сервисов, и это не влияет на них, пока они не перезапустятся. Также обратите внимание, что в виртуализированных средах (например, Digitalocean) вы не можете управлять настройками GRUB.

Решением в таком случае является использование специального скрипта инициализации, чтобы отключить прозрачные огромные страницы, как предполагает эта страница , с помощью настроек X-Start-Before. Например, сценарий инициализации 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, попробуйте следующие команды:

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! Обратите внимание, было бы намного лучше, если бы вы также объяснили, что делают ваши команды.
user259412

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-line с необязательным параметром ядра]. ПРИМЕЧАНИЕ. Этот инструмент изменяет файл /boot/grub/menu.lst.

Только после внесения этого изменения перезагрузка привела к отключению THP.


Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.