最近、Apache JMeterで負荷テスト用のシナリオを作成をして、Google Cloud Platform(GCP)のCompute Engineを使ってリモート実行することがあったので記事にしておきます。

実行環境

  • MacBook Pro
  • Java Runtime (v8+)
  • JMeter (v5.6)
  • FireFox (v115.0)
  • GCP(Compute Engine)

JMeterでシナリオ作成する

今回はブラウザのリクエストをサンプリングをしてシナリオを作成しようと思います。

JMeterを開き、テスト計画を準備

テスト計画に以下を追加します。

  • テスト計画 > スレッドグループ
  • テスト計画 > スレッドグループ > シンプルコントローラ
  • テスト計画 > スレッドグループ > 統計レポート
  • テスト計画 > スレッドグループ > HTTP リクエスト初期値設定
  • テスト計画 > スレッドグループ > HTTP クッキーマネージャ
  • テスト計画 > HTTP プロキシサーバ

HTTP プロキシサーバの対象となるコントローラは「テスト計画 > スレッドグループ > シンプルコントローラ」に設定します。

HTTP プロキシサーバの「開始」ボタンを押して一度プロキシサーバを起動します。
このとき証明書がapache-jmeter-5.6/bin/ApacheJMeterTemporaryRootCA.crtに作成されます。

FireFoxの設定でプロキシを設定

設定の検索で「プロキシ」と入力してインターネット接続をひらきます。

下記のように設定してOKを押します。

FireFoxの設定で証明書を設定

設定の検索で「証明書」と入力して証明書マネージャーをひらきます。

認証局証明書の「読み込む」ボタンを押します。

プロキシサーバを起動したときに作成された、ApacheJMeterTemporaryRootCA.crtを選択します。

「この認証局によるウェブサイトの識別を信頼する」にチェックをいれてOKを押します。

リクエストのフィルタリング

リクエストのフィルタリングを設定します。
こちらを設定しないと膨大なリクエストがサンプリングされることがあるため最初に設定をおすすめします。

以下の例のようにRequests Filteringタブで「挿入するパターン」「除外するパターン」を設定します。

ブラウザのリクエストを記録する

JMeterプロキシサーバを再度起動しておきます。
FireFoxで記録したいサイトを開き、ログインなど操作をします。

記録が終わったらプロキシサーバ「停止」を押します。

シンプルコントローラに記録されているか確認します。

テスト計画の設定調整

負荷テストのためのスレッドグループの設定

スレッド数はスレッド数 × リモートサーバー数の実行となるので、動かしたい合計スレッド数 ÷ リモートサーバー数で設定します。
ループは一定時間負荷をかけるため無限ループにします。
Ramp-up 期間は定数スループットタイマを使う場合は60秒のようにしたほうが計算しやすいです。今回は10秒としてます。
スケジューラをチェックして持続時間(秒)を負荷をかけたい時間にします。インフラ側の限界を調べる時は30分程実行します。

例:

複数のアカウントをスレッドごとに変えたい場合

CSVファイルを ログインID,ログインパスワード の形式で作成しておきます。
CSV Data Set Configを追加してVariable Namesを設定します。

HTTP リクエストで変数を設定することで複数のアカウントで処理することができます。

これでJMeterのシナリオ作成は終了です。

GCEを使ったシナリオのリモート実行

GCP(Compute Engine)を使ってJMeterのシナリオをリモートで実行してみます。

リモートサーバの構築

負荷テストではたくさんのスレッドを起動するため複数台のリモートサーバを作成して実行することが多いです。

コンソールのCompute Engineから「インスタンスの作成」をします。
設定は何でも良いですが筆者は Ubuntu 22.04 LTS を使うことにします。

SSHで接続して下記コマンドでJMeterをダウンロードして展開します。

$ wget https://dlcdn.apache.org/jmeter/binaries/apache-jmeter-5.6.tgz
$ tar -xzvf apache-jmeter-5.6.tgz
$ apache-jmeter-5.6/bin/jmeter -v
    _    ____   _    ____ _   _ _____       _ __  __ _____ _____ _____ ____
   / \  |  _ \ / \  / ___| | | | ____|     | |  \/  | ____|_   _| ____|  _ \
  / _ \ | |_) / _ \| |   | |_| |  _|    _  | | |\/| |  _|   | | |  _| | |_) |
 / ___ \|  __/ ___ \ |___|  _  | |___  | |_| | |  | | |___  | | | |___|  _ <
/_/   \_\_| /_/   \_\____|_| |_|_____|  \___/|_|  |_|_____| |_| |_____|_| \_\ 5.6

Copyright (c) 1999-2023 The Apache Software Foundation

設定ファイルのapache-jmeter-5.6/bin/jmeter.propertiesを編集します。
テスト用なのでssl証明を無効にします。
server.rmi.ssl.disableがコメントされているので外してtrueとします。
server.rmi.ssl.disable=true

JMeterの下記コマンドでリモートサーバを起動します。

$ apache-jmeter-5.6/bin/jmeter-server
Created remote object: UnicastServerRef2 [liveRef: [endpoint:[XX.XX.XX.XX:XXXXX](local),objID:[XXXXX]]]

リモートサーバのendpointが表示されます。(初期設定だとポートはランダムで変わります)

ローカルからリモートサーバに接続

ローカルのJMeterの設定ファイルapache-jmeter-5.6/bin/jmeter.propertiesを編集します。

テスト用なのでこちらもssl証明を無効にします。
server.rmi.ssl.disableがコメントされているので外してtrueとします。
server.rmi.ssl.disable=true

リモートサーバのendpointのIPアドレスをremote_hostsに設定します。
カンマ区切りで複数のリモートサーバを指定できます。
remote_hosts=XX.XX.XX.XX:XXXXX,XX.XX.XX.XX:XXXXX

ローカルのJMeterを再起動します。
メニューバーの 実行 > 開始(リモート) を選択します。

リモートサーバ側のログが以下のように出力されていたら正常に実行されています。
もし、接続で失敗する場合はGCPのファイアウォール設定を確認してみてください。
また、Cloud NATを使用している場合、デフォルトだと使用できるポート数が64のためポート数を増やす必要があります。

Starting the test on host XX.XX.XX.XX @ 2023 Jul 7 09:59:35 UTC (1688723975546)

これでリモート実行ができました。

クラウドサービスを利用して、リモートサーバを複数起動することで素早く大規模な負荷テストができるので覚えておくといいかもしれませんね。