nana開発者ブログ

音楽SNSアプリ"nana"開発チームのブログです。

JMeterを使った負荷検証入門

はじめまして。
開発チームでサーバーサイドエンジニアをしている田中です。
 
今回は、JMeterを使用した負荷検証についてお話したいと思います。
主に導入〜基本操作のご紹介となりますが、これからJMeterを用いて負荷検証を行う方の参考になれば、幸いです。
 

負荷検証を行なった背景

先日リリースされたとあるプロジェクトで、アクセス数が多いフィードへの機能追加がありました。

現状のフィードへのアクセス数や追加する機能の仕様を考慮すると、負荷が高くなることが想定されたため、リリース前の負荷検証が必要と判断しました。

今回のプロジェクトでは、特にレスポンスタイムに着目して検証を行いました。

負荷検証を行うツールとして今回はJMeterを使用しています。

JMeterとは

Apacheソフトウェア財団にて開発されているソフトウェアで、クライアントサーバシステムのパフォーマンス測定および負荷テストを行うJavaアプリケーションです。
サーバーに対して指定した量のリクエストを投げ、負荷をかけることでパフォーマンス計測を行うことができます。
テストシナリオはGUIインターフェースを使って作成することができます。
 
負荷検証ツールは他にも色々とあるので、用途に合わせて使いやすいツールを選択すると良いと思います。
Apache Bench:WEBサーバの性能を計測するコマンドラインツール。
Gatling:Scalaでシナリオを記述できるツールです。
Locust :Pythonでシナリオを記述できるツールです。

インストール・起動

Apacheのオフィシャルサイトからダウンロードできます。
 
JMeterを起動すると、以下のようなウィンドウが開きます。
メニューから Options → Choose Language → Japanese を選択し日本語化しておくと良いです。
f:id:nanamusic-tech:20210823114708p:plain

基本的な設定 

①スレッドグループを追加

f:id:nanamusic-tech:20210823144302p:plain

スレッドグループに以下を設定します。 
  1. スレッド数:アクセスするユーザー数
  2. Ramp-Up期間(秒):スレッドを何秒間の間に処理するか
  3. ループ回数:繰り返す回数
例えば以下の設定だと、1分間に10ユーザーのリクエストを処理する。それを10回繰り返すことになります。  

f:id:nanamusic-tech:20210823161911p:plain

②スレッドグループにHTTPリクエストを追加
テスト対象のリクエスト分、HTTPリクエストを追加します。

f:id:nanamusic-tech:20210823144441p:plain

HTTPリクエストには、以下など必要な項目を設定します。 
  1. プロトコル
  2. サーバーまたはIP
  3. メソッド
  4. パス
ここまでで、基本的な設定は完了です。これでテストは動く状態となっていると思います。 

詳細な設定

ここからは、より詳細な設定についてです。今回行いたい検証に沿って、必要な設定を追加します。 

今回検証したい内容は、以下でした。

  • 複数のユーザーからAPIリクエストを送りたい。
  • テスト対象のAPIは二つ。一つ目のAPIのレスポンスの値を、二つ目のAPIのパスパラメータとして使用したい。

上記を実現するため、以下の設定を行いました。

①USERの設定

     1. ユーザーパラメーターを追加します。

f:id:nanamusic-tech:20210823162623p:plain

     2.ユーザーパラメーターにユーザーと変数を必要なだけ、追加します。

f:id:nanamusic-tech:20210907191339p:plain

  • 名前:変数名
  • ユーザー_1, ユーザー_2 ...:ユーザー毎に変数に代入したい値 
   3. ユーザー毎に定義した変数を使用する側の設定をします。今回はヘッダーで変数を使用します。変数は${value}で利用できます。

f:id:nanamusic-tech:20210907191437p:plain

  • 名前:ヘッダー名
  • 値:${value} (valueは設定した変数名)
これでユーザー毎の設定は完了です。
スレッドグループのスレッド数を追加したユーザー数と同じ値にすることで、複数ユーザーからリクエストを送るシナリオを作成することができます。
②複数リクエストでの値渡し
渡す側(=先に実行されるリクエスト)
     1. HTTPリクエストに正規表現抽出を追加します。

f:id:nanamusic-tech:20210823165701p:plain

     2. 各項目を入力します。入力内容はこちらのページを参考にさせていただきました。

f:id:nanamusic-tech:20210823170600p:plain

受け取る側(=後に実行されるリクエスト)
  1. HTTPリクエストのパスに ${value} を追加します。

f:id:nanamusic-tech:20210907191546p:plain

これで、一つ目のAPIのレスポンスの値を、二つ目のAPIのパスパラメータとして渡すことができます。

結果の確認

いくつかの結果表示方法がありますが、テーブルが見やすかったです。
以下から結果を表で表示を追加します。

f:id:nanamusic-tech:20210823171448p:plain

すると以下のような表で結果が確認できます。

赤枠部分がレスポンスタイムです。今回はこちらを指標とし検証しました。

f:id:nanamusic-tech:20210910120011p:plain

最後に 

今回の負荷検証では、以下のような単体テストでは気付けない問題を見つけることができました。
  • 複数ユーザーから同時リクエスト時にデータが重複登録されてしまう
  • データ量が多い時に、特定のユーザー条件の場合レスポンスタイムが遅くなる
結果リリース前に修正することができ、リリース後にパフォーマンス面で大きな問題は起きませんでした。
この記事が同じようにこれから負荷検証を行う方の参考になれば嬉しいです。 

nana musicでは、一緒にテスト技術の向上に取り組めるエンジニアを募集しております!

皆様のご応募をお待ちしております。

www.wantedly.com