Amazon EC2 Linux インスタンスで HugePages を設定する方法を教えてください。

最終更新日: 2020 年 6 月 15 日

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.    サーバーを再起動して有効にします。


この記事はお役に立ちましたか?

改善できることはありますか?


さらにサポートが必要な場合