Red Hat Training

A Red Hat training course is available for Red Hat Enterprise Linux

7.3. HugeTLB Huge Page の設定

Red Hat Enterprise Linux 7.1 以降、Huge Page を予約 する 方法は、ブート時とランタイム 時に の 2 つの方法があります。起動時に予約すると、メモリーの断片化がそれほど行われていないため、成功の可能性が高くなります。ただし、NUMA マシンでは、複数のページが NUMA ノード間で自動的に分割されます。実行時の方法では、NUMA ノードごとに Huge Page を予約できます。ランタイム予約がブートプロセスの早い段階で行われると、メモリーの断片化はより低くなります。

7.3.1. 起動時の Huge Page の設定

起動時に Huge Page を設定するには、カーネルブートコマンドラインに次のパラメーターを追加します。
hugepages
ブート時にカーネルに設定される永続ヒュージページの数を定義します。デフォルト値は 0 です。物理的に近接な空きページが十分にある場合にしか Huge Page を割り当てることはできません。このパラメーターで予約されるページは他の目的には使用できません。
この値は起動後に調整するには、/proc/sys/vm/nr_hugepages ファイルの値を変更します。
NUMA システムの場合、このパラメーターで割り当てた Huge Page はノード間で平等に分割されます。ノードの /sys/devices/system/node/node_id/hugepages/hugepages-1048576kB/nr_hugepages ファイルの値を変更することで、ランタイム時に Huge Page を特定のノード に割り当てることができます。
詳細は、デフォルトで /usr/share/doc/kernel-doc-kernel_version/Documentation/vm/hugetlbpage.txt にインストールされている関連カーネルのドキュメントを参照してください。
hugepagesz
起動時にカーネルに設定される永続ヒュージページのサイズを定義します。使用できる値は 2 MB と 1 GB です。デフォルト値は 2 MB です。
default_hugepagesz
起動時にカーネルに設定される永続 Huge Page のデフォルトのサイズを定義します。使用できる値は 2 MB と 1 GB です。デフォルト値は 2 MB です。
カーネルブートコマンドラインにパラメーターを追加する方法は、Red Hat Enterprise Linux 7 カーネル管理ガイドの第 3 章カーネルパラメーターおよび値の表示を参照してください。

手順7.1 起動初期時に 1 GB ページを予約

HugeTLB サブシステムでサポートされるページサイズはアーキテクチャーによって異なります。AMD64 および Intel 64 アーキテクチャーの場合、2 MB の Huge Page と 1 GB の巨大ページがサポートされます。
  1. root として /etc/default/grub ファイルのカーネルコマンドラインオプションに次の行を追加して、1 GB ページの HugeTLB プールを作成します。
    default_hugepagesz=1G hugepagesz=1G
    
  2. 編集したデフォルトファイルを使用して GRUB2 設定を再生成します。BIOS ファームウェアを使用しているシステムの場合は次のコマンドを実行します。
    # grub2-mkconfig -o /boot/grub2/grub.cfg
    
    UEFI ファームウェアを使用しているシステムの場合は次のコマンドを実行します。
      # grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
    
  3. 以下の内容で /usr/lib/systemd/system/hugetlb-gigantic-pages.service という名前のファイルを作成します。
    [Unit]
    Description=HugeTLB Gigantic Pages Reservation
    DefaultDependencies=no
    Before=dev-hugepages.mount
    ConditionPathExists=/sys/devices/system/node
    ConditionKernelCommandLine=hugepagesz=1G
    
    [Service]
    Type=oneshot
    RemainAfterExit=yes
    ExecStart=/usr/lib/systemd/hugetlb-reserve-pages.sh
    
    [Install]
    WantedBy=sysinit.target
    
  4. 以下の内容で /usr/lib/systemd/hugetlb-reserve-pages.sh という名前のファイルを作成します。
    #!/bin/sh
    
    nodes_path=/sys/devices/system/node/
    if [ ! -d $nodes_path ]; then
    	echo "ERROR: $nodes_path does not exist"
    	exit 1
    fi
    
    reserve_pages()
    {
    	echo $1 > $nodes_path/$2/hugepages/hugepages-1048576kB/nr_hugepages
    }
    
    reserve_pages number_of_pages node
    最後の行で、number_of_pages を予約する 1GB ページの数に置き換え、node をこれらのページを予約するノードの名前に置き換えます。

    例7.1 node0 および node1でのページの予約

    たとえば、node0 に 2 つの 1GB ページと node1 に 1 GB ページを確保するには、最後の行を以下のコードに置き換えます。
    reserve_pages 2 node0
    reserve_pages 1 node1
    
    必要に応じて変更したり、行を追加してメモリーを他のノードに予約することができます。
  5. スクリプトを実行可能にします。
    # chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh
    
  6. 初期のブート予約を有効にします。
    # systemctl enable hugetlb-gigantic-pages
    
注記
nr_hugepages にいつでも書き込みを行い、ランタイム時に 1 GB 以上のページを予約してみてください。ただし、メモリーの断片化による障害を防ぐために、起動プロセス中に 1GB のページを早期に予約します。

7.3.2. 実行時の Huge Page の設定

次のパラメーターを使用して実行時の Huge Page の動作に影響を与えることができます。
/sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages
指定 NUMA ノードに割り当てる指定サイズの Huge Page 数を定義します。これは Red Hat Enterprise Linux 7.1 からの対応になります。次の例では、2048 kB の Huge Page を node2 に追加します。
# numastat -cm | egrep 'Node|Huge'
                 Node 0 Node 1 Node 2 Node 3  Total add
AnonHugePages         0      2      0      8     10
HugePages_Total       0      0      0      0      0
HugePages_Free        0      0      0      0      0
HugePages_Surp        0      0      0      0      0
# echo 20 > /sys/devices/system/node/node2/hugepages/hugepages-2048kB/nr_hugepages
# numastat -cm | egrep 'Node|Huge'
                 Node 0 Node 1 Node 2 Node 3  Total
AnonHugePages         0      2      0      8     10
HugePages_Total       0      0     40      0     40
HugePages_Free        0      0     40      0     40
HugePages_Surp        0      0      0      0      0
/proc/sys/vm/nr_overcommit_hugepages
オーバーコミットメモリーを介してシステムで作成され、使用できる追加の Huge Page の最大数を定義します。このファイルにゼロ以外の値を書き込むと、永続 Huge Page のプールを使い切ってしまった場合にカーネルの通常ページのプールから指定した Huge Page 数が取得されます。この余剰 Huge Page については未使用になると解放されカーネルの通常プールに戻されます。