※Oracle Multitenantの概要は「連載:徹底解説!Oracle Database 12cのすべて」の中で解説していますので、併せてご参照ください。
マルチテナントのリソース制御はどこまでできる?
Oracle Multitenantはインスタンスやバックグラウンド・プロセスを共有しながらデータベース層でマルチテナントを実現する機能です。クラウドやデータベースの統合において集約率を高める効果が期待されますが、リソース制御というマルチテナントならではの考慮が必要になります。
例えば同じサーバ内でA社、B社、C社のデータベースがそれぞれ稼働している場合、A社が負荷の高い処理を実行するとB社とC社にも影響が出てしまいます。このような状況を防ぐためにCPUやメモリ、I/Oといったリソースの上限を設けたり、あるいはデータベースの重要度に合わせて優劣をつけるなどの設定が必要になります。Oracle Multitenantがどのようなリソース制御に対応しているのか、また運用に合わせてどの程度柔軟に調整できるのかを理解しておかなければ、活用シーンは見えてこないでしょう。
結論から言うと、Oracle Multitenantの機能として実装されているリソース制御は「CPU」、「I/O(Oracle Exadata Database Machineのみ)」、「パラレル実行」の3つです。メモリについてはインスタンスを共有して集約率を高めるという仕組みを採用しているため、プラガブル・データベース(PDB)単位での割り当て制御はできません。重要度の高いPDBとそうでないPDBで使用できるメモリ量に差をつけたい場合、コンテナ・データベース(CDB)を分ける必要があります。
CPUについてはPDB単位とCDB単位の両方で制御することができ、PDB単位で制御する場合には以下のように「share」と呼ばれる比率を設定します。考え方は非常にシンプルで、例えばshareが1に設定されているPDBと2に設定されているPDBがある場合、CPU使用率が1:2の比率で調整されます。もし運用中にPDBが追加されたとしても、shareの設定値に基づいて比率が再計算されるため、ユーザがその都度設定を変更する必要はありません。
CPU制御の裏側では何が起きている?
このように分かりやすい仕組みで実装されているPDB単位のCPU制御ですが、気になるのはその正確性と即効性です。ソフトウェアの機能で制御しており、ハードウェア面で物理的な制限をかけているわけではないので、こちらの意図どおりにCPUが制御されるかは十分な検証が必要です。また、Oracle Multitenantでは運用中にPDBの追加や削除が発生するため、その場合に速やかな制御が行われるかも気になるところです。
そこで実際にPDB単位のCPU制御を行ってみた結果が以下のグラフです。CPUバウンドのプログラム(CPUを大量に使用するプログラム)を実行し、PDB2とPDB3をオンラインで追加した際のCPU使用率を色分けしています。PDBが増えると多少ぶれ幅が出てくるものの、ほぼshareの設定どおりにCPUを制御できています。PDBを追加した際も即時に設定が有効化されており、即効性にも優れていることが分かります。
PDB単位のCPU制御は、Oracle Database Resource Managerにより行われており、この時の待機イベントを確認すると「resmgr:cpu quantum」が大量に発生しています。これはデータベースの内部実行キューによってCPU使用率を調整中であるという動作を意味するもので、サーバで有効になっているコア数(今回の検証環境では24)を超えたセッションを待機させています。
動作としてはOSのスケジューラによく似ており、一定の短い時間(100msec)だけプロセスを実行して待機状態にし、別の実行可能なプロセスを選択して実行するという処理を繰り返します。ラウンドロビンのアルゴリズムを採用しているため、特定のプロセスだけが長時間待機してしまうことはありません。また、ロック待ちやI/O待ちが検出されるとすぐに別のプロセスが選択されるため、不要な待機は発生しないようになっています。シンプルでありながら無駄のないCPU制御ができる仕組みと言えます。