Oracle Dynamic Scaling Engine利用によるコスト削減事例

はじめに

こんにちは。インフラ基盤統括部 プラットフォームグループの松原です。
プラットフォームグループでは、基幹データベースのコスト・パフォーマンス改善に取り組んでいます。
パーソルキャリアの基幹データベースは、Oracle Cloud Infrastracutre(OCI)上で、高性能データベースであるExadata Database Service on Dedicated Infrastracutre(ExaDB-D)を採用しています。
ここではOracle Dynamic Scaling Engineで利用して、ExaDB-Dのコストを削減した事例を紹介します。

ExaDB-D

ExaDB-Dは通常のOracleデータベースより高いパフォーマンスを発揮するデータベースです。
パブリック・クラウド上で利用できるサービスでありながら、専用のインフラストラクチャを利用できるのが特徴です。
基本の価格体系がCPU数+インフラストラクチャになっており、CPU数を変更することにより、柔軟にコストを調整できます。
CPU数は「オンライン」で、コンソール、APIを利用して、既存のワークロードに影響を与えずに変更することが可能です。

課題

ExaDB-Dの高いパフォーマンスを利用して、基幹システムを稼働していましたが、柔軟な価格体系のメリットを十分に活用できてはいませんでした。

一週間(月~日)のExaDB-Dの負荷とCPU数は下記のようになっています。

はっきりとわかるように、まず週末で負荷に対して、CPU数が余剰になっています。余剰になっている分は無駄なコストになっているといえます。

CPU数はオンラインで変更できるので、曜日・時間指定でCPU数を変更するバッチをしこんで、週末はCPU数を減らすようにしました。

かなり減らすことができました。しかし、まだ減らせそうです。

なぜもっと減らせないのか?まだ課題として、以下を抱えていました。

  • 曜日・時間指定なので、安全を重視したCPU数、時間指定になっている。この時間帯にもし突発的な負荷が発生した場合のリスクがある。
  • 安全を重視するので、平日夜間のCPU数は調整できていない。
  • 祝日など週末同様に負荷が低い日があるが、曜日・時間指定では対応できない。

平日日中帯のCPU数の運用にも課題がありました。
負荷に合わせて、1ケ月に一度CPU数を見直す運用をしていましたが、1月の間でも上旬、中旬、下旬で負荷の傾向が異なる、一律負荷に合わせたCPU数に固定することに苦慮していました。

Oracle Dynamic Scaling Engine

課題に対してやることは明確で、「ExaDB-Dの負荷(OS load average)を見て、動的にCPU数を調整する仕組みをつくる。」でした。

実際に1から仕組みを作るのは大変ですが、Oracleが動的なCPUスケーリングツールとして、Dynamic Scaling Engineを提供しています。 OracleサポートサイトからRPMパッケージをダウンロードして、インストールするだけで簡単に導入できます。

rpm -i dynamicscaling-2.0.1-29.el7.x86_64.rpm

構成を考える

Oracle Dynamic Scaling Engineを利用するにあたり、構成のパターンがいくつかあります。 ExaDB-D本体にOracle Dynamic Scaling Engineをインストールすることも検討しましたが、ExaDB-D本体への影響を最小化する目的で、ExaDB-Dと別のインスタンスにOracle Dynamic Scaling Engineをインストールして、負荷測定、CPUスケーリングはリモートから行う構成にしました。

OCI CLIを利用することで、リモートからでもCPU数スケーリングを行うことができます。

また便利なことに、リモートからExaDB-Dの負荷を計測するプラグインも、別途Oracleから提供されています。 こちらもRPMパッケージをインストールするだけで導入できます。

rpm -i dynamicscaling-plugin-1.0.1-11.el7.x86_64.rpm

実行してみる。

リモートでExaDB-Dの負荷を計測するプラグインを実行してみます。負荷が100~0の間の値で返ってきます。 ExaDB-Dは複数ノード上で動作しているので、複数のうち、負荷が高い方のノードの負荷を取得するように、loadtypeパラメータはmaxを指定します。平均値を取得する設定もできるので、DBのワークロード特性で調整することができます。

/opt/dynamicscaling-plugin/dynamicscaling-plugin.bin \
--ocicli \
--ociprofile XXXXXXXX \
--cloud-vm-cluster-id ocid1.cloudvmcluster.oc1.xxxxxxxxxxxxxxxxxxxxxxxxx \
--opcsshkey /root/.ssh/xxxxxxxxxxx \
--ip-type private \
--loadtype max \
--nosilent

成功すれば、標準出力に下記のように出力されます。

SUCCESS: 2023-06-20 15:57:30: Cluster max load is 52

指定したパラメータは別途設定ファイルに記載することで、実行時は省略できます。

プラグインが実行できたら、Dynamic Scaling Engine本体を起動します。 pluginのパラメータに動作確認したプラグインのファイルを設定します。

/opt/dynamicscaling/dynamicscaling.bin \
--ocicli \
--cloud-vm-cluster-id ocid1.cloudvmcluster.oc1.xxxxxxxxxxxxxxxxxxxxxxxxx \
--ociprofile XXXXXXXX \
--interval 600 \
--maxthreshold 90 \
--minthreshold 60 \
--maxocpu 100 \
--minocpu 40 \
--ocpuup 20
--ocpudown 10
--shape Exadata.X8M \
--plugin /opt/dynamicscaling-plugin/dynamicscaling-plugin_wrapper.sh

これで対象のExaDBの負荷を計測して、自動でCPU数をスケールするようになります。すごく簡単です。
(実際に本番運用するときは、systemdでサービス登録して利用しています。)

仕様とパラメータ

起動するのは簡単ですが、本番運用前に、実際にエラーが発生しないか、パラメータが期待通りに動くか、検証環境で確認します。

Dynamic Scaling Engineの機能は主に下記のとおりです。パラメータを変えて、機能通りに動くか検証していきます。

  • CPU負荷によるCPUスケーリングの自動実行
    • CPU負荷に対する上限および下限の閾値、監視間隔を定義(maxthreshold, minthreshold, interval)
    • 設定する最小または最大CPU数まで負荷に応じて自動的に増減(maxocpu, minocpu)
    • スケールアップ、スケールダウンするときのCPU数幅を定義(ocpuup, ocpudown)
    • スケールダウン遅延。負荷が低下したときにスケールアップ後から2時間はスケールダウンしない。
      (スケールアップ、スケールダウンの操作が頻繁に行わるのは好ましくありません。そのため、一度スケールアップした後は、2時間はスケールダウンしない仕組みが採用されています。 この2時間という時間は変更できません。)
  • スケジュールによるCPUスケーリングの自動実行
    • 曜日と時間を指定
    • 指定しない時間はCPU負荷によるCPUスケーリングの自動実行

パラメータが期待通りに動くことを確認できたら、パラメータの値を検討します。
本番相当のワークロードを検証環境で再現するのは難しいので、机上で計算をしました。

AWRデータのビューであるDBA_HIST_SYSMETRIC_SUMMARYからOS Loadの平均、標準偏差を参照できるので、そのデータを活用します。
どのパラメータでどの程度コスト削減できるかExcelでシュミレーションします。

安全にパラメータを指定しても、だいたい15%はCPUコスト削減できそうな見込みがわかったので、試算したパラメータで本番運用をしていきます。

本番導入結果

ある1日のCPU数とLoad Averageの状態です。

本番運用した結果、試算したパラメータで想定していたコスト削減効果が得られました。 CPU数も負荷に則して、無駄なくCPU数を減らすことができています。
CPU数を減らすだけでなく、負荷が高いときは通常よりCPU数を増やすこともできるので、負荷を見て、CPU数を手動で調整する運用から解放されました。

本番運用でわかった課題

負荷による自動スケーリングでの一般的な課題ですが、突発的な負荷上昇にスケール機能が対応できるかというリスクがあります。 特に始業開始時間近辺は、データベースの負荷が急に上昇することがあるので、スケールアップが間に合っているか、常に状況を確認しています。

現状では、時間起動のバッチで、CPU数を指定した値まで引き上げる運用をしています。

Dynamic Scaling Engineにはスケジュール指定で、例えば平日8時台は、CPU数を指定した値に固定するという機能もあります。 しかし固定にしている時間は、自動スケーリングがOFFになり、もしその時間帯に負荷が上昇した場合のリスクがあるので、スケジュール指定の機能は採用しませんでした。

特定時間帯に想定される負荷上昇に対して、うまくウォーミングするのが今後の課題になっています。

まとめ

負荷に対するCPU数の自動スケーリング機能を1から作りこむと、エラー処理の検討など、それなりに手間がかかかります。 Dynamic Scaling Engineを利用すれば、インストールして、あとはパラメータを調整するだけで、簡単に導入できます。

導入した後は、CPU数をスケジュール時間指定で決め打ちで調整するよりも、負荷が高くなれば自動でスケーリングしてくれるので、安心感も高いです。

Dynamic Scaling Engineは、他社で本番運用している事例を聞けず、期待通りに動くか検証に時間をかけましたが、検証でも本番運用でも問題なく稼働することができています。

ExaDB-Dを使用しているのであれば、ぜひ試してみてください。

松原 諭 Satoshi Matsubara

インフラ基盤統括部 システム共通BITA部 プラットフォームグループ リードエンジニア

2023年1月にパーソルキャリアに中途入社。プラットフォームグループのDB担当として、基幹ExaDBの改善、安定化に従事。

※2024年1月現在の情報です。