こんにちは。よっしーです(^^)
今日は、APIの負荷テストについてご紹介します。
背景
Dockerで構築したWebアプリの開発環境において、k6を利用した負荷テストについて調査したときの内容を備忘として残しました。
開発環境のソースは下記のリポジトリにあります。
しきい値の設定
すべてのテストには目標が必要です。エンジニアリング組織は、可用性、パフォーマンス、またはその他のパフォーマンス要件を検証するために、サービスレベル目標(Service Level Objectives、SLOs)を使用して信頼性の目標を設定します。
SLOは、インフラストラクチャコンポーネント、API、またはアプリケーション全体のレベルで定義される場合があります。一部の例として、次のようなSLOが考えられます:
- 商品情報を返すAPIの99%が600ms未満で応答すること。
- ログインリクエストの失敗率が99.99%以下で、1000ms未満で応答すること。
ロードテストを設計する際に、SLO、信頼性目標、または他の重要なメトリックを検証するための合格/不合格の基準を設定します。システムがそのSLOを達成することを確保するために、プロダクション環境とプレプロダクション環境の両方で定期的にテストします。
k6では、Thresholdsを使用してテストの合格/不合格基準を設定できます。このスクリプトでは、thresholdsオブジェクト内にエラーレート(可用性に関するもの)とリクエストの実行時間(レイテンシに関するもの)の2つのSLOをコード化しています。
export const options = {
thresholds: {
http_req_failed: ['rate<0.01'], // http errors should be less than 1%
http_req_duration: ['p(95)<200'], // 95% of requests should be below 200ms
},
scenarios: {
my_scenario1: {
executor: 'constant-arrival-rate',
duration: '30s', // total duration
preAllocatedVUs: 50, // to allocate runtime resources
rate: 50, // number of constant iterations given `timeUnit`
timeUnit: '1s',
},
},
};
k6 がテストを実行すると、テスト出力には、メトリクスがしきい値内にあるかどうか (✅)、またはしきい値を超えているかどうか (❌) が示されます。この出力では、テストは両方のしきい値を満たしました。
✓ http_req_duration..............: avg=104.7ms min=101.87ms med=103.92ms max=120.68ms p(90)=107.2ms p(95)=111.38ms
{ expected_response:true }...: avg=104.7ms min=101.87ms med=103.92ms max=120.68ms p(90)=107.2ms p(95)=111.38ms
✓ http_req_failed................: 0.00% ✓ 0 ✗ 1501
テストが失敗すると、k6 CLIはゼロ以外の終了コードを返します。これはテスト自動化のために必要な条件です。失敗したテストの例として、以下はリクエストの95%が50ms未満で終了するという閾値を持つテストの出力です:http_req_duration:[“p(95)<50”]。
(出力例を提供する際に、特定の出力内容が表示されていないため、具体的なエラーメッセージは提供されていません。詳細なエラーメッセージや問題の詳細については、実際の出力を確認する必要があります。)
running (0m30.1s), 00/50 VUs, 1501 complete and 0 interrupted iterations
my_scenario1 ✓ [======================================] 00/50 VUs 30s 50.00 iters/s
✓ Post status is 200
✓ Post Content-Type header
✓ Post response name
checks.........................: 100.00% ✓ 4503 ✗ 0
data_received..................: 1.3 MB 45 kB/s
data_sent......................: 313 kB 10 kB/s
http_req_blocked...............: avg=9.26ms min=2µs med=14µs max=557.32ms p(90)=25µs p(95)=46µs
http_req_connecting............: avg=3.5ms min=0s med=0s max=113.46ms p(90)=0s p(95)=0s
✗ http_req_duration..............: avg=105.14ms min=102.01ms med=103.86ms max=171.56ms p(90)=112.4ms p(95)=113.18ms
{ expected_response:true }...: avg=105.14ms min=102.01ms med=103.86ms max=171.56ms p(90)=112.4ms p(95)=113.18ms
✓ http_req_failed................: 0.00% ✓ 0 ✗ 1501
http_req_receiving.............: avg=202.86µs min=17µs med=170µs max=4.69ms p(90)=264µs p(95)=341µs
http_req_sending...............: avg=97.56µs min=11µs med=63µs max=5.56ms p(90)=98µs p(95)=133µs
http_req_tls_handshaking.......: avg=4.14ms min=0s med=0s max=169.35ms p(90)=0s p(95)=0s
http_req_waiting...............: avg=104.84ms min=101.88ms med=103.6ms max=171.52ms p(90)=112.18ms p(95)=112.85ms
http_reqs......................: 1501 49.834813/s
iteration_duration.............: avg=115.18ms min=102.51ms med=104.66ms max=704.99ms p(90)=113.68ms p(95)=115.54ms
iterations.....................: 1501 49.834813/s
vus............................: 50 min=50 max=50
vus_max........................: 50 min=50 max=50
ERRO[0030] some thresholds have failed
おわりに
今日は、APIの負荷テストについてご紹介しました。
何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。
それでは、また明日お会いしましょう(^^)
コメント