k6入門:APIの負荷テストについて -しきい値の設定-

スポンサーリンク
k6入門:APIの負荷テストについて -しきい値の設定- 環境構築
k6入門:APIの負荷テストについて -しきい値の設定-
この記事は約7分で読めます。
よっしー
よっしー

こんにちは。よっしーです(^^)

今日は、APIの負荷テストについてご紹介します。

スポンサーリンク

背景

Dockerで構築したWebアプリの開発環境において、k6を利用した負荷テストについて調査したときの内容を備忘として残しました。

開発環境のソースは下記のリポジトリにあります。

しきい値の設定

すべてのテストには目標が必要です。エンジニアリング組織は、可用性、パフォーマンス、またはその他のパフォーマンス要件を検証するために、サービスレベル目標(Service Level Objectives、SLOs)を使用して信頼性の目標を設定します。

SLOは、インフラストラクチャコンポーネント、API、またはアプリケーション全体のレベルで定義される場合があります。一部の例として、次のようなSLOが考えられます:

  1. 商品情報を返すAPIの99%が600ms未満で応答すること。
  2. ログインリクエストの失敗率が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の負荷テストについてご紹介しました。

よっしー
よっしー

何か質問や相談があれば、コメントをお願いします。また、エンジニア案件の相談にも随時対応していますので、お気軽にお問い合わせください。

それでは、また明日お会いしましょう(^^)

コメント

タイトルとURLをコピーしました