RDS for Oracle のメモリ管理方法の注意点と確認方法

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

こんにちは、一年間の研修が終わり、ついに働いています末廣です。

そんな業務の中で RDS for Oracle のメモリ管理について、RDS ならではの制約や注意点があったので、ブログにまとめます。 本題に入る前に、本記事に登場する Oracle のメモリ管理に関する用語を簡単に説明します。

Oracle 関連用語について

SGA(System Global Area)

データベースのプロセス間で共有されるメモリであり、Oracle Database インスタンスに関するデータ、制御情報が含まれます。

PGA(Program Global Area)

データベースのプロセスごとに存在する非共有メモリであり、スタック空間やセッション情報が含まれます。

自動メモリ管理

SGA と PGA 合計の値からデータベースの状態に合わせてそれぞれに自動でメモリの分配が行われる Oracle Database の仕組みです。

docs.oracle.com

HugePages

Linux のメモリ管理方法であり、ページ単位を大きくすることで OS や CPU への負担を下げることができます。Oracle Database では、HugePages により、TLB と呼ばれるキャッシュメモリのヒット率が上がるなど、データベースのパフォーマンスを向上させることができます。 HugePages を使用する場合には、SGA / PGA それぞれに割り当てるメモリ量を決めておく必要があります。

docs.oracle.com

HugePagesと自動メモリ管理には互換性がなく、どちらか片方しか利用することができないものになります。

概要

以上で用語について軽く説明したので、本ブログの概要を改めて記載します。

RDS ではデータベース作成時にデータベースエンジンのデフォルトのパラメータグループ、もしくは事前に作成したパラメータグループを紐付けます。 パラメータグループの一部パラメータを変更することで、Oracle の自動メモリ管理を有効にするのか、HugePages を有効にするのかを選択できます。 しかし、RDS のインスタンスクラスによってデフォルト値が異なります。場合によっては自動メモリ管理のみ選択可能であったり、反対に HugePages のみ選択可能であったりします。

本記事ではパラメーターグループ設定時の制約を確認していきます。

関連パラメータ

こちらのブログを参考に今回はoracle-se2-19のデフォルトのパラメータグループを取得します。

blog.serverworks.co.jp

この中から自動メモリ管理と 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 の値を ONLYFALSE に変更することで、HugePages の利用を手動で制御することができます。ONLY が HugePages 有効、FALSE が無効です。 このuse_large_pagesのようにApplyTypestaticであるパラメータは変更を反映するために再起動が必要です。

しかし、前述の通り、インスタンスクラスによっては自動メモリ管理のみ選択可能であったり、反対に 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 のデフォルト設定のルールや制限について説明し、インスタンスクラスの例と確認方法についてまとめます。

docs.aws.amazon.com

メモリ量による条件の表

RDS for Oracle には HugePages がデフォルトで有効にならないインスタンスクラスが存在するため、以下公式ドキュメントに記載されているインスタンスクラスかそれ以外かを分けて表にしました。

公式ドキュメントより、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 / 自動メモリ管理の条件を確認する時は注意が必要です。

docs.aws.amazon.com

HugePages がデフォルトで有効なインスタンスクラスです。db.r5.2xlargeのメモリは 64GiB であり、メモリが 2倍になるタイプであるため、インスタンスのメモリは128GiB であり、表の5にあてはまります。

終わりに

本記事ではRDS for Oracle のメモリ管理についてまとめました。 オンプレミスや EC2にて稼働しているOracle Database をRDS for Oracle に移行する際、メモリ管理を現状のままで行うことができるかの判断をする際に役立てば幸いです。

末廣 満希(執筆記事の一覧)

2022年新卒入社です。ここに何かかっこいい一言を書くことができるエンジニアになれるように頑張ります。