こんにちは。よっしーです(^^)
今日は、Load testingについてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6を利用した負荷テストについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
負荷テスト(Load testing)
平均負荷テストは、システムが典型的な負荷の状況下でどのように動作するかを評価します。典型的な負荷は、本番環境での通常の日常または平均的な瞬間を表すことがあります。
平均負荷テストは、本番環境での平均的な振る舞いを模倣するため、同時ユーザーや秒ごとのリクエスト数をシミュレートします。このテストタイプは通常、スループットまたは仮想ユーザー(VUs)を徐々に増加させ、その平均負荷を一定の時間維持します。システムの特性に応じて、テストは突然停止することもあれば、短いランプダウン期間を持つこともあります。
平均負荷テストは、システムが通常の運用状態でどのように振る舞うかを確認し、性能の安定性と信頼性を評価するのに役立ちます。このテストでは、本番環境の典型的なトラフィックパターンを模倣することにより、実際の利用状況に近い条件での性能を評価することができます。
「負荷テスト」という用語は、トラフィックを模倣するすべての種類のテストを指す場合があるため、この記事では混乱を避けるために「平均負荷テスト」という名前を使用しています。一部のテストの文脈では、このテストを「日常のテスト」または「ボリュームテスト」と呼ぶこともあります。
このようにテストの名前が異なる場合でも、目的は通常、システムが通常の運用条件下でどのように振る舞うかを評価することです。特に平均的なトラフィックパターンを模倣して、システムの性能やリソース利用率を評価するのが目的です。名前は異なる場合があっても、このテストの本質は同じです。
平均負荷テストを実行するタイミング
平均負荷テストは、システムが通常の日(一般的な負荷)にパフォーマンス目標を満たしているかどうかを理解するのに役立ちます。ここでの「通常の日」は、平均的なユーザー数が同時にアプリケーションにアクセスし、通常の平均的な作業を行うときを指します。
以下は、平均負荷テストを実行すべき理由です:
- システムの通常の負荷下でのパフォーマンスを評価する。
- ランプアップまたはフル負荷の期間中に早期の劣化の兆候を特定する。
- システムの変更(コードおよびインフラストラクチャ)後も、パフォーマンス基準を満たしていることを確認する。
平均負荷テストは、システムが通常の使用状況で適切に動作し、パフォーマンス目標を達成できるかどうかを確認するために不可欠です。また、変更が導入された場合にその影響を監視し、問題を早期に特定するのにも役立ちます。これにより、システムの信頼性と性能を確保し、ユーザーエクスペリエンスを向上させるための戦略的な情報を提供します。
考慮事項
平均負荷テストを準備する際には、以下を考慮してください:
- システム内の特定のユーザー数とプロセスごとの通常のスループットを把握するこれを見つけるために、本番環境から情報を提供するAPM(アプリケーションパフォーマンスモニタリング)ツールや分析ツールを調べてみてください。このようなツールにアクセスできない場合、ビジネス側がこれらの見積もりを提供する必要があります。
- 目標の平均負荷に徐々に負荷を増やすつまり、ランプアップ期間を使用します。通常、この期間はテスト全体の時間の5%から15%の間で行われます。ランプアップ期間には多くの重要な用途があります:
- システムがトラフィックを処理できるようになるまでの時間を確保します。
- 低負荷と平均負荷の段階で応答時間を比較できます。
- 当社のクラウドサービスを使用してテストを実行する場合、ランプアップを行うことで、自動パフォーマンスアラートがシステムの期待される動作を理解できるようになります。
- ランプアップよりも長い期間にわたって平均負荷を維持するランプアップ期間の5倍以上の期間にわたる平均期間を目指し、長い時間にわたるパフォーマンストレンドを評価します。
- ランプダウン期間を考慮するランプダウンは、仮想ユーザーの活動が徐々に減少する時期です。ランプアップと同じ期間か、それよりも少し短い期間が通常です。
これらの要因を考慮することにより、平均負荷テストが実行され、システムのパフォーマンスと振る舞いが適切に評価されます。特にランプアップ期間とランプダウン期間は、システムがトラフィックの増減にどのように適応するかを理解し、テスト結果の信頼性を高めるのに役立ちます。
Load testing in k6
小さな規模から始めることをお勧めします
負荷テストを実行するのが初めての場合、小さな規模から始めるか、ランプアップを遅く設定することをお勧めします。アプリケーションとインフラストラクチャがあなたが考えているほど堅牢でない可能性があるからです。数千人のユーザーが、自分のアプリケーション(またはステージング環境)をすぐにクラッシュさせる負荷テストを実行した事例があります。
平均負荷テストの目標は、本番環境の通常の日における平均的な活動量を模倣することです。このパターンは次のシーケンスに従います:
- スクリプトの活動を増加させ、目標のユーザー数とスループットに達するまで増加させる。
- 一定の負荷を一定期間維持する。
- テストケースに応じて、テストを停止するか、徐々にランプダウンさせる。
負荷をoptions
オブジェクトで設定します。以下は、負荷を設定するための一般的な手順です:
import http from 'k6/http';
import {sleep} from 'k6';
export const options = {
// Key configurations for avg load test in this section
stages: [
{ duration: '5m', target: 100 }, // traffic ramp-up from 1 to 100 users over 5 minutes.
{ duration: '30m', target: 100 }, // stay at 100 users for 30 minutes
{ duration: '5m', target: 0 }, // ramp-down to 0 users
],
};
export default () => {
const urlRes = http.get('https://test-api.k6.io');
sleep(1);
// MORE STEPS
// Here you can have more steps or complex script
// Step1
// Step2
// etc.
};
このスクリプトのロジックはウェブページを開くための単一のリクエストしか含んでいません。通常、テストの振る舞いにはさらに多くのステップが含まれます。より複雑なテスト、グループ、検証、しきい値、およびヘルパー関数を使用するテストを見たい場合は、後日、公開される記事をご覧ください。
平均負荷テストの仮想ユーザー(VU)またはスループットのチャートは、テストが進行するにつれてユーザー数やスループットが増加し、一定の負荷を維持する様子を示すものと考えられます。このチャートは、テストの実行中にユーザー数や負荷がどのように変化するかを視覚的に示します。
ユーザー数またはスループットの数は、0から始まり、徐々に目標値に増加し、指定された期間にその値を維持します。その後、負荷は短期間で減少します。この動作は、平均負荷テストの一般的な特徴であり、テストの開始から終了までの過程を視覚的に表現しています。テストが負荷を増減させることで、システムのパフォーマンスと応答を評価し、問題を特定するのに役立ちます。
結果の分析
平均負荷テストの初期の結果は、ランプアップ期間中に表示され、負荷が増加するにつれて応答時間が劣化するかどうかを確認します。一部のシステムは、ランプアップ期間中にさえ失敗する可能性があります。
このテストは、一部のシステムがこの期間に不安定な振る舞いを示すことがあるため、システムのパフォーマンスとリソース消費が負荷が最大の状態で一定であるかどうかを検証します。
システムが通常の負荷下で正常に動作し、生存することを確認したら、それを超える条件での振る舞いを評価する必要があるかもしれません。これらの超常の条件の一部は、ストレステストとして知られています。
平均負荷テストは、システムが通常の運用条件下でどのように動作し、リソースをどのように消費するかを確認するのに役立ちます。そして、ストレステストは、システムが上記平均を超える負荷下でどのように振る舞うかを評価するための次のステップとなります。これにより、システムの限界や潜在的な問題を特定し、対策を講じるための情報を提供します。
おわりに
今日は、Load testingについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント