AgentSkillsCN

performance-testing

在执行与分析性能测试(Performance Testing)时,此技能将助您高效运用 k6 工具进行压力测试与负载测试,同时完成测试数据的准备、结果分析与调优指南的编写,为性能优化提供有力支持。

SKILL.md
--- frontmatter
name: performance-testing
description: 性能テスト(Performance Testing)の実行・分析を行う際に使用。k6によるストレステスト/ロードテスト、テストデータ準備、結果分析、チューニングガイドに役立つ。

性能テスト開発ガイド

ドキュメント

  • performance-test/README.md - 性能テスト概要・実行手順
  • documentation/docs/content_08_ops/performance/ - 性能検証ドキュメント一式

機能概要

idp-serverの性能テストはk6を使用して実行。

  • ストレステスト: システムの限界を特定(単体API)
  • ロードテスト: 想定負荷での安定性検証(E2Eフロー)
  • スケーラビリティテスト: マルチテナント・ユーザー数増加時の性能

ディレクトリ構成

code
performance-test/
├── README.md                           # 実行手順
├── load/                               # ロードテストシナリオ
│   ├── scenario-1-ciba-login.js       # CIBA ログイン
│   ├── scenario-2-multi-ciba-login.js # マルチテナントCIBA
│   ├── scenario-3-peak-login.js       # ピーク負荷
│   └── scenario-4-authorization-code.js # 認可コードフロー
│
├── stress/                             # ストレステストシナリオ
│   ├── scenario-1-authorization-request.js  # 認可リクエスト
│   ├── scenario-2-bc.js                     # CIBA BC Request
│   ├── scenario-3-ciba-*.js                 # CIBA各種パターン
│   ├── scenario-4-token-password.js         # Password Grant
│   ├── scenario-5-token-client-credentials.js # Client Credentials
│   ├── scenario-6-jwks.js                   # JWKS
│   ├── scenario-7-token-introspection.js    # Token Introspection
│   ├── scenario-8-authentication-device.js  # 認証デバイス
│   └── scenario-9-identity-verification-application.js # 身元確認
│
├── scripts/                            # データ準備スクリプト
│   ├── register-tenants.sh            # テナント登録
│   ├── generate_users.py              # ユーザーデータ生成
│   └── import_users.sh                # PostgreSQL投入
│
├── data/                               # テストデータ
│   └── performance-test-tenant.json   # テナント設定
│
└── result/                             # テスト結果

前提条件

bash
# k6 インストール
brew install k6

# Python 3(ユーザーデータ生成用)
python3 --version

# PostgreSQL クライアント(データ投入用)
psql --version

クイックスタート

1. テストデータ準備

bash
# テナント登録(10テナント)
./performance-test/scripts/register-tenants.sh -n 10

# ユーザーデータ生成(1テナント100万 + 9テナント各10万)
python3 ./performance-test/scripts/generate_users.py \
  --tenants-file ./performance-test/data/performance-test-tenant.json \
  --users 100000 \
  --first-tenant-users 1000000

# PostgreSQL投入
./performance-test/scripts/import_users.sh multi_tenant_1m+9x100k

# k6用データ設定
cp ./performance-test/data/multi_tenant_1m+9x100k_test_users.json \
   ./performance-test/data/performance-test-multi-tenant-users.json

2. 環境変数設定

bash
export BASE_URL=https://api.local.dev
# または
export BASE_URL=http://localhost:8080

3. テスト実行

bash
# ストレステスト(Client Credentials)
k6 run ./performance-test/stress/scenario-5-token-client-credentials.js

# ロードテスト(CIBAログイン)
k6 run ./performance-test/load/scenario-1-ciba-login.js

# パラメータ指定
VU_COUNT=200 DURATION=60s k6 run ./performance-test/stress/scenario-5-token-client-credentials.js

テスト種別

ストレステスト

システムの限界を特定。単体API評価。

bash
# デフォルト: 120 VUs、30秒
k6 run ./performance-test/stress/scenario-5-token-client-credentials.js

# カスタマイズ
VU_COUNT=200 DURATION=60s k6 run ./performance-test/stress/scenario-5-token-client-credentials.js

ロードテスト

想定負荷での安定性検証。E2Eフロー評価。

bash
# CIBAフロー(シングルテナント)
k6 run ./performance-test/load/scenario-1-ciba-login.js

# マルチテナントCIBA
TENANT_COUNT=5 k6 run ./performance-test/load/scenario-2-multi-ciba-login.js

# 認可コードフロー
k6 run ./performance-test/load/scenario-4-authorization-code.js

性能目標

API単体TPS

エンドポイントTPS目標p95目標
Authorization Request2,000+200ms
Token (Client Credentials)1,000+250ms
Token Introspection2,000+200ms
JWKS2,000+200ms
CIBA BC Request1,000+250ms

評価指標

指標説明目標
p9595%タイルの応答時間500ms以下
p9999%タイルの応答時間1s以下
エラー率失敗リクエストの割合0.1%未満

k6スクリプト構造

javascript
import http from 'k6/http';
import { check, sleep } from 'k6';

// 環境変数でカスタマイズ
const VU_COUNT = parseInt(__ENV.VU_COUNT || '120');
const DURATION = __ENV.DURATION || '30s';

export let options = {
  vus: VU_COUNT,
  duration: DURATION,
  thresholds: {
    http_req_duration: ['p(95)<500'],
    http_req_failed: ['rate<0.01'],
  },
};

// テストデータ読み込み
const tenantData = JSON.parse(open('../data/performance-test-multi-tenant-users.json'));
const tenantIndex = parseInt(__ENV.TENANT_INDEX || '0');
const config = tenantData[tenantIndex];

export default function () {
  const baseUrl = __ENV.BASE_URL || 'http://localhost:8080';
  const url = `${baseUrl}/${config.tenantId}/v1/tokens`;

  const payload = `grant_type=client_credentials&client_id=${config.clientId}&...`;

  const res = http.post(url, payload, {
    headers: { 'Content-Type': 'application/x-www-form-urlencoded' },
  });

  check(res, {
    'status is 200': (r) => r.status === 200,
  });
}

テストデータ準備詳細

テナント登録

bash
# 基本
./performance-test/scripts/register-tenants.sh -n 10

# オプション
-n <数>     # 登録テナント数(必須)
-a          # 追加モード(既存保持)
-d true     # ドライラン
-b <URL>    # ベースURL

ユーザーデータ生成

bash
python3 ./performance-test/scripts/generate_users.py \
  --tenants-file ./performance-test/data/performance-test-tenant.json \
  --users 100000 \
  --first-tenant-users 1000000

# オプション
--users <数>              # 各テナントのユーザー数
--first-tenant-users <数> # 最初のテナントのみ別のユーザー数

データ投入

bash
./performance-test/scripts/import_users.sh multi_tenant_1m+9x100k

結果確認

k6出力

code
✓ status is 200

checks.........................: 100.00% ✓ 35640    ✗ 0
data_received..................: 15 MB   499 kB/s
data_sent......................: 9.2 MB  307 kB/s
http_req_blocked...............: avg=12.34µs  p(95)=20.12µs
http_req_duration..............: avg=99.51ms  p(95)=156.42ms
http_reqs......................: 35640   1188.006/s
iteration_duration.............: avg=100.89ms p(95)=157.83ms
iterations.....................: 35640   1188.006/s
vus............................: 120     min=120    max=120

結果ファイル

bash
# HTML レポート
k6 run --out web-dashboard=export=result.html ./performance-test/stress/...

# JSON出力
k6 run --out json=result.json ./performance-test/stress/...

トラブルシューティング

問題原因解決策
テナント設定読み込みエラーJSONファイル未生成register-tenants.sh を先に実行
接続エラーサーバー未起動docker compose up -d 確認
高エラー率DBコネクション枯渇コネクションプール設定確認
p95超過リソース不足VU数を下げて再測定

コマンド一覧

bash
# ストレステスト
k6 run ./performance-test/stress/scenario-1-authorization-request.js
k6 run ./performance-test/stress/scenario-5-token-client-credentials.js
k6 run ./performance-test/stress/scenario-7-token-introspection.js

# ロードテスト
k6 run ./performance-test/load/scenario-1-ciba-login.js
k6 run ./performance-test/load/scenario-4-authorization-code.js

# パラメータ付き実行
VU_COUNT=200 DURATION=60s k6 run ./performance-test/stress/...
TENANT_COUNT=5 k6 run ./performance-test/load/...
BASE_URL=http://localhost:8080 k6 run ./performance-test/stress/...

詳細ドキュメント

ドキュメント内容
00-overview.md性能検証概要
01-test-environment.mdテスト環境・構成
02-stress-test-results.mdストレステスト結果
03-load-test-results.mdロードテスト結果
04-scalability-evaluation.mdスケーラビリティ評価
05-tuning-guide.mdチューニングガイド
06-test-execution-guide.mdStep-by-Step実行ガイド
07-test-strategy.md性能テスト方針

パス: documentation/docs/content_08_ops/performance/


関連スキル

スキル用途
/local-environmentローカル環境構築
/operations運用・監視
/database-adapterデータベース設定・チューニング