webサービスでの負荷テストの進め方と考え方

Pocket

業務でjmeter【EC2】を使用し負荷テストを実施したので、実施に対しての進め方・考え方について共有します。
少しでも参考になれば嬉しいです。

使用最大ユーザー数を予想する

まずはサービスがどれくらいのユーザーに使用されるのかを予測します。
現在使用中のサービスであればデータの増加率から、ある程度予測することができるかと思います。
新規サービスの場合でも仕様を決める際にユーザー数は予想されていると思うので、知っている方に確認しましょう。

最大同時接続数を算出する

ある程度の時間内でどれくらいのユーザーが同時にサービスを使用する可能性があるのかを予測します。
今回、私は1時間に最大ユーザー数の10%が接続するように設定しました。
ただサービスによって大きく異なると思うので、上流の方と相談して決めれたら理想だと思います。

想定データ量を算出する

最低限のデータ量で負荷テストを実施した場合、データベースへの負荷が想定より小さくなってしまいます。
なので最大ユーザー数から一定期間後のデータ量を算出して負荷テスト前に投入しておきましょう。
参考までに私は1年後のデータ量を算出して投入しました。

データ投入方法を決める

クエリ文でさくっとインサートできるのが理想ですが、制約のあるテーブルが多いのに加えて、投入データを負荷テストで使用する必要があったのでphpでスクリプトを書いて投入しました。
データ量が多いと意外と時間がかかるので、事前にどれくらいの時間が必要か見積もりしておくと良いです。

テストシナリオを決める

実際にユーザーがどのようにページ遷移をするのか予想して、テストシナリオを立てましょう。
負荷の大きい処理をシナリオにできる限り含めるようにしておきましょう。

テスト方法を決める

最後にテスト方法を決めましょう。
1人のユーザー情報を使用して同時接続を再現するとキャッシュ等の影響で想定よりも負荷がかからない可能性があります。
なので、できる限り多くのユーザー情報(ログイン情報)を用いてテストしていきましょう。
ちなみに私はjmeterを使用しました。
こちらに関してはシナリオと含めて別記事で詳細に書いていきたいと思います。

確認項目を決める

私は負荷テスト中にサービスを使用して応答時間が正常かどうかで判定しました。
応答時間が想定よりも遅い場合は、処理内容やサーバーのCPU使用率・ロードアベレージなどを確認して原因追求しましょう。
データベースに大量のデータが入っている影響でクエリ文が異常に遅くなっている可能性もあります。