※本ページは、”Huge Pages or Transparent Huge Pages in Context of Exadata”の翻訳です。


ブログ・シリーズのパート1「Huge Pages: In the context of Exadata」では、Huge Pagesとそのメリットについて説明しました。今回のブログでは、静的なHuge Pagesと透過的Huge Pagesについて説明します。透過的Huge Pagesとは、Huge Pagesを動的に割り当てる手法です。データベース(特にOracle)は、Linux x86-64ベースのシステムで実行する場合、データがメモリー内に存在し、ベースとなるストレージからデータがフェッチされていない場合に優れたパフォーマンスを提供します。データベース・インスタンスが起動される前に、Oracleデータベースの大きなメモリーを構成するために、Huge Pages が事前に割り当てられています。データベースの実行時には、Huge Pagesが重要なパフォーマンス最適化の役割を果たしています。特にミッション・クリティカルなトランザクション・データベースでは、頻繁に使用されるデータはメモリーに保持されます。これは、読取りレイテンシが最も低く、データベース・パフォーマンスを最適化するための重要な機能となります。データベース・バッファ・キャッシュを含むシステム・グローバル領域(SGA)と呼ばれる大量のメモリー領域が、データベース・ワークロードに割りあてられます。 このブログでは、Huge Pagesや透過的なHuge Pagesのシナリオが、非常に高いパフォーマンスを提供するのに有益であることを説明します。

Huge Pagesとは?

システム・メモリーは、ページと呼ばれるブロック単位で編成されます。Linux x86ベースのシステムのページは、サイズが4K (4096バイト)で、合計メモリーがテラバイトまで拡大されてます。1ギガバイトのメモリーを持つシステムには、4Kのページ・サイズの場合、256,000ページがあります。CPUのメモリー管理ユニット(MMU)は、これらのページをすべて管理します。たとえば、標準の4K (4096バイト)ページ・サイズを使用するメモリーが1TB (テラバイト)のシステムでは、2億6800万ページ以上を管理する必要があります。多くのページを管理する場合、MMUのオーバーヘッドにより、パフォーマンスが低下する可能性があります。

Huge Pagesは、Oracle Linuxカーネルの機能であり、オペレーティング・システムでデフォルトの(4K)ページ・サイズより大きいメモリー・ページを使用できるようにします。メモリー割当てを最適化するために、Oracleデータベースのようなメモリー集約型アプリケーションでは、データベース・インスタンスを起動する前にHuge Pagesを使用できます。Oracleでは、Oracleシステム・グローバル領域にメモリーを割り当てる際に、2MBのサイズのHuge Pages(1Gの大きいページ・サイズもある)を使用することを推奨します。最適なパフォーマンスを得るには、すべてのOracleデータベースSGAの割当ての合計(サーバー上のすべてのデータベース・インスタンスのSGAサイズ)をHuge Pages内に配置する必要があります。Huge Pagesの構成については、以前のブログで説明しています。

透過的(Transparent) Huge Pagesとは?

透過(Transparent) Huge Pages(略称THP)は、有効にすると、Linuxカーネル内のレイヤーで、特別なシステム・コールを使用してリクエストするアプリケーションにHuge Pagesを動的に割りあてることができます。透過的Huge Pagesのメモリーは、標準のHuge Pagesメモリーとは異なります。なぜなら、透過的なHuge Pagesメモリーが標準のHuge Pagesメモリーと異なるのは、カーネルのkhugepagedスレッドが実行時にメモリーを動的に割り当てるためです。標準の(静的な)Huge Pagesメモリーは、起動時に事前割りあてされ、実行中には変更されません。データベース・インスタンスは、停止時に、このメモリー・ブロックを使用可能なメモリー・プールに解放しません。

一部のアプリケーション・バイナリ(実行可能ファイルとも呼ばれる)は、Oracle実行可能ファイルと同様に、Huge Pagesを使用してキャッシュすることでメリットが得られ、さらに、実行中に追加のHuge Pagesの割りあてをリクエストすることができます。実行中の透過的なHuge Pagesの割りあて機能により、このようなアプリケーションに必要なHuge Pagesが提供されます。サーバーで実行されているOracle実行可能ファイルなどの大規模なアプリケーションにおいては、これらの実行可能ファイルが、数千の標準の4Kのページを管理するのではなく、大きいページ・サイズを利用できるシナリオがある場合があります。THPは、2MBのページ・サイズを利用して、実行時にHuge Pagesを動的に割りあてることができるため、アプリケーションの実行が改善されます。

標準的なHuge Pagesを割りあています、透過的なHuge Pagesを構成するのはなぜですか?

データベース・インスタンス以外の大規模なアプリケーションが、Huge Pagesのメリットを得られる場合があります。多くのHuge Pages(アプリケーションとデータベースの両方)のメモリーを事前割りあてまたは予約すると、システムで実行されている他のプロセスで使用可能なメモリーが減少します。大規模なアプリケーションでメモリーの塊が必要な場合、実行時にHuge Pagesを割りあてることができます。これらのHuge Pagesは透過Huge Pagesと呼ばれます。

データベースでは、静的Huge Pagesを使用して、スワッピングが最小限で、最も頻繁にアクセスされるデータがメモリーに常駐するようにします。静的Huge Pagesの構成によってメモリーが事前に割りあてられるため、必要な数のHuge Pagesを超えて割りあてる必要はなく、データベース・インスタンスが停止しても解放されません(Huge Pagesとして割り当てられ続けます)。アプリケーションによっては、大きなページ・サイズを使用して、Huge Pagesを動的にリクエストすることでスワッピングを排除することも可能です。これらのページは、アプリケーションが必要ないときにリリースされます。OOracle は、実行可能ファイル内に Oracle データベース エンジンのコンパイル済み命令を含む大きな .text 領域を持つアプリケーションです。このリージョンは読取り専用であり、問合せ処理、メモリー管理およびI/O操作のコア・ロジックを保持するため、実行中に頻繁にアクセスされます。.textリージョンが大きい場合、オペレーティング・システムは数千の標準の4Kページを割りあてる必要があり、オペレーティング・システムで管理する必要があります。OracleがSQL文を実行し、トランザクションを管理し、並行処理するとき、大きい.textリージョンは頻繁にアクセスされます。透過的なHuge Pagesを使用すると、割りあてがページ境界を越える回数が少なくなり、ページ・テーブルの参照が減少し、メモリー使用率が向上します。

アプリケーションは透過的なHuge Pagesをどのようにリクエストしますか?

実行時に膨大なページが必要なアプリケーションがある場合はどうなるでしょうか?この場合、transparent_hugepageのmadviseパラメータが役立ちます。「madvise」が透過的なHuge Pages用に構成され、アプリケーションがHuge Pagesを要求するためにmadviseシステム・コールを行うと、Huge Pagesが割りあてられます。実行時にHuge Pagesを必要とするアプリケーションでは、madviseシステム・コールを明示的に使用して、アプリケーションのパフォーマンスを最適化するために、メモリーのニーズおよびHuge Pagesのそれぞれの割りあてについてカーネルに通知する必要があります。madvise呼び出しを行うように構成されていないその他のアプリケーションは、透過的なHuge Pagesを使用できません。

Oracleでは、Oracle Database 23aiから、透過的なHuge Pagesを有効にして、Oracle実行可能ファイルのような大規模なアプリケーションが透過的なHuge Pagesの利点を享受できるようにすることを推奨します。すべてのデータベース・インスタンスに対して構成されたSGAサイズの合計が、Huge Pages内のメモリー要件に100%適合するように、静的Huge Pagesを割りあてる必要があります。OracleデータベースのSGAは、その目的のために事前に割り当てられている静的Huge Pagesを介して割りあてることを推奨します。

2つの推奨事項のストーリー

Oracle Database 23aiより前のバージョンの場合、Oracleでは静的Huge Pagesの構成および使用を推奨します。Oracle Database 23ai以降、Oracleでは、データベースで最新のUEKの改善を活用できるように、透過的Huge Pagesと静的Huge Pagesを有効にすることをお薦めします。よいニュースは、Exadata System Software 25.1以降のExadata X8M以降では、UEK7と透過的なHuge Pagesがデプロイメント中に有効にされています。以前のリリースからアップグレードし、透過的なHuge Pagesが設定されているかどうかを確認するには、次の方法で簡単に確認できます。ただし、最初に、Oracle Database 19cと23aiの両方が同じデータベース・サーバーに存在する場合の対処方法について説明します。

19cデータベースと23aiデータベースを同じサーバーで実行する場合

Oracle LinuxおよびExadataでは、透過的なHuge Pagesメモリーがデフォルトで有効になっています。kernelコマンドで使用されるmadviseパラメータは、透過的なHuge Pagesを有効にし、madviseシステム・コールを使用してアプリケーションによって明示的にリクエストされたメモリー領域にHuge Pagesを割りあてます。Oracle Database 19cおよび23aiが同じサーバーで実行されている場合、Oracleでは透過的Huge Pagesをmadviseに設定することを推奨します。

システムが透過的なHuge Pagesで構成されていることを確認する方法

Exadataデータベース・サーバーが透過的なHuge Pagesで構成されているかどうかを確認するには、grubブート・ローダーのオプションと、現在のメモリー管理設定を確認する必要があります。

grubの設定のチェックは、’grep -i hugepage /boot/grub2/grub.cfg’を使用し、出力が以下になっていることを確認します。

GRUB_CMDLINE_LINUX="crashkernel=auto rhgb quiet numa=off transparent_hugepage=madvise"

現在のメモリー管理設定は、次を使用して確認できます。

‘cat /sys/kernel/mm/transparent_hugepage/enabled’

出力は次のようになります。madviseの周りの角括弧は、これがアクティブな設定であることを示しています。

always [madvise] never

結論

Exadata環境のHuge Pagesは、システムのメモリーを効率的に利用します。Oracleデータベースを実行する場合、最適なパフォーマンスを得るには、SGA全体(サーバー上のすべてのデータベース・インスタンスのSGAの合計)が静的Huge Pagesにあることを確認します。これにより、Oracleデータベースがメモリー不足にならず、負荷が高くなると断片化が発生しないことが保証されます。Oracle実行可能ファイルなどの大規模なアプリケーションが実行されると、大規模なOracle .textリージョンでは、透過的Huge Pagesのmadviseパラメータを明示的に使用し、実行時にラージ・ページを割り当てます。これにより、アプリケーションを最も効率的な方法で実行できます。データベース メモリの使用率を最適化するために静的Huge Pagesを割りあて、Oracle 実行ファイルなどの大規模なアプリケーションの実行を最適化するために透過的Huge Pagesを割りあてます。