「1万ユーザーの同時アクセスに対応できるようにして欲しい」という要望を受けることがあります。
このようなケースでは、負荷テストをお勧めすることが多いのですが、負荷テストで確認できるのは「秒間のリクエスト数」です。「1万ユーザーの同時アクセスに対応できること」を証明するためには、「1万ユーザーの同時アクセス」をブレイクダウンして、「秒間のリクエスト数」に落とし込む必要があります。
この記事では、「1万ユーザーの同時アクセス」を「秒間のリクエスト数」に落とし込む方法を説明します。
「1万ユーザーの同時アクセス」を「秒間のリクエスト数」に落とし込む
秒間のリクエスト数を計算するためには、次の式を使います。
- 秒間のリクエスト数 = ユーザー数 × ページ/ユーザー ÷ 想定時間(秒) × ピーク特性
それぞれについて、説明していきます。
ユーザー数
アクセスしてくる可能性がある、ユーザーの総数を確認します。
ページ/ユーザー
一人のユーザーが閲覧するであろう平均ページ数の想定を行います。すべてのユーザーが同じ動きをするわけではありませんが、代表的なページ遷移があるはずです。その想定されるページ遷移を想定して、ページ数を数えます。
例えば、
- トップ画面
- ログイン画面
- ログイン実施
という遷移であれば、「1ユーザーあたり3ページ」ということになります。
想定時間(秒)
想定時間を確認するためには、「同時」の意味をブレイクダウンする必要があります。直訳すると、「同時」とは「二つ以上の事が同じ時に行われる(起こる、成り立つ)こと。」です。
「1万ユーザーの同時アクセス」をそのままの意味でとらえてみると、
- 1万ユーザーが1秒間に殺到する
状態となります。超大規模サイトであればあり得る数字ですが、あまり現実的な数字ではないのではないでしょうか?
GoogleAnalyticsのリアルタイムレポートのアクティブユーザーは、過去5分間にアクセスがあったユーザー数となっています。「1万人同時」をリアルタイムレポートの数字をもとに考えている場合は、同時の意味は5分間になります。
または、8時間開催されるイベントに1万ユーザーが参加する想定であれば、同時の意味は8時間です。9時の始業時を中心に1万ユーザーがアクセスしてくる可能性がある、ということであれば、9時の前後10分くらいを想定した20分となるかもしれません。
サイトの特性に応じて「同時」の単位は変わってくるのでよく考えてみましょう。
ちなみに、時間の単位は「秒」にして計算してましょう。5分であれば300秒、1時間であれば3600秒です。
ピーク特性
「ユーザー数」「ページ/ユーザー」「想定時間(秒)」がわかれば、次の計算式で「秒間のページ数」を試算することができます。
* 秒間のページ数=ユーザー数 × ページ/ユーザー ÷ 想定時間
この試算結果は、単純平均なのでアクセスの偏りの考慮ができていません。実際の動きに近づけるために、偏りを考慮していきます。
具体的な倍率が出せそうであれば出してみましょう。出せなそうであれば、パレートの法則を使ってみると良いと思います。ざっくりな数でいえば、それほどピーク性がないものであれば「2.5倍」、ピーク性が高いものであれば「6倍」しておくと良いと思います。
1万人の同時アクセスを数値化してみる
今までの数式に当てはめて、1万ユーザーの同時アクセスを計算してみました。
ページ/ユーザーは「5」、想定時間は「5分」「1時間」「8時間」の3パターン、ピーク特性は「通常(2.5)」「高い(6)」の2パターンです。
No | ユーザー | ページ/ユーザー | 想定時間 | ピーク特性 | 秒間のリクエスト数 |
---|---|---|---|---|---|
1 | 10,000 | 5 | 5分 | 2.5 | 416 |
2 | 10,000 | 5 | 5分 | 6 | 1,000 |
3 | 10,000 | 5 | 1時間 | 2.5 | 34 |
4 | 10,000 | 5 | 1時間 | 6 | 83 |
5 | 10,000 | 5 | 8時間 | 2.5 | 4 |
6 | 10,000 | 5 | 8時間 | 6 | 10 |
念のため計算式も確認しておきましょう。No6であれば次のように計算ができます。
- 秒間のリクエスト数 = ユーザー数 × ページ/ユーザー ÷ 想定時間(秒) × ピーク特性
- 10 ≒ 10,000 × 5 ÷ (8 × 60 × 60) × 6
静的コンテンツを含める場合
今までの説明は、ページあたりのリクエスト数が1の前提となっていました。画像やcss、jsが一つもないテキストのみのページが表示されるイメージです。本来であれば、画像等の静的コンテンツも含めた形で数値試算をする必要があります。
実際の運用で、CDNを利用する場合は、静的コンテンツの大半はキャッシュされてしまいます。CDNの負荷テストをしてもあまり意味がありません。CDNを利用する場合は、静的コンテンツは無視して問題ありません。
もし、CDNの利用はせずに静的コンテンツを含めたテストを行う場合は、「ページあたりの平均リクエスト数」を確認して、上記で算出した「秒間リクエスト数」に掛ける必要があります。「ページあたりの平均リクエスト数」は、開発者ツールや、アクセスログ等で確認しておきましょう。
CDNを利用し静的コンテンツを無視する場合の計算式は次の通りです。
- 秒間のリクエスト数 = ユーザー数 × ページ/ユーザー ÷ 想定時間(秒) × ピーク特性
対して、静的コンテンツを考慮する場合の計算式は次のようになります。
- 秒間のリクエスト数 = ユーザー数 × ページ/ユーザー ÷ 想定時間(秒) × ピーク特性 × 静的コンテンツの数/ページ
まとめ
負荷テストで性能評価をする場合は、比較する指標をそろえる必要があります。JMeterでは、「秒間のリクエスト数」(スループット)を計測することが可能です。「1万ユーザーの同時アクセスに対応できること」というような性能要件を、「秒間のリクエスト数」に直して比較するようにしましょう。