負荷テストのガイドライン
この記事の英語版に更新があります。ご覧の翻訳には含まれていない変更点があるかもしれません。
最終更新日 2023年03月14日(火)
Table of Contents
Heroku プラットフォームで本番環境アプリケーションの実行中に、負荷テストの実行が必要になる場合があります。このドキュメントでは、Heroku で許容されるテストについてのいくつかのガイドラインを規定します。
負荷テストの実行と結果の解釈についてのガイダンスは、「アプリケーションの負荷テスト」を参照してください。
Common Runtime の制限
実行する負荷テストの規模に応じて制限は変化します。このセクションでは、様々なテストボリュームに適用される制限の概要を示します。
小規模から中規模までのテスト
これらのテストは、あるアプリケーションについて 1 秒あたり 10,000 個のリクエストに制限されている限り、Heroku からの許可を受けずに実行できます。これは Common Runtime のすべてのリージョンに適用されます。これらのテストは予告なくいつでも実行できますが、一度に 1 つのテストに制限するものとし、1 秒あたり 10,000 個のリクエストのテストを同時に複数実行しないでください。この規模のテストはあらゆる dyno のサイズで実行できます。
- RPS 制限: < 10,000 リクエスト/秒
- 許容される dyno サイズ: Professional 層以上
- 許可の必要性: なし
大規模なテスト
1 秒あたり 10,000 個のリクエストを超える大量のトラフィックを含むテストも実行できますが、このようなテストの場合、テストを実行する少なくとも 2 営業日前に Heroku サポートに連絡し、Heroku から許可を受けてください。
Heroku のアーキテクチャはトラフィックの自律的成長に合わせてサイズ変更するように設計されています。ベンチマークの場合、特に大量のバーストトラフィックについては、Heroku のシステムはトラフィックの急激な流入に十分な速さで対応できない場合もあります。Heroku に通知すれば、システムを事前にウォームアップでき、ベンチマークで正確かつ信頼性の高い結果を得ることができます。
この規模のテストは Performance dyno に限定する必要があります。1 秒あたり 10,000 個のリクエストを超えるボリュームの負荷テストを Performance dyno 以外で実行しないでください。
- RPS 制限: > 10,000 リクエスト/秒
- 許容される dyno サイズ: Performance 層のみ
- 許可の必要性: あり
許可を受けない場合に起こりうる影響
適切な準備を行わなければ、1 秒あたり 10,000 個のリクエストを超える負荷テストは、ほとんどの場合に不正確な結果をもたらします。さらに最悪のケースでは、負荷テストがアプリの不正な操作 (あるいは悪用) として誤解され、Heroku は調査中に誤ってアプリケーションの利用を中断する可能性があります。
Private Space 制限
Private Space 内では、あらゆる量のトラフィックを含むテストを事前の許可を受けずに行うことができます。ここでは環境およびルーティングが完全に隔離されているため、ここから負荷テストを実行しても他のお客様への影響はまったくありません。お客様が直面する制限は、お客様の環境で利用可能なスループットに直接関係します。Private Space 内のすべてのアプリケーションは ELB の背後にあります。初期のリクエスト率が 1 秒あたり 150 個を超えるか、既存の 1 秒あたりのリクエスト数が 5 分以内に倍増する場合、Heroku サポートに連絡して、テスト前に ELB の事前ウォームアップをリクエストできます。これらの種類のリクエストを行う場合は、少なくとも 2 営業日前に Heroku に連絡してください。
- RPS 制限: なし
- 許可される dyno サイズ: あらゆるサイズ
- 許可の必要性: なし
事前ウォームアップを行うには最低 3 つの Web dyno を実行する必要があります。
その他の考慮事項
テストの規模と、必要な場合に許可を受けること以外に、負荷テストを行う前に考慮することが望ましい事項がいくつかあります。
データストア接続制限
ほとんどすべてのデータストアには、アプリケーションを負荷テスト用にスケーリングするときにユーザーが直面することがある接続制限があります。データストアの接続制限について注意し、テストのためにスケールアップするときに接続制限を超えないようにすることが重要です。詳しい説明は、こちらにあります。これは Ruby および ActiveRecord に限定したものですが、多くの概念は他の言語や ORM でも類似しています。