web-dev-qa-db-ja.com

透明な巨大ページを無効にする

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ファイル内に追加する必要がありますか?

65
Ramesh

このようなオプションを永続的にするには、通常それらをファイル/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ページを見つけました。ページのタイトルは Linux(x86-64)上のOracleのHugePagesを構成する .

具体的には、そのページで hugepage機能を無効にする の方法について言及しています。

抜粋

Transparent HugePagesを無効にするための推奨される方法は、「/ etc/grub.conf」ファイルのカーネルブート行に「transparent_hugepage = never」を追加することです。

   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

1つのカーネルから次のカーネルにアップグレードするときに最初のオプションが不安定になるリスクがあるので、私は2番目のオプションを選択すると思います。

再起動後、次のコマンドで動作することを確認できます。

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

MariaDBでTokuDBを有効にするためにCentOS v6で透過的な巨大ページを無効にしようとしていたので、この質問に追加したかっただけです。 @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を使用することです。 grubbyを使用して各カーネルにtransparent_hugepage=neverを追加するこの簡単なスクリプトを作成しました。

#!/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
ub3rst4r

ここにパペットを使用した実装があります:

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
J Maurer

上記のすべてがEC2 Ubuntu 16.04では機能しませんでしたが、次のように機能しました。

Sudo apt install hugepages
Sudo hugeadm --thp-never
6
legel

カーネル行transparent_hugepage=neverは、私が必要とするものの半分しか無効にしないので(両方とも、mongodbが失敗する/ログに迷惑をかけるため)、systemd起動スクリプトを通じて永続化しませんでしたが、現在はecho never | Sudo tee /sys/kernel/mm/transparent_hugepage/enabledです。これは、systemctlブートスクリプト(/etc/systemd/systemで適切に構成されている場合)またはそのままcliから直接機能します。

4
Rob Jens

Redisの場合、THPを無効にすることを示唆する警告も発します。しかし バグレポート で述べたように、多くのディストリビューションでは/etc/rc.localはサービスの後に実行され、再起動するまでサービスに影響しません。また、仮想化環境(Digitaloceanなど)では、GRUB設定を制御できないことに注意してください。

このような場合の解決策は、専用のinitスクリプトを使用して透過的な巨大ページを無効にするです。 ) このページ が示唆するように、設定によってX-Start-Before。たとえば、Redis用のDebianinitスクリプト:

#!/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
saaj

おかげで githubPyYoshi
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
3
nelaaro

問題に遭遇した場合

-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
Qiang Du

これは、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
1
dannyman

YASTおよびGRUBブートローダーを使用するSLES11 SP3では、[YAST-bootloader-edit- line with optional kernel parameter]にtransparent_hugepage=neverを追加する必要があります。NOTE:このツールは、ファイル/boot/grub/menu.lstを変更します。

この変更を行って再起動した後にのみ、THPが無効になりました。

0
Detlef

Forgeの別のパペットソリューションを次に示します。 https://forge.puppetlabs.com/ramseymcgrath/remove_hugepage/

ただ使用する:

include remove_hugepage

あなたのパペットノード定義で。

0
Ramsey