Oracle RDSでメモリ使用率が常に高くても心配しなくてよい理由

記事タイトルとURLをコピーする

PS課の杉村です。RDSのメモリ使用率が高くて心配になることはないでしょうか。 たとえRDSのメモリ使用率が80%~90%といった高い水準になっていても、それ自体をあまり心配する必要はない、という内容についてご説明します。

CloudWatchを利用するとRDSの各種パフォーマンス情報を閲覧することができます。 例えばFreeableMemoryメトリクスを見ることで、RDSの使われていないメモリ領域を確認することができます。

Oracle RDSを例にとります。 あるお客様で、Oracle RDSのメモリ使用率が、常時80%~90%くらいの間になっていることがありました。 これについて調べましたので、その結果を書いてみたいと思います。

ポイント

  • RDBMSにおいては常時メモリ使用率が高いことは通常の挙動である
    • Oraleに限らず、RDBMSではストレージへのアクセスを最小化するためにテーブル、インデックス、トランザクション・ログ等をメモリ上にキャッシュする
    • 多くのRDBMSにて、システムで利用可能なメモリの大部分(70~80%前後程度)をキャッシュに割り当てることがベスト・プラクティス
  • Oracle RDSインスタンスはデフォルトで最大87.5%のメモリを使うよう設定されている (r4クラスの場合)
  • その他のOS等のプロセスのメモリ使用率も上乗せされてくるが、RDSでは使用率を圧迫しすぎないようチューニングされている

詳細

以下に根拠となるドキュメントや設定値、理屈について記載してみます。

Oracleでは初期化パラメータのMEMORY_MAX_TARGETおよびMEMORY_TARGETを指定することで自動メモリチューニングがONになり、メモリ領域の自動管理がされます。しかしOracle RDSのパラメータグループではMEMORY_MAX_TARGET/MEMORY_TARGETはいずれもデフォルトで以下の通りです。

IF({DBInstanceClassHugePagesDefault}, 0, {DBInstanceClassMemory*3/4})

Huge Pages機能がデフォルトでOFFのインスタンスクラス(m4, m3, r3, t2)では、この値が「DBInstanceClassMemory*3/4」になりますため、インスタンスのメモリ総量の3/4...つまり 75% がOracleが利用するメモリの最大値になります。

※ Huge Pagesとは m4, m3, r3, t2以外のインスタンスクラスのOracle RDSでは、Huge Pages機能がデフォルトで有効化されています。これはLinux Kernelに仕込まれたメモリ管理を効率化するための仕組みです。 Oracle DB インスタンスで huge pages を使用する > Oracle 用 Amazon RDS は、データベースの拡張性を増大する Linux Kernel の huge pages をサポートします。Huge pages を使用すると、ページのテーブルを小さくし、メモリ管理の CPU 経過時間を減少することで、大規模なデータベースインスタンスのパフォーマンスを向上できます。詳細については、Oracle ドキュメントの「HugePages の概要」を参照してください。 HugePages > HugePages is a feature integrated into the Linux kernel 2.6. Enabling HugePages makes it possible for the operating system to support memory pages greater than the default (usually 4 KB). Using very large page sizes can improve system performance by reducing the amount of system resources required to access page table entries.

一方でHuge Pages機能がデフォルトでONのインスタンスクラス(r4, r5, m5など)ではMEMORY_MAX_TARGET/MEMORY_TARGETが0になりこのパラメータを用いる自動メモリ管理が無効化されます。その代わりに別の仕組み(自動PGA/SGA管理)でメモリ管理が行われるようになり、SGA_TARGET, PGA_AGGREGATE_TARGETの二つのパラメータによりメモリ領域の管理が行われます。 以下、それぞれのRDSにおけるデフォルト値です。

sga_target

IF({DBInstanceClassHugePagesDefault}, {DBInstanceClassMemory*3/4}, 0)

pga_aggregate_target

IF({DBInstanceClassHugePagesDefault}, {DBInstanceClassMemory*1/8}, 0)

SGAとPGAを足しますと {DBInstanceClassMemory<em>3/4} + {DBInstanceClassMemory</em>1/8} となりますためインスタンスのメモリ総量の87.5%がOracleが使用する最大値です。

これにプラスしてOSやRDSとしての監視機構のメモリ使用率が上乗せされますが、多くのワークロードで正常に動作するようにAWSによってチューニングされていますので100%に張り付くのでは?という心配はあまりありません。

気を付けるべきこと

これらの理由によって、RDSで常時80%~90%を超えるようなメモリ利用率でも大きな問題とはならない、というわけです。

むしろその内訳...メモリが適切に利用されているかどうかについて、StatspackやAWRなどを利用してチェックすることがより大事になってきます。

またCloudWatchのメトリクスにSwapUsageがあり、スワップの使用量が分かるようになっていますので、そちらも要監視です。 メモリが足りずSwapに落ちるようなことが頻発していれば、インスタンスタイプの変更を検討したほうがよいということになるでしょう。

杉村 勇馬 (記事一覧)

サーバーワークス → 株式会社G-gen 執行役員CTO

2021 Japan APN Ambassadors / 2021 APN All AWS Certifications Engineers

マルチAWSアカウント管理運用やネットワーク関係のAWSサービスに関するブログ記事を過去に執筆。

2021年09月から株式会社G-genに出向、Google Cloud(GCP)が専門に。G-genでもGoogle Cloud (GCP) の技術ブログを執筆中。