🚄

Spanner のベンチマークツール machmeter を徹底解説! ~ 導入から負荷テスト、スケールまで ~

2024/12/24に公開

Spanner のベンチマークツール machmeter を徹底解説! ~ 導入から負荷テスト、スケールまで ~

この記事では、Spannerのパフォーマンスを簡単に評価できるツール machmeter を使い、負荷テストの方法を解説します。

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) インスタンスを前提としています。

  1. 事前要件パッケージの導入と、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名>
    
  2. machmeter のインストール
    git clone https://github.com/cloudspannerecosystem/machmeter.git
    cd machmeter/
    ./install.sh
    cd machmeter/
    mvn clean package -P assembly
    
    • 最後に "BUILD SUCCESS" と出てくれば、正常完了

インフラ セットアップとデータロード (参考)

  1. インフラ構成 JSON ファイルの作成
cd ~/machmeter/machmeter
cp usecases/finance/ledger/sample-configs/setup.json .
  • JSON ファイルの調整
    • setup.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
      • infraConfig.spannerInstanceConfig.projectId
      • jMeterParams.spannerInstanceConfig.projectId
  1. インフラ環境構築
  • インフラのセットアップを実行すると、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." と出てくれば、正常完了
  1. 初期データロード構成 JSON ファイルの作成
  • Data Load JSON テンプレート の複製
    cp usecases/finance/ledger/sample-configs/data-load.json .
    
  • JSON ファイルの調整
    • data-load.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
      • jMeterParams.project
  1. 初期データロード
  • 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." と出てくれば、正常完了

ベンチマーク実行 (参考)

  1. ベンチマーク構成 JSON ファイルの作成
cp usecases/finance/ledger/sample-configs/perf-test.json .
  • JSON ファイルの調整
    • perf-test.json ファイルについて、下記のプロジェクト ID の項目を今回利用するプロジェクトの ID で更新します。(その他項目も必要に応じて)
      • jMeterParams.project
  1. ベンチマークの実行
  • 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 で停止するまで、ベンチマークは継続します
  1. 実行状況のモニター
  • Grafana ダッシュボードから、machmeter のスループットやレイテンシをモニタリングが可能です。
  • ポート転送を設定します。
kubectl port-forward -n spanner-test $(kubectl get po -n spanner-test | grep jmeter-grafana | awk '{print $1}') 3001:3000

ベンチマーク処理のスケール (参考)

  • ベンチマーク処理のスケールさせるためには、主に下記のボトルネックを順に解消して対応します。
    • 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
    
    • GKEノード数
      • GKE の CPU 使用率が 100% に近くなっている場合には、GKE クラスタの処理能力がボトルネックとなっています。
      • GKE クラスタ ノードプールの サイズを変更 することで調整します。
    • Spanner ノード数
      • Spanner の CPU 使用率が 100% に近くなっている場合には、Spanner インスタンスの処理能力がボトルネックとなっています。
      • Spanner インスタンスの ノード数を変更 することで調整します。

環境の削除手順

  • 負荷テストが完了したら、不要になったリソースを削除しましょう。
    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 のポテンシャルを最大限に引き出してください!

参考資料

Google Cloud Japan

Discussion