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

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

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

答え1

これらのオプションを永久に作成するには、通常、そのオプションをファイルに追加します/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用の大容量ページを構成する

具体的には、そのページでは、彼らはどのように言及しています。大きなページ機能を無効にする

抜粋

透明な巨大ページを無効にする最善の方法は、 "/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]

答え2

MariaDB用のTokuDBを有効にするためにCentOS v6で透明なhugepageを無効にしようとしたときにこの質問に追加したかったのです。/etc/rc.local透明なhugepagesを無効にする@slmで述べたスクリプトを追加しました。ただし、Linux上で起動スクリプトがどのように機能するかによって、/etc/rc.localすべてのサービスが起動した後に実行されます。したがって、MariaDB の起動後に透明な巨大ページが無効になり、TokuDB エンジンは初期化されません。透明な巨大ページを無効にするもう1つの方法は、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=nevergrubby

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

答え3

人形を使った実装は次のとおりです。

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",
}

答え4

ありがとうフラッグハブ&フィヨシ
このシステム例を見つけました。

ファイルの作成

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

関連情報