отключите прозрачный hugepages

Три возможности, которые приходят на ум для меня:

  • Псевдоним существует для emacs (который Вы проверили),
  • Функция существует для emacs
  • Новое emacs двоичный файл не находится в хеш-таблице ПУТИ Вашей оболочки.

Можно проверить, есть ли у Вас функция emacs:

bash-3.2$ declare -F | fgrep emacs
declare -f emacs

И удалите его:

unset -f emacs

Ваша оболочка также имеет хеш-таблицу ПУТИ, которая содержит ссылку на каждый двоичный файл в Вашем ПУТИ. Если Вы добавляете новый двоичный файл с тем же именем как существующее в другом месте в Вашем ПУТИ, оболочке нужно сообщить путем обновления хеш-таблицы:

hash -r

Дополнительное объяснение:

which не знает о функциях, поскольку это не встроенный удар:

bash-3.2$ emacs() { echo 'no emacs for you'; }
bash-3.2$ emacs
no emacs for you
bash-3.2$ which emacs
/usr/bin/emacs
bash-3.2$ `which emacs` --version | head -1
GNU Emacs 22.1.1

Новое двоичное поведение хеш-таблицы продемонстрировано этим сценарием.

bash-3.2$ PATH=$HOME/bin:$PATH
bash-3.2$ cd $HOME/bin

bash-3.2$ cat nofile
cat: nofile: No such file or directory
bash-3.2$ echo echo hi > cat
bash-3.2$ chmod +x cat
bash-3.2$ cat nofile
cat: nofile: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
hi
bash-3.2$ rm cat
bash-3.2$ cat nofile
bash: /Users/mrb/bin/cat: No such file or directory

bash-3.2$ hash -r
bash-3.2$ cat nofile
cat: nofile: No such file or directory

Хотя я не назвал его, which cat всегда возвращал бы первое cat в моем ПУТИ, потому что это не использует хеш-таблицу оболочки.

64
08.11.2013, 00:10
11 ответов

Для создания опций, таких как это постоянными, Вы будете обычно добавлять их к файлу /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. Поиск с помощью Google немного больше, я действительно сталкивался с этой страницей Oracle, которая обсуждает эту самую тему. Страница названа: Конфигурирование HugePages для Oracle на Linux (x86-64).

Конкретно на той странице они упоминают, как отключить hugepage опцию.

выборка

Предпочтительный метод отключить Прозрачный 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

Я думаю, что пошел бы с 2-й опцией, так как первое подвергнется риску сбрасываться, когда Вы обновите от одного ядра до следующего.

Можно подтвердить, что это работало со следующей командой после перезагрузки:

$ cat /sys/kernel/mm/transparent_hugepage/enabled
always madvise [never]
81
27.01.2020, 19:32
  • 1
    Можно заставить первую опцию пережить обновления ядра путем добавления transparent_hugepage=never к опции GRUB_CMDLINE_LINUX_DEFAULT в/etc/default/grub на большинстве дистрибутивов. –  Rwky 20.04.2014, 12:52
  • 2
    Если вывод cat /sys/kernel/mm/transparent_hugepage/enabled [always] madvise never, затем состояние always или это, которое это включено (отмечают [] скобки вокруг always) –  ub3rst4r 30.10.2014, 07:08
  • 3
    Не путайте hugepages и прозрачный hugepages. Последний может вызвать много проблем, главным образом высокого использования ЦП при постоянной попытке дефрагментировать память и преобразовать нормальные страницы 4 КБ в огромные страницы 2MB. –  Marki555 20.05.2015, 19:26
  • 4
    @Rwky - при тонкой настройке согласно предложению - я подчеркнул бы, что следующее действие после того, чтобы сохранить файл должно выполниться sudo update-grub получить новые настройки, "записанные в камне". +1 для указания на строку файла личинки. –  Faron 13.07.2015, 20:25
  • 5
    Обновление для тех, которые на EC2, объединение в облако, добавляет файл/etc/default/grub.d/50-cloudimg-settings.cfg, который переопределяет настройки в/etc/default/grub добавление, что файл/etc/default/grub.d/99-transparent-hugepage.cfg с содержанием GRUB_CMDLINE_LINUX_DEFAULT =" $GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage=never" решит это. –  Rwky 19.09.2017, 12:53

Вот реализация с использованием марионетки:

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
27.01.2020, 19:32

Я просто хотел добавить к этому вопросу, так как я пытался отключить прозрачные горы на CentOS V6, чтобы включить Токудб для Мариада. Я добавил скрипт, упомянутый @SLM на /etc/rc.local , и он отключил прозрачные гостеприимные страницы. Однако из-за того, как сценарии запуска работают в Linux, /etc/rc.local выполняется после начала всех сервисов. Поэтому прозрачные огромные страницы отключали после начала Mariadb, и двигатель Tokudb не будет инициализировать. Единственным другим способом отключения прозрачных гостей является добавлением Transparent_hugePage = никогда к параметру ядра.

Я заметил @ rwky's Comment Вы можете сделать первый вариант, выжившие обновления ядра, добавив Transparent_hugePage = никогда опции GRUB_CMDLINE_LINUX_DEFAULT в / etc / default / grub на большинстве распределений. И узнают, что CentOS не поддерживает файл / etc / default / grub и был обеспокоен transparent_hugepage = никогда исчезает из параметров ядра, когда он обновляется. Но не беспокоиться, CentOS настроен, чтобы сохранить любые изменения, внесенные в параметры ядра в Grub, поэтому, когда он обновляется, они содержатся.

Также добавить, правильный способ изменить параметры ядра для GRUB с Grubby . Я создал этот простой скрипт, чтобы добавить transparent_hugePage = никогда к каждому ядру с 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
13
27.01.2020, 19:32

Они оба работают на меня:

 du -h | perl -ne '$n=()=$_=~m#/#g;  print unless $n > 2'
 du -h | perl -ne 'print unless ($n=()=$_=~m#/#g) > 2 '
-121--36369-

Можете ли вы объяснить, что вы имеете в виду под USB-палочкой с FreeBSD на ней. Вы имеете в виду установщик FreeBSD или версию Live FreeBSD?

Если вы хотите установить FreeBSD, загрузите версию memstick.img из здесь .

Если требуется версия Live FreeBSD, загрузите образ из здесь .

После загрузки выгрузки образа на USB-накопитель с помощью команды dd :

dd if=~/freebsd-memstick.img of=/dev/usb bs=1M

usb также может быть /dev/sdb или /dev/sdc ... Сначала проверьте, какая буква диска будет у вашего USB-накопителя, в противном случае вы можете удалить неправильный диск.

-121--244078-

Поскольку строка ядра transparent _ hugepage = never отключает только половину того, что мне нужно (и то, и другое, для назойливого сбоя mongodb/logs), что я не сохранил через systemd startup script, но теперь имеют: echo никогда | suddo tee/ sys/kernel/mm/transparent_hugepage/enabled. Это работает либо в сценарии загрузки systemctl (если он правильно настроен в /etc/systemd/system ), либо прямо из cli как есть.

4
27.01.2020, 19:32

В SLES11 SP3 с загрузчиком YAST и GRUB мы должны добавить transparent_hugepage = never в [YAST-bootloader-edit- line с необязательным параметром ядра]. ПРИМЕЧАНИЕ. Этот инструмент изменяет файл /boot/grub/menu.lst .

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

0
27.01.2020, 19:32

Возможно, вы исчерпаете пространство среды с большим количеством файлов, что позволит расширить имя файла для выполнения этой задачи (например, в некоторых UNIX-системах). По этой причине я бы использовал «find» для определения файлов, которые вы хотите удалить.

Чтобы просмотреть файлы, которые будут удалены, можно запустить

find $(find /specified/directory -d -name "[0-9][0-9][0-9][0-9]") -name "[E|P]*" -print 

, чтобы удалить их, чтобы расширить их с помощью опции -exec

find $(find /specified/directory -d -name "[0-9][0-9][0-9][0-9]") -name "[E|P]*" -exec rm -i {} \;
-121--247405-

Почему бы просто не создать программную ссылку с ln?

Вместо копирования из другого ответа здесь ссылка. Stackoverflow: как создать ссылку на каталог

-121--243772-

Вот еще одно марионеточное решение в Кузнице: https://forge.puppetlabs.com/ramseymcgrath/remove_hugepage/

Просто используйте

include remove_hugepage

в определении марионеточного узла.

0
27.01.2020, 19:32

Все вышеперечисленное не сработало для меня на EC2 Ubuntu 16.04, но это сработало:

sudo apt install hugepages
sudo hugeadm --thp-never
6
27.01.2020, 19:32

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

В этом случае решением является использование специального сценария init для отключения прозрачных огромных страниц , как эта страница предлагает, с помощью настроек X-Start- До . Например, сценарий Debian init для 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 
3
27.01.2020, 19:32

Благодаря 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
4
27.01.2020, 19:32

Вот лайфхак для 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
2
27.01.2020, 19:32

Если вы столкнулись с проблемой

-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'
1
27.01.2020, 19:32

Теги

Похожие вопросы