※本ページは、”Huge Pages: In the context of Exadata“の翻訳です。
ノート: この記事では、Linux/x86プラットフォームに焦点をあてています。その他のプラットフォームでは、Huge Pagesの構成は異なりますが、主たる概念は同じです。
メモリーは、システム上でソフトウェアを実行するための重要なリソースですが、Oracle Databaseの実行においてはさらに重要になります。メモリーにデータを保存すると、データベースのパフォーマンスが向上するため、メモリーはデータベース・パフォーマンスにおいて重要な役割を果たします。Oracle Database In-Memoryは、ストレージI/Oに依存するのではなく、システムのメイン・メモリーにさらに多くのデータを配置するソリューションです。最新のアプリケーションには、これまでにないくらいの低レイテンシと高スループットを実現するデータベースが必要です。大規模なデータベースは多くの場合、ペタバイトの範囲まで拡張されますが、I/Oレイテンシのニーズはマイクロ秒の範囲に狭められています。
このような需要が高まっているため、頻繁にアクセスされるデータをシステム・メモリーに収めることがさらに重要になっています。プロセッサ・コア数が増加し、ネットワークの高速化を伴うテクノロジーの進歩により、システムがテラバイトのメモリーを必要とする範囲に押し込まれていることが明らかになっています。これらの大規模なシステムでメモリーがどのように構成されているかを見てみましょう。
システムメモリ- どのように構成されているでしょうか?
メモリーは、ページと呼ばれるブロック単位で編成されます。Linux x86ベースのシステムのページは、サイズが4K (4096バイト)で、合計メモリーがテラバイトに拡大されます。1ギガバイトのメモリーを持つシステムには、4Kページ・サイズを使用する場合、256,000ページがあります。これらのページはすべて、CPUのメモリー管理ユニット(MMU)によって管理されます。たとえば、標準の4K (4096バイト)ページ・サイズを使用するメモリーが1TB (テラバイト)のシステムを考えてみます。2億6800万以上のページを管理する必要があります! 多くのページを管理するMMUのオーバーヘッドによって、パフォーマンスは低下します。
ページ・エントリ- どのように管理されているでしょうか?
MMUはMMU内で多数のページテーブルエントリを使用することによってのみ大量のメモリーを管理できるため、パフォーマンスオーバーヘッドが大きくなります。もう1つの方法は、ページ・サイズを4Kバイトからそれより大きいサイズに増やして、ページ・テーブル・エントリの数を減らすことです。ただし、このアプローチでは、4Kページ・サイズで正常に動作するアプリケーションのメモリーが無駄になります。解決策は、大量のメモリーを必要とするOracleシステム・グローバル領域(SGA)などの構造体に個別のメモリー割りあてを使用することであり、従来の4Kページはその他の用途に残して利用します。これがHuge Pagesです。Huge Pages は、オペレーティング・システムがデフォルト(4K)のページ・サイズより大きいメモリー・ページを使用できるようにするOracle Linuxカーネルの機能です。Oracleシステム・グローバル領域にメモリーを割り当てるには、2MBのHuge Pagesサイズを使用することを推奨します。
Oracle Database、ExadataおよびHuge Pages…
Exadataは、Oracle Databaseの実行用に特別に最適化されたエンジニアド・システムです。Exadataは、高パフォーマンスのデータベースの他、高密度のデータベース統合にも広く使用されています。現在の世代のExadataシステムにはテラバイトのシステム・メモリーがあり、卓越したデータベース・パフォーマンスを実現します。Exadataプラットフォームのパフォーマンスと統合の利点を実現するには、システム・メモリーを適切に構成する必要があります。各データベースのSGAがHuge Pagesに構成されるに、Exadataシステムを適切に構成する必要があります。
ExadataでHuge Pagesを設定する方法:
ExadataなどのLinux環境でヒュージ・ページを構成するには、システム管理者(root権限)が必要です。/etcディレクトリにある構成ファイルsysctl.confが更新されます。hugepagesのパラメータはvm.nr_hugepagesです。通常、Huge Pages数を有効にするにはシステムを再起動する必要がありますが、システム管理コマンドsysctl -pを使用してファイルを動的にロードできます。
oracle@slcqah01adm03 ~]$ cat /proc/meminfo | grep Huge AnonHugePages: 0 kB ShmemHugePages: 0 kB HugePages_Total: 77064 HugePages_Free: 673 HugePages_Rsvd: 673 HugePages_Surp: 8 Hugepagesize: 2048 kB
前述の例では、システムに77064個のHuge Pagesが構成されています。この数のHuge Pagesを使用すると、Oracle DatabaseのSGAを約150GB (77064 x 2M)で構成することができます。
Huge Pages数の計算方法:
データベースのメモリー構成は、パフォーマンスを最適化するために重要です。Oracleデータベースには、SGA (システム・グローバル領域)を含む共有メモリー領域、およびPGA (プロセス・グローバル領域)を含むプライベート・メモリー領域があります。通常、OLTP(オンライン・トランザクション処理)ワークロードでは、最も高速なアクセスのためにバッファ・キャッシュ(SGAの領域)にさらに多くのデータが必要です。データ・ウェアハウスまたは分析ワークロードは通常、より多くの作業をExadata Storage Serversにオフロードするため、より多くのプライベート・メモリーがPGAに必要です。
SGAのサイズは、OLTPや分析などのワークロードのタイプによって異なる場合がありますが、Oracle Databasesは、SGA全体がHuge Pagesにある場合に最適に実行されます。SGAの適切なサイズはシステムに依存し、システムで使用可能なリソースによって制限されます。Huge Pagesの適切な数は、システムで実行されているデータベースのすべてのSGAの合計サイズに基づきます。2MのHuge Pagesサイズを使用すると、50G (51200M)のサイズのSGAには、51200/2 = 25600 Huge Pagesが必要です。簡略化のため、Oracleでは、バイト・オフセットおよびページの位置合せの要件を考慮するために、Huge Pagesを追加することを推奨します。
Oracle Databaseでは、SGAサイズ(spfile.oraで指定)を使用して、必要なHuge Pages数を計算します。Oracleは、USE_LARGE_PAGESのパラメータ設定に応じて、Huge Pages または標準の4Kページ(あるいはその両方)にSGAを適合させます。
Oracleには、Oracle Linuxシステムの現在の共有メモリー・セグメントの推奨Huge Pages構成の値を計算するスクリプトが用意されています。MOSドキュメントID: 401749.1を参照してください
USE_LARGE_PAGESのオプションは何がありますか?
パラメータ(init.ora構成ファイルで設定) USE_LARGE_PAGESには、マニュアルで概説されているいくつかのオプションがあります。Oracle Database 19c については、このリンク(Use_Large_Pages)を参照してください。
FALSE: この設定では、データベース・インスタンスはHuge Pagesを使用しません。ラージ・ページ(Huge Pagesとも呼ばれる)を使用してパフォーマンスを向上することができるため、この設定は大きいSGAサイズでの使用は推奨しません。
TRUE: この設定により、Oracleデータベースは、4Kページを割り当てる前に、できるだけ多くのHuge Pagesを割り当てることによって、Huge Pagesと4Kページの組合せを使用することができます。この設定は大きいSGAサイズでは、ONLY設定を使用して排他的にHuge Pagesを使用することでパフォーマンスを向上できるため、推奨しません。
AUTO: この設定は、DBAとシステム管理者間の調整が不要になることを意図しています。Oracleでは、AUTOの代わりにONLYの設定を使用することを推奨します。AUTOの設定は、SGAサイズを使用して、オペレーティング・システムに必要なラージ・ページ数を決定し、可能なかぎり多くのHuge Pagesを自動的に構成します。各データベースのSGAは、Huge Pagesと4Kページの組合せを使用する可能性があるため、この設定は推奨しません。
ONLY: このパラメータ値は、すべてのSGAがHuge Pagesに存在することを確認するために導入されました。Oracleでは、一貫したパフォーマンスを実現するためにこの設定を推奨します。使用可能なHuge Pagesが十分ではない場合、データベースの起動に失敗しますが、最適ではない構成から始まるデータベースより優先されます。
AUTO_ONLY: AUTOと同様に、この設定は、DBAとシステム管理者間の調整が不要になるように意図しています。この設定により、各SGAに収まるのに必要なHuge Pages数が自動的に決定され、SGAはHuge Pagesにのみ存在します。Oracleでは、ONLYの設定を使用することを推奨します。
Exadataシステムのノート:
パフォーマンスと安定性を最大限に高めるために、Oracleでは、SGAに常にラージ・メモリー・ページを使用し、Huge Pagesを事前に設定し、USE_LARGE_PAGES=ONLYを使用してシステム・パフォーマンスを最適化することを推奨します。Oracle自動化ツールでは、設定USE_LARGE_PAGES=ONLYが使用されます。これには、Oracle Exadata Deployment Assistant (OEDA)を使用して作成されたデータベース、およびクラウドベースのExadataデプロイメントで作成されたデータベース(Exadata Database Serviceを使用)が含まれます。Oracle Exadata構成チェック・ユーティリティ(ExaChk)もこの設定をチェックし、USE_LARGE_PAGES=ONLYを推奨します。
USE_LARGE_PAGES=ONLYの場合、SGAを含めるのに十分なHuge Pages (SGA * 2MB = 必要な Huge Pagesの合計数)が使用できないと、データベースの起動に失敗します。この場合、システム管理者は、すべてのデータベースをカバーするために十分なHuge Pagesが使用可能になるようにオペレーティング・システムを構成するか、使用可能なHuge Pages数内に収まるようにSGAサイズを小さくする必要があります。
まとめ:
オンプレミスおよびクラウドでのExadataは、大規模なスケーラビリティとテラバイトのシステム・メモリーを実現する統合プラットフォームです。Linuxの標準メモリー・ページ・サイズは4Kで、Exadata上の最新の高パフォーマンスのOracle Databasesの大規模なSGAサイズには適していません。Oracleでは、すべてのExadataシステムでUSE_LARGE_PAGES=ONLYを設定することで、SGAメモリーにHuge Pagesを排他的に使用することをお薦めします。
