Spanner のベンチマークツール machmeter を徹底解説! ~ 導入から負荷テスト、スケールまで ~
Spanner のベンチマークツール machmeter を徹底解説! ~ 導入から負荷テスト、スケールまで ~
この記事では、Spannerのパフォーマンスを簡単に評価できるツール machmeter を使い、負荷テストの方法を解説します。
Spanner は、Google Cloud が提供する、大規模スケールに対応した NewSQL データベースです。その圧倒的なスケーラビリティと可用性から、ミッションクリティカルなシステムに採用されています。
しかし、Spanner のスケールを試そうと思っても、実際に負荷をかけた状態での挙動を確認するのは、なかなか大変な作業です。負荷生成環境の構築や、データの準備など、多くの手間と時間がかかってしまいます。
そこで、本記事では、Spanner のベンチマークを簡単に行うことができるツール machmeter をご紹介します。machmeter を利用することで、Spanner に負荷をかけ、その動作を様々な観点から確認することができます。Spanner の導入を検討している方、既に利用している方も、machmeter を活用して Spanner の理解を深めていきましょう。
machmeter とは?
machmeter は、Spanner の負荷テストを簡単に行うことができるオープンソースのツールです。
主な特徴は以下の通りです。
- 簡単な導入: Terraform (Infrastructure as Code を実現するツール) による環境構築から、JMeter (負荷テストツール) の実行、クリーンアップまでツール内で対応出来、容易に導入できます。
- 多様な負荷パターン: read/write、transaction など、様々な負荷パターンを生成できます。
- ユースケースの提供: 金融や e コマースなど、ユースケースに基づいたプロファイルが用意されています。
machmeter を利用することで、以下のようなメリットがあります。
- Spanner の性能特性を理解できる: 負荷テストを通じて、Spanner のスケールの挙動などを把握できます。
- モニタリング環境の構築と検証: 負荷をかけた状態でのモニタリングやアラートの設定を確認できます。
初期導入から実行までのシンプルな手順
それでは、machmeter を実際に使ってみましょう。ここでは、最もシンプルな手順で負荷テストを実行する例を紹介します。
事前準備
- Google Cloud プロジェクト: Machmeter を実行する Google Cloud プロジェクト
-
実行インスタンス
- machmeter の管理処理を実行するインスタンス
- Cloud Shell からの実行も可能ですが、長時間処理を実行したり、JMeter ダイアログを利用することから 先日ご案内した X 環境 の利用がおすすめ
- アクセス スコープは「すべての Cloud APIs に完全アクセス権を許可」に設定
- Google アカウント: プロジェクトへ Owner 権限を持つアカウント
参考)
初期導入 (以下の処理は、事前に準備した実行インスタンス上で実行します。
環境は GCE (Debian) インスタンスを前提としています。
-
事前要件パッケージの導入と、gcloud 認証の設定
# 事前要件パッケージの導入 (JDK, terraform, kubectl は machmeter とともに導入されます) sudo apt-get update sudo apt-get install git maven google-cloud-sdk-gke-gcloud-auth-plugin # Google アカウント認証とプロジェクトの選択 (オプション) gcloud auto login gcloud config set project <PROJECT名>
-
machmeter のインストール
git clone https://github.com/cloudspannerecosystem/machmeter.git cd machmeter/ ./install.sh cd machmeter/ mvn clean package -P assembly
- 最後に "BUILD SUCCESS" と出てくれば、正常完了
参考)
インフラ セットアップとデータロード (- インフラ構成 JSON ファイルの作成
cd ~/machmeter/machmeter
cp usecases/finance/ledger/sample-configs/setup.json .
- JSON ファイルの調整
- setup.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
- infraConfig.spannerInstanceConfig.projectId
- jMeterParams.spannerInstanceConfig.projectId
- setup.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
- インフラ環境構築
- インフラのセットアップを実行すると、Terraform と DDL スクリプトによる構成処理が開始します。(完了まで 10 分程度かかるため、セッションが切れないように注意)
# GKE, Spanner API の有効化
gcloud services enable container.googleapis.com
gcloud services enable spanner.googleapis.com
# インフラセットアップ
java -jar target/machmeter/machmeter.jar setup setup.json
- 最後に "INFO: Plugin ddlPlugin completed." と出てくれば、正常完了
- 初期データロード構成 JSON ファイルの作成
-
Data Load JSON テンプレート の複製
cp usecases/finance/ledger/sample-configs/data-load.json .
- JSON ファイルの調整
- data-load.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
- jMeterParams.project
- data-load.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
- 初期データロード
- Jmeter Slaves が全て READY 状態 (2/2 や 4/4) となるまで、待ちます。
kubectl get statefulsets -n spanner-test
NAME READY AGE
jmeter-slaves 2/2 26h
- Spanner への初期データロードを実行します
java -jar target/machmeter/machmeter.jar execute data-load.json
- 最後に "INFO: Plugin execute-plugin completed." と出てくれば、正常完了
参考)
ベンチマーク実行 (- ベンチマーク構成 JSON ファイルの作成
cp usecases/finance/ledger/sample-configs/perf-test.json .
- JSON ファイルの調整
- perf-test.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
- jMeterParams.project
- perf-test.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
- ベンチマークの実行
- Jmeter Slaves が全て READY 状態 (2/2 や 4/4) となるまで、待ちます。
kubectl get statefulsets -n spanner-test
NAME READY AGE
jmeter-slaves 2/2 26h
- Spanner へのベンチマークを実行します
java -jar target/machmeter/machmeter.jar execute perf-test.json
- プロセスを Ctrl+C で停止するまで、ベンチマークは継続します
- 実行状況のモニター
- Grafana ダッシュボードから、machmeter のスループットやレイテンシをモニタリングが可能です。
- ポート転送を設定します。
kubectl port-forward -n spanner-test $(kubectl get po -n spanner-test | grep jmeter-grafana | awk '{print $1}') 3001:3000
-
http://localhost:3001 から Grafana へアクセスします。
-
Spanner の負荷状況については、Cloud Monitoring を使用 します。
参考)
ベンチマーク処理のスケール (- ベンチマーク処理のスケールさせるためには、主に下記のボトルネックを順に解消して対応します。
-
Jmeter スレーブ数
- GKE, Spanner ともに負荷に余裕がある場合には、同時実行ユーザー数を増加させます。
- 同時実行ユーザー数はスレーブ数とスレッド数で決まります。スレーブ数を増加させることで、同時実行ユーザー数を増やします
- Default: 2 slaves x 50 threads = 100 users
- Jmeter スレーブ数 は下記コマンドで調整します。
# スレーブ数を 4 へ調整する場合 kubectl -n spanner-test scale statefulsets jmeter-slaves --replicas=4 # スレーブ数の増加を確認 kubectl get statefulsets -n spanner-test NAME READY AGE jmeter-slaves 4/4 26h
-
Jmeter スレーブ数
環境の削除手順
- 負荷テストが完了したら、不要になったリソースを削除しましょう。
java -jar target/machmeter/machmeter.jar cleanup setup.json
- GKE クラスタの削除に失敗して中断するケースがあるので、その場合は手動で クラスタを削除 してから、改めて上記のコマンドを実行します。
シナリオの選択
- 今回の Blog では、Finalcial Ledger テンプレートを利用したベンチマークをご紹介しました。
- usecases ディレクトリの配下には、下記のような様々なシナリオが準備されています。用途に応じて、シナリオを試してみましょう。
- app/ticketing-system: チケット販売システムを模したシナリオです。
- bio/genes: 遺伝子データ処理を模したシナリオです。
- education/learning-management-system: 学習管理システムを模したシナリオです。
- entertainment/movies-database: 映画データベースを模したシナリオです。
- finance/ledger: 金融取引の記録を模したシナリオです。
- finance/profile: 金融プロファイル管理を模したシナリオです。
- finance/stock-trading: 株取引システムを模したシナリオです。
- gaming/online-matchmaking: オンラインゲームのマッチメイキングを模したシナリオです。
- messaging: メッセージングシステムを模したシナリオです。
- shopping/cart: ショッピングカートを模したシナリオです。
- sports/basketball: バスケットボールの試合データを模したシナリオです。
- JMeter に慣れている方であれば、ご自身の カスタム ユースケース を作成して試してもよいでしょう。
まとめ
本記事では、Spanner のベンチマークツール machmeter の概要、利用するメリット、初期導入から実行、スケール、削除までの手順を紹介しました。machmeter を活用することで、Spanner の性能をより深く理解し、アプリケーションの最適化に役立てることができます。
ぜひ、machmeter を使って、Spanner のポテンシャルを最大限に引き出してください!
Discussion