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
ファイル内に追加する必要がありますか?
このようなオプションを永続的にするには、通常それらをファイル/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]
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
ここにパペットを使用した実装があります:
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",
}
上記のすべてがEC2 Ubuntu 16.04では機能しませんでしたが、次のように機能しました。
Sudo apt install hugepages
Sudo hugeadm --thp-never
カーネル行transparent_hugepage=never
は、私が必要とするものの半分しか無効にしないので(両方とも、mongodbが失敗する/ログに迷惑をかけるため)、systemd
起動スクリプトを通じて永続化しませんでしたが、現在はecho never | Sudo tee /sys/kernel/mm/transparent_hugepage/enabled
です。これは、systemctlブートスクリプト(/etc/systemd/system
で適切に構成されている場合)またはそのままcliから直接機能します。
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
おかげで 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
問題に遭遇した場合
-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'
これは、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
YASTおよびGRUBブートローダーを使用するSLES11 SP3では、[YAST-bootloader-edit- line with optional kernel parameter]にtransparent_hugepage=never
を追加する必要があります。NOTE:このツールは、ファイル/boot/grub/menu.lst
を変更します。
この変更を行って再起動した後にのみ、THPが無効になりました。
Forgeの別のパペットソリューションを次に示します。 https://forge.puppetlabs.com/ramseymcgrath/remove_hugepage/
ただ使用する:
include remove_hugepage
あなたのパペットノード定義で。