Amazon Elastic Compute Cloud (Amazon EC2) Linux インスタンスでホストされているデータベースまたはアプリケーションのパフォーマンスを改善したいと考えています。パフォーマンスを向上させるために、インスタンスで HugePages を設定する方法を教えてください。
簡単な説明
HugePages は、デフォルトの 4 KB ページサイズよりもサイズが大きいメモリページです。大規模なアプリケーションまたはデータベース環境から Linux インスタンスのカーネルで HugePages を有効にすると、TLB への負荷を軽減できます。TLB の負荷が軽減されると、サーバーとアプリケーション、またはデータベースのパフォーマンスが向上します。これは、TLB が保存するページ数が少なくなるのが原因です。
たとえば、インスタンスで HugePages が設定されていない TLB エントリが 512 の場合、メモリサイズは次のようにほぼ等しくなります。
4096 B * 512 = 2 MB メモリサイズ
TLB エントリが 512 で、インスタンスで HugePages が設定されている場合、メモリサイズは次のようにほぼ等しくなります。
2 MB * 512 = 1 GB メモリサイズ
注意: Linux システムでの HugePages の有効な値は 2 MB と 1 GB です。デフォルト値は 2 MB です。
HugePages の詳細については、Oracle ヘルプセンターの HugePages を参照してください。
HugePages を有効にする前に、次の点に注意してください。
- デフォルトでは、システムを起動しても HugePages はリリースされません。システムの起動後にリリースを有効にするには、使用可能なページ数を変更するか、HugePages プールサイズを変更します。
- システムの起動時に、割り当てに適切なスペースがメモリに存在しない場合、HugePages の割り当ては失敗します。hugepagesize * HugePages の数の値は、常にインスタンスの合計メモリより小さくする必要があります。使用可能でなければならないメモリ量を決めるには、free -m コマンドを実行して、インスタンスの合計メモリを確認します。
注意: hugepagesizeの値は、アプリケーションまたはデータベースベンダー、またはシステム管理者から取得します。たとえば、Oracle データベースの HugePages を有効にするには、Oracle から SGA を取得できます。詳細については、データベースパフォーマンスチューニングガイドの SGA メモリ割り当ての表示を参照してください。
- インスタンスのカーネルで Hugepages を有効にするには、インスタンスのアプリケーションまたはデータベースが HugePages をサポートしている必要があります。アプリケーションまたはデータベースが HugePages をサポートしていることをベンダーまたはシステム管理者に確認します。
解決方法
注意: テスト環境で HugePages を設定し、本番環境にデプロイする前にパフォーマンスをベンチマークすることをお勧めします。
1. カーネルで現在 HugePages が有効になっていないことを確認するには、cat コマンドを実行します。
# sudo cat /proc/sys/vm/nr_hugepages
0
前の例では、nr_hugepages パラメータ値は 0 で、HugePages が有効になっていないことを示します。
2. HugePages を有効にするには、次のコマンドを実行してカーネルパラメータ値を 2048 に設定します。
# sudo sysctl -w vm.nr_hugepages=2048
vm.nr_hugepages = 2048
3. 再起動後に HugePages が割り当てられることを確認するには、/etc/sysctl.conf に次のエントリを追加します。
# sudo echo "vm.nr_hugepages=2048" >> /etc/sysctl.conf
4. cat コマンドを実行して変更を確認します。
# sudo cat /etc/sysctl.conf
# sysctl settings are defined through files in
# /usr/lib/sysctl.d/, /run/sysctl.d/, and /etc/sysctl.d/.
#
# Vendors settings live in /usr/lib/sysctl.d/.
# To override a whole file, create a new file with the same in
# /etc/sysctl.d/ and put new settings there. To override
# only specific settings, add a file with a lexically later
# name in /etc/sysctl.d/ and put new settings there.
#
# For more information, see sysctl.conf(5) and sysctl.d(5).
vm.zone_reclaim_mode=1
vm.nr_hugepages=2048
5. インスタンスを再起動します。
6. 再起動後、cat コマンドを再度実行して、HugePages の値と設定を確認します。
# sudo cat /proc/sys/vm/nr_hugepages
2048
7. /proc/meminfo で使用可能な HugePages を確認します。
# sudo grep Huge /proc/meminfo
HugePages_Total: 2048
HugePages_Free: 2048
HugePages_Rsvd: 0
HugePages_Surp: 0
Hugepagesize: 2048 kB
前述の出力例での各変数の定義については、kernel.org の HugePages を参照してください。
これで、HugePages がサーバー上で有効になりました。
8. 必要に応じて、追加のアプリケーションで HugePages を設定します。
注意: HugePages を無効にする方法:
1. nr_hugepages を 0 に戻します。
2. sysctl.conf のエントリを削除します。
3. サーバーを再起動して有効にします。