Show Table of Contents
このページには機械翻訳が使用されている場合があります (詳細はこちら)。
7.3. HugeTLB 大規模ページの設定
Red Hat Enterprise Linux 7.1 以降、大規模ページを予約するには起動時
と実行時
の 2 つの方法があります。起動時に予約すると、メモリーの断片化がそれほど行われていないため、成功の可能性が高くなります。ただし、NUMA マシンでは、複数のページが NUMA ノード間で自動的に分割されます。実行時の方法では、NUMA ノードごとに大規模ページを予約できます。実行時の予約が起動プロセスでできるだけ早いタイミングで行われる場合は、メモリーの断片化の可能性が低くなります。
7.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 です。
カーネルブートコマンドラインにパラメーターを追加する方法は、『Red Hat Enterprise Linux 7 カーネル管理ガイド』の「第 3 章 カーネルパラメーターと値のリスト」を参照してください
手順7.1 起動初期時に 1 GB ページを予約
HugeTLB サブシステムでサポートされるページサイズはアーキテクチャーによって異なります。AMD64 および Intel 64 アーキテクチャーの場合、2 MB の大規模ページと 1 GB の巨大ページがサポートされます。
/etc/default/grub
ファイルのカーネルコマンドラインオプションに次の行を root として追加して、1 GB ページ向けの HugeTLB プールを作成します。default_hugepagesz=1G hugepagesz=1G
- 編集したデフォルトファイルを使用して GRUB2 設定を再生成します。BIOS ファームウェアを使用しているシステムの場合は次のコマンドを実行します。
# grub2-mkconfig -o /boot/grub2/grub.cfg
UEFI ファームウェアを使用しているシステムの場合は次のコマンドを実行します。# grub2-mkconfig -o /boot/efi/EFI/redhat/grub.cfg
/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
/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 つの 1GB ページを予約するには、最後の行を以下に置き換えます。reserve_pages 2 node0 reserve_pages 1 node1
必要に応じて変更したり、行を追加してメモリーを他のノードに予約することができます。- スクリプトを実行可能にします。
# chmod +x /usr/lib/systemd/hugetlb-reserve-pages.sh
- 初期時のブート予約を有効にします。
# systemctl enable hugetlb-gigantic-pages
注記
任意のタイミングで
nr_hugepages
に書き込みを行うことにより、1GB を超えるページを実行時に予約できます。ただし、このような予約はメモリーの断片化により失敗することがあります。起動初期時に実行されるこのスクリプトを使用するのが最も信頼できる 1GB ページの予約方法になります。
7.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
- メモリーのオーバーコミット中、システムで作成、使用が可能な追加の大規模ページの最大数を定義します。このファイルにゼロ以外の値を書き込むと、永続大規模ページのプールを使い切ってしまった場合にカーネルの通常ページのプールから指定した大規模ページ数が取得されます。この余剰大規模ページについては未使用になると解放されカーネルの通常プールに戻されます。
このページには機械翻訳が使用されている場合があります (詳細はこちら)。