RDS for Oracleでインスタンスクラス変更時に気をつけておくこと(初期化パラメータ)

# はじめに

パブクラ上のOracle Databaseの[デフォルト初期化パラメータについての記事](https://qiita.com/asahide/items/cbd704527c8cf22803af)の中でRDS for Oracleのデフォルト初期化パラメータについても言及しました。
RDSでは[パラメータグループ](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.html)を利用するので、パラメータグループを予め設定しておけば予期せぬ変更は避けられます。

ただ、インスタンスクラスを変更する時に、パラメータグループの設定においてデフォルトで利用しているパラメータをそのままサイズアップして利用すると非効率になる場合があるので、その点について記載します。
なお、インスタンスクラス変更時の帯域変更等の影響についてはここでは述べません。

# インスタンスクラス変更時に変わる初期化パラメータ

インスタンスクラスを変更すると、主としてVCPU数、メモリサイズが変更されます。
そのため、デフォルトではCPU_COUNT, PROCESSES等のVCPU数に関連があるパラメータと、SGA等のメモリ関連のパラメータが変更されます。

例として、t3.small → r5.4xlarge を行った時の初期化パラメータの変更点を下記します(19c、SE2)。
CPU数やメモリサイズ変更に伴う変更以外に、 **use_large_pages**がFALSEからONLYになっていることが確認できます。


| パラメータ | t3.small<br>2VCPU<br>2GiB | r5.4xlarge<br>16VCPU<br>128GiB |
| :---: | :---: | :---: |
| processes | 185 | 13520 |
| sessions | 300 | 20304 |
| cpu_count  | 2 | 16 |
| sga_max_size | 1375731712 | 100126425088 |
| use_large_pages | **FALSE**     | **ONLY** |
| shared_pool_reserved_size | 10905190 | 550292684 |
| pga_aggregate_limit  | 2147483648| 42530242560 |
| sga_target  | **0** | **100126425088** |
| memory_target    | **1375731712** | **0** |
| memory_max_target   | **1375731712** | **0** |
| db_writer_processes     | 1 | 2 |
| log_buffer      | 7536640 | 237830144 |
| dml_locks    | 1320 | 89336 |
| transactions   | 330 | 22334 |
| pga_aggregate_target         | **0** | **16679101440** |

ちなみにパラメータグループはコンソール上で比較することができて、地味に便利です。
マニュアル： [DB パラメータグループを比較する](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/USER_WorkingWithParamGroups.Comparing.html)


#### use_large_pages (HugePages)

インスタンスクラスの変更に伴い、**use_large_pages**がFALSEからONLYに変更されています。
[**use_large_pages**](https://docs.oracle.com/cd/F19136_01/refrn/USE_LARGE_PAGES.html)はHugePagesという機能の利用を制御するパラメータです。
HugePagesを利用すると、多くのメモリを利用する場合にはデータベースのメモリ管理が効率化され、パフォーマンス向上が期待できます。

- [Oracle DB インスタンスの HugePages の有効化](https://docs.aws.amazon.com/ja_jp/AmazonRDS/latest/UserGuide/Appendix.Oracle.CommonDBATasks.Misc.html#Oracle.Concepts.HugePages)

昨今はオンプレでOracle Databaseを構築する場合もメモリをたくさん積んでいることが多いので、HugePagesを設定している場合が多いと思います。そのため、有効化することでインスタンスのメモリ利用の効率化が期待できます。インスタンスクラスの変更を行う場合には、気にしておくと良いポイントと思います。

上記のマニュアルにも記載がありますが、以下のインスタンスクラスの場合にはデフォルトでHugePagesがオフの設定になっています。（DB インスタンスクラスのメモリが 14 GiB 以上であれば、これらの DB インスタンスクラスでも HugePages を手動で有効化が可能です）

| インスタンスクラス | HugePages がデフォルトで有効になっていない DB インスタンスクラス| 
| :---: | :---| 
| db.m5 | db.m5.large | 
| db.m4 | db.m4.large、**db.m4.xlarge**、**db.m4.2xlarge**、**db.m4.4xlarge**、_**db.m4.10xlarge**_ | 
| db.t3  | db.t3.micro、db.t3.small、db.t3.medium、db.t3.large | 

※**太字**は14GiBより大きなメモリを持つ、_斜字_ はSE2では利用できないクラス

ちなみにHugePagesを利用するとAMM(自動メモリ管理)の機能が利用できません(MEMORY_TARGET、MEMORY_MAX_SIZE)。

# まとめ

インスタンスクラス変更時に自身でパラメータグループを設定している場合、単純にパラメータの値だけ増やしたりすると、HugePagesの機能がオフになったままとなり、効率的にDBが運用できないこともありますので、CPU数やメモリサイズにあわせて適切な設計を予めしておきましょう。


なお、Oracle Database利用時のHugePagesについての説明はこちらのマニュアル [HugePagesの概要](https://docs.oracle.com/cd/F19136_01/unxar/administering-oracle-database-on-linux.html#GUID-CC72CEDC-58AA-4065-AC7D-FD4735E14416) に記載があります。
制限とかも記載がありますが、RDSで利用する場合にはAMM(自動メモリ管理)が利用できない、という点くらいしか関係ないハズです。