パフォーマンステスト及び負荷テストにおける【同時アクセス再現(=負荷がけ) & レスポンスタイム計測】について、筆者がシステム開発において構築した仕組みをご紹介させていただきます。
概要
筆者が参画したプロジェクトでは、業務上の重要機能を対象に、以下2つの状態でレスポンスタイムを計測しました。
- 無風状態(システムへのアクセスが無い状態)
- 業務上想定される最大の同時アクセスが発生した状態
上記を計測するため以下の図のような構成でパフォーマンステストを実施しました。
実際にはバッチ処理(日中・夜間)の計測なども実施していますが、今回は画面からのオンライン処理計測についてご紹介させていただきます。
ポイントは大きく2つ。
- JMeterを利用した同時アクセスによる負荷がけの再現
- Seleniumを利用した画面操作のレスポンスタイム取得
です。
JMeterでの負荷がけ
JMeterで再現したシナリオを図で示します。
システムが主に管理するデータを対象に、CRUD処理を繰り返すシナリオを定義しました。
※CRUD = Create,Read,Update,Deleteの基本処理
JMeterの詳細な定義方法については別の記事でご紹介できればと思いますので、今回はポイントを絞って記載します。
- システム利用ユーザの定番操作(頻度の高い操作パターン)を再現すること
・システムのユースケースを把握した上で、利用ユーザのメインフローを再現することが重要です。
本番運用後のリアルな負荷を再現することで、より有効なシステム品質向上に繋がります。
・(極端な話、めったに使われない機能を対象に負荷がけしても意味のある品質向上にはならないと思います。) - UIからの操作をリアルに再現すること。
・例:JMeterには"定数タイマ"という機能があり、各リクエストの間に一定時間設けることができます。
・実際のユーザ操作では画面表示されてから次の操作に移るまで一定時間がかかる(画面を見たり、考え事をしたり)ので、設定が必要な項目だと思います。
・※詳しくは、JMeterのユーザマニュアルを参照してみてください。
https://jmeter.apache.org/usermanual/component_reference.html#Constant_Timer - 同時アクセス処理の起動間隔を空ける
・上図の各操作のことをJMeterでは"Thread"と言います。
・Threadの数で同時アクセスユーザ数を再現するのですが、"Ramp-Up期間"という値を一緒に指定することで、その期間内で指定のThread数を立ち上げることになります。
・以下の設定では300秒で100 Thread、つまり3秒毎に新しいThreadを立ち上げることになります。
Seleniumでのレスポンスタイム計測
Seleniumはブラウザ操作を自動化するためのツールです。
ボタン押下、入力欄へのデータ投入、ブラウザ更新など画面上で可能な操作は一通り再現可能です。
本記事では、オンライン処理のレスポンスタイム計測に絞って定義内容を紹介させていただきます。
以下、対象機能計測するために記載したPythonのコードです。
# 検索画面を表示
driver.find_element(By.ID,"StoreVolume").click()
# 検索ボタンを押下
driver.find_element(By.ID,"searchAll").click()
# 検索処理のレスポンスを変数に代入
StoreSearchResponseTime = driver.execute_script(
"return (window.performance.timing.loadEventEnd - window.performance.timing.requestStart) / 1000"
);
# 検索レスポンスをログファイルに書き出し
filename = 'searchResponseLog.txt'
with open(filename, 'a') as f:
print("time for searching store :", file=f)
print(StoreSearchResponseTime, file=f)
コメントを含む最初の4行は、計測対象の機能を再現するための記述です。
5行目で処理のレスポンスタイムを計測しています。
※参考:以下サイトにて"execute_script"で検索してみてください。
https://selenium-python.readthedocs.io/api.html#module-selenium.common.exceptions
Seleniumでは「execute_script(script, *args)」を利用してJavaScriptを実行することができます。
上記コードでは、JavaScriptを利用して【リクエスト日時 & 画面ロード完了日時】を取得し、【画面ロード完了日時 ー リクエスト日時】で処理時間を算出しています。
※参考:【リクエスト日時 & 画面ロード完了日時】の取得については以下を参考にしてみてください。
- window.performance.timing.loadEventEnd
https://developer.mozilla.org/ja/docs/Web/API/PerformanceNavigationTiming/loadEventEnd - window.performance.timing.requestStart
https://developer.mozilla.org/en-US/docs/Web/API/PerformanceTiming/requestStart