性能テスト実行ガイド
本ドキュメントでは、性能テストの実行手順を step-by-step で説明する。
前提条件
- Docker / Docker Compose がインストールされていること
- k6 がインストールされていること(
brew install k6) - Python 3 がインストールされていること
- PostgreSQL クライアント(psql)がインストールされていること
実行順序の概要
Phase 1: Docker環境起動
↓
Phase 2: テストデータ一括準備(全測定に必要なデータを事前投入)
├── 2.1: テナント登録(最大10テナント)
├── 2.2: ユーザーデータ生成(各テナント100万件)
└── 2.3: PostgreSQL COPY投入
↓
Phase 3: ストレステスト実行
↓
Phase 4: ロードテスト実行(パラメータ変更のみ、データ追加不要)
├── ベースライン測定
├── 同時負荷影響測定
├── マルチテナント影響測定(TENANT_COUNT で制御)
├── データスケール影響測定
└── 負荷限界検証
一括データ準備の利点
- テスト間の一貫性が保証される
- 測定ごとのデータ追加が不要
- パラメータ(
TENANT_COUNT,VU_COUNT等)で各測定を制御
Phase 1: Docker環境起動
Step 1.1: Docker Compose で起動
# プロジェクトルートで実行
docker compose up -d
Step 1.2: 起動確認
# コンテナ状態確認
docker compose ps
# ヘルスチェック
curl http://localhost:8080/health
Step 1.3: pg_stat_statements 有効化
docker exec -it postgres-primary psql -U idpserver -d idpserver -c "CREATE EXTENSION IF NOT EXISTS pg_stat_statements;"
Phase 2: テストデータ一括準備
全測定(ベースライン、同時負荷、マルチテナント、データスケール)に必要なデータを事前に一括投入する。
前提条件
- Docker環境が起動済みであること(Phase 1完了)
.envファイルに管理者情報が設定されていること
テスト方針に基づくデータ規模
| 測定観点 | テナント数 | ユーザー/テナント | 備考 |
|---|---|---|---|
| ベースライン | 1 | 100,000 | 基準値測定 |
| 同時負荷 | 1 | 100,000 | VU/レートを変更 |
| マルチテナント | 1→5→10 | 100,000 | TENANT_COUNTで制御 |
| データスケール | 1 | 10万→100万 | 段階的に測定 |
推奨構成: 10テナント × 100,000ユーザー = 1,000,000ユーザー
Step 2.1: テナント登録
オンボーディングAPIで全テナントを一括登録する。
# 全測定に必要な最大テナント数(10)を一括登録
./performance-test/scripts/register-tenants.sh -n 10
# 追加でテナントを登録する場合(既存を保持)
./performance-test/scripts/register-tenants.sh -n 5 -a
# ドライラン(実際には登録しない)
./performance-test/scripts/register-tenants.sh -n 10 -d true
パラメータ説明:
| パラメータ | 説明 |
|---|---|
| -n | 登録するテナント数(必須) |
| -a | 追加モード:既存テナントを保持して追加 |
| -d | ドライラン(true/false、デフォルト: false) |
| -b | ベースURL(デフォルト: .envのAUTHORIZATION_SERVER_URL) |
生成されるファイル:
performance-test/data/performance-test-tenant.json- テナント情報
確認:
cat ./performance-test/data/performance-test-tenant.json | jq 'length'
# → 10
Step 2.2: ユーザーデータ生成
各テナントにユーザーデータを生成する。
# 推奨構成: 最初のテナント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
# 均等構成: 全テナント各10万ユーザー
python3 ./performance-test/scripts/generate_users.py \
--tenants-file ./performance-test/data/performance-test-tenant.json \
--users 100000
パラメータ説明:
| パラメータ | 説明 |
|---|---|
| --tenants-file | テナント情報JSONファイル |
| --users | 各テナントのユーザー数 |
| --first-tenant-users | 最初のテナントのみ別のユーザー数を指定(オプション) |
生成されるファイル(推奨構成の場合):
| ファイル | 内容 |
|---|---|
multi_tenant_1m+9x100k_users.tsv | 全テナントのユーザーデータ |
multi_tenant_1m+9x100k_devices.tsv | 全テナントの認証デバイスデータ |
multi_tenant_1m+9x100k_test_users.json | k6テスト用(各テナント500ユーザー) |
Step 2.3: データ投入
import_users.sh スクリプトでデータを投入する。
# 推奨構成のデータを投入
./performance-test/scripts/import_users.sh multi_tenant_1m+9x100k
# 均等構成の場合
./performance-test/scripts/import_users.sh multi_tenant_10x100k
Step 2.4: k6テスト用JSONの配置
# 推奨構成の場合
cp ./performance-test/data/multi_tenant_1m+9x100k_test_users.json \
./performance-test/data/performance-test-multi-tenant-users.json
Step 2.5: 投入確認
# テナント別ユーザー数を確認
docker exec postgres-primary psql -U idpserver -d idpserver -c "
SELECT tenant_id, COUNT(*) as user_count
FROM idp_user
GROUP BY tenant_id
ORDER BY user_count DESC
LIMIT 15;
"
# 合計確認
docker exec postgres-primary psql -U idpserver -d idpserver -c "
SELECT
(SELECT COUNT(*) FROM idp_user) as total_users,
(SELECT COUNT(*) FROM idp_user_authentication_devices) as total_devices,
(SELECT COUNT(DISTINCT tenant_id) FROM idp_user) as tenant_count;
"
期待結果(10テナント × 10万ユーザー):
total_users | total_devices | tenant_count
-------------+---------------+--------------
1000000 | 1000000 | 10
Phase 3: ストレステスト実行
結果ディレクトリ作成
mkdir -p performance-test/result/stress
mkdir -p performance-test/result/load
Step 3.1: 認可リクエスト
k6 run --summary-export=./performance-test/result/stress/scenario-1-authorization-request.json \
./performance-test/stress/scenario-1-authorization-request.js
(以下のストレステスト項目は変更なし)
Phase 4: ロードテスト実行
ロードテストは環境変数でパラメータをカスタマイズ可能。 Phase 2 でデータ投入済みのため、各測定はパラメータ変更のみで実施。
Step 4.0: 投入確認
PGPASSWORD=idpserver psql -U idpserver -d idpserver -h localhost -p 5432 -c "
SELECT
(SELECT COUNT(*) FROM idp_user) as users,
(SELECT COUNT(*) FROM idp_user_authentication_devices) as devices;
"
期待結果(10テナント × 10万ユーザー):
total_users | total_devices | tenant_count
-------------+---------------+--------------
1000000 | 1000000 | 10