5.3. HugeTLB 大規模ページの設定

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

5.3.1. 起動時の大規模ページの設定

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

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

HugeTLB サブシステムでサポートされるページサイズはアーキテクチャーによって異なります。AMD64 および Intel 64 アーキテクチャーの場合、2 MB の大規模ページと 1 GB の巨大ページがサポートされます。
  1. 次の行をカーネルコマンドラインオプションに追加して、1 GB ページ向けの HugeTLB プールを作成します。
    default_hugepagesz=1G hugepagesz=1G
  2. /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
    
    [Install]
    WantedBy=sysinit.target
  3. /usr/lib/systemd/hugetlb-reserve-pages という名前のファイルを次の内容で作成します。
    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
    }
    
    # This example reserves 2 1G pages on node0 and 1 1G page on node1. You
    # can modify it to your needs or add more lines to reserve memory in
    # other nodes. Don't forget to uncomment the lines, otherwise then won't
    # be executed.
    # reserve_pages 2 node0
    # reserve_pages 1 node1
  4. ファイルのコメントに従って /usr/lib/systemd/hugetlb-reserve-pages を変更します。
  5. 次のコマンドを実行して起動初期の予約を有効にします。
    # chmod +x /usr/lib/systemd/hugetlb-reserve-pages
    # systemctl enable hugetlb-gigantic-pages

    注記

    任意のタイミングで nr_hugepages に書き込みを行うことにより、1G を超えるページを実行時に予約できます。ただし、このような予約はメモリーの断片化により失敗することがあります。1G ページを予約するには、手順 4 で説明された起動初期時に予約する方法が最も安定的です。

5.3.2. 実行時の大規模ページの設定

次のパラメーターを使用して実行時の大規模ページの動作に影響を与えることができます。
/sys/devices/system/node/node_id/hugepages/hugepages-size/nr_hugepages
指定 NUMA ノードに割り当てる指定サイズの大規模ページ数を定義します。これは Red Hat Enterprise Linux 7.1 からの対応になります。次の例では 2048 kB の大規模ページを 20 ページ 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
メモリーのオーバーコミット中、システムで作成、使用が可能な追加の大規模ページの最大数を定義します。このファイルにゼロ以外の値を書き込むと、永続大規模ページのプールを使い切ってしまった場合にカーネルの通常ページのプールから指定した大規模ページ数が取得されます。この余剰大規模ページについては未使用になると解放されカーネルの通常プールに戻されます。