透明なhugepagesを無効にします


63

RAIDマシンにSAP HANAをインストールしています。インストール手順の一環として、

 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
ここで説明したソリューションのいくつかを使用している場合、「tuned」も実行するシステムでは、tunedがそれらのソリューションをオーバーライドする可能性があることに注意してください。詳細はこちらを参照してください:bugzilla.redhat.com/show_bug.cgi
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ページに出くわした。このページのタイトルは、「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

あるカーネルから次のカーネルにアップグレードすると、最初のオプションは設定が解除される危険があるため、2番目のオプションを使用すると思います。

再起動後、次のコマンドで機能したことを確認できます。

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

7
ほとんどのディストリビューションで/ etc / default / grubのGRUB_CMDLINE_LINUX_DEFAULTオプションにtransparent_hugepage = neverを追加することにより、最初のオプションをカーネルの更新に耐えることができます。
Rwky

2
出力があればcat /sys/kernel/mm/transparent_hugepage/enabledされ[always] madvise never、その後、ステータスがあるalwaysか、それが有効になっていること(注意[]周りのブラケットalways
ub3rst4r

4
hugepagesと透過的なhugepagesを混同しないでください。後者は多くの問題を引き起こす可能性があります。主にCPU使用率が高く、メモリを最適化して通常の4kBページを巨大な2MBページに変換しようと絶えず試みています。
Marki555

2
@Rwky-あなたの提案に従って微調整するとき-ファイルを保存した後の次のアクションは、sudo update-grub「石で書かれた」新しい設定を取得するために実行することです。grubファイルの行を指すための+1。
ファロン

2
EC2のアップデートでは、cloudimgが/etc/default/grub.d/50-cloudimg-settings.cfgファイルを追加します。このファイルは/ etc / default / grubの設定を上書きし、/ etc / default / grub.d /ファイルを追加します内容GRUB_CMDLINE_LINUX_DEFAULT = "$ GRUB_CMDLINE_LINUX_DEFAULT transparent_hugepage = never"を含む99-transparent-hugepage.cfgはこれを解決します。
Rwky

13

MariaDBでTokuDBを有効にするために、CentOS v6で透過的なhugepagesを無効にしようとしていたので、この質問に追加したかっただけです。@slmで言及されているスクリプトをに追加し、/etc/rc.local透明なhugepagesを無効にしました。ただし、Linuxでの起動スクリプトの動作方法により、/etc/rc.localすべてのサービスが開始された後に実行されます。そのため、MariaDBが既に開始され、TokuDBエンジンが初期化されなかった後、透過的な巨大ページが無効にされていました。透過的なhugepagesを無効にする他の唯一の方法は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の実際の構成ファイルを生成する必要があることを追加しました。
シアトルガウチョ14

3
EC2 ubuntuインスタンスの場合、/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)またはそのままcliから直接動作します。


「適切に構成されたスクリプト」とすべてをセットアップする手順を含むように、指示を展開してください。MongoDBの公式の手順docs.mongodb.org/manual/tutorial/transparent-huge-pagesは古い方法を示していますが、systemdがより一般的になったので、systemdの方法でこれを使用することをお勧めします。
ササ

3

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

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

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

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

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

YASTおよびGRUBブートローダーを使用したSLES11 SP3ではtransparent_hugepage=never、[オプションのカーネルパラメーターを使用したYAST-bootloader-edit-line]を追加する必要があります。注:このツールはファイルを変更します/boot/grub/menu.lst

この変更を行って再起動すると、THPが無効になります。


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.