こんにちは、一年間の研修が終わり、ついに働いています末廣です。
そんな業務の中で RDS for Oracle のメモリ管理について、RDS ならではの制約や注意点があったので、ブログにまとめます。 本題に入る前に、本記事に登場する Oracle のメモリ管理に関する用語を簡単に説明します。
Oracle 関連用語について
SGA(System Global Area)
データベースのプロセス間で共有されるメモリであり、Oracle Database インスタンスに関するデータ、制御情報が含まれます。
PGA(Program Global Area)
データベースのプロセスごとに存在する非共有メモリであり、スタック空間やセッション情報が含まれます。
自動メモリ管理
SGA と PGA 合計の値からデータベースの状態に合わせてそれぞれに自動でメモリの分配が行われる Oracle Database の仕組みです。
HugePages
Linux のメモリ管理方法であり、ページ単位を大きくすることで OS や CPU への負担を下げることができます。Oracle Database では、HugePages により、TLB と呼ばれるキャッシュメモリのヒット率が上がるなど、データベースのパフォーマンスを向上させることができます。 HugePages を使用する場合には、SGA / PGA それぞれに割り当てるメモリ量を決めておく必要があります。
HugePagesと自動メモリ管理には互換性がなく、どちらか片方しか利用することができないものになります。
概要
以上で用語について軽く説明したので、本ブログの概要を改めて記載します。
RDS ではデータベース作成時にデータベースエンジンのデフォルトのパラメータグループ、もしくは事前に作成したパラメータグループを紐付けます。 パラメータグループの一部パラメータを変更することで、Oracle の自動メモリ管理を有効にするのか、HugePages を有効にするのかを選択できます。 しかし、RDS のインスタンスクラスによってデフォルト値が異なります。場合によっては自動メモリ管理のみ選択可能であったり、反対に HugePages のみ選択可能であったりします。
本記事ではパラメーターグループ設定時の制約を確認していきます。
関連パラメータ
こちらのブログを参考に今回はoracle-se2-19
のデフォルトのパラメータグループを取得します。
この中から自動メモリ管理と HugePages に関連するパラメータを抽出します。
行 | ParameterName | ParameterValue | Description | Source | ApplyType | DataType | IsModifiable |
---|---|---|---|---|---|---|---|
206 | memory_max_target | IF({DBInstanceClassHugePagesDefault}, 0, {DBInstanceClassMemory*3/4}) | Max size for Memory Target | system | static | integer | TRUE |
207 | memory_target | IF({DBInstanceClassHugePagesDefault}, 0, {DBInstanceClassMemory*3/4}) | Target size of Oracle SGA and PGA memory | system | dynamic | integer | TRUE |
308 | pga_aggregate_target | IF({DBInstanceClassHugePagesDefault}, {DBInstanceClassMemory*1/8}, 0) | Target size for the aggregate PGA memory consumed by the instance | engine-default | dynamic | integer | TRUE |
371 | sga_target | IF({DBInstanceClassHugePagesDefault}, {DBInstanceClassMemory*3/4}, 0) | Target size of SGA | engine-default | dynamic | integer | TRUE |
431 | use_large_pages | {DBInstanceClassHugePagesDefault} | Use hugepages if available (FALSE, ONLY, or DB Parameter Formula {DBInstanceClassHugePagesDefault}) | engine-default | static | string | TRUE |
※ 行数は目安です。スクリプトの関係で、条件式の区切りが@
で出力されますが、実際の出力である,
に変更しています。
値や条件式の見方
431行目のuse_large_pages
が HugePages の利用を管理するパラメータとなります。値{DBInstanceClassHugePagesDefault}
は、 HugePages がデフォルトで有効であるかどうかを表しており、インスタンスクラスによって値が異なります。use_large_pages
の値を ONLY
や FALSE
に変更することで、HugePages の利用を手動で制御することができます。ONLY
が HugePages 有効、FALSE
が無効です。
このuse_large_pages
のようにApplyType
がstatic
であるパラメータは変更を反映するために再起動が必要です。
しかし、前述の通り、インスタンスクラスによっては自動メモリ管理のみ選択可能であったり、反対に HugePages のみ選択可能であったりするため、場合によっては変更不可となります。後ほど詳しく解説します。
また、以下のようなIF文で構成する式がいくつかあります。
IF({DBInstanceClassHugePagesDefault}, 0, {DBInstanceClassMemory*x/y})
IF文の記述様式は以下の通りです。
IF(<条件式>,<真の場合>,<偽の場合>)
上に例示した式では、「インスタンスクラスの HugePages がデフォルトで有効である場合」は「 0(無効)」、そうでない場合は「データベースのメモリの x/y を使用する」という意味になります。
これらを元にそれぞれのパラメータを見ていきます。
自動メモリ管理のパラメータ(206・207)
memory_target
memory_max_target
は、自動メモリ管理の際に使用するパラメータと、その最大値を示すパラメータです。
条件式より、HugePages が無効な時のみこの値から SGA / PGA に自動でメモリの分配が行われます。デフォルトでは、DBインスタンスのメモリの 3/4 を上限に使用します。
SGA と PGA パラメータ(308・371)
sga_target
pga_aggregate_target
は、SGA / PGA のメモリ割当値です。
条件式より、HugePages が有効な時のみメモリの割当を SGA / PGA それぞれに指定することができます。
また、表には示していませんが、要件によってsga_max_size
/ pga_aggregate_limit
パラメータで 最大値や上限を変更することも可能です。
HugePages の条件
ここでは、上記パラメータを見る時に注意すべき、インスタンスクラスによる HugePages のデフォルト設定のルールや制限について説明し、インスタンスクラスの例と確認方法についてまとめます。
メモリ量による条件の表
RDS for Oracle には HugePages がデフォルトで有効にならないインスタンスクラスが存在するため、以下公式ドキュメントに記載されているインスタンスクラスかそれ以外かを分けて表にしました。
HugePages がデフォルトで有効にならないインスタンスクラス
インスタンスクラスのメモリ | デフォルト値 | デフォルト値からの変更 | |
---|---|---|---|
1 | memory < 14GiB | 自動メモリ管理 | 不可能 |
2 | memory >= 14GiB | 自動メモリ管理 | HugePages に変更可能 |
上記インスタンスクラス以外の場合
インスタンスクラスのメモリ | デフォルト値 | デフォルト値からの変更 | |
---|---|---|---|
3 | memory < 14GiB | 自動メモリ管理 | 不可能 |
4 | 14 GiB <= memory < 100GiB | HugePages | 自動メモリ管理に変更可能 |
5 | memory >= 100GiB | HugePages | 不可能 |
インスタンスクラスの例
以上の条件を踏まえて、インスタンスクラスの例から、HugePages のデフォルトと変更の可否がどうなるか確認していきましょう。 使用するインスタンスタイプのメモリ量は以下ドキュメントにて確認することができます。 aws.amazon.com
db.m4.4xlarge
自動メモリ管理がデフォルトで有効のインスタンスクラスです。 インスタンスのメモリは 64GiB であるため、表の2にあてはまります。
db.r5.2xlarge.tpc1.mem2x
RDS for Oracle のインスタンスクラスにはこのようなメモリのみを増強したタイプが存在するので、HugePages / 自動メモリ管理の条件を確認する時は注意が必要です。
HugePages がデフォルトで有効なインスタンスクラスです。db.r5.2xlargeのメモリは 64GiB であり、メモリが 2倍になるタイプであるため、インスタンスのメモリは128GiB であり、表の5にあてはまります。
終わりに
本記事ではRDS for Oracle のメモリ管理についてまとめました。 オンプレミスや EC2にて稼働しているOracle Database をRDS for Oracle に移行する際、メモリ管理を現状のままで行うことができるかの判断をする際に役立てば幸いです。
末廣 満希(執筆記事の一覧)
2022年新卒入社です。ここに何かかっこいい一言を書くことができるエンジニアになれるように頑張ります。