負荷テストとストレス
負荷テストとストレス
1)なぜそれを必要とします
目的:- 容量を確認します(システムがSLOに耐えるRPS/競合セッションの数)。
- ボトルネック(CPU/IO/DB/ネットワーク/ロック/プール)を検索します。
- CI/CDでパフォーマンス予算とゲートを設定します。
- リリースのリスクを低減します(p95/p99回帰、ピークエラー増加)。
- 計画容量/コスト(スケールアウトと予約)。
2) perfテストの種類
負荷:ピークに近い現実的なトラフィック。SLO検証。
ストレス:限界値の上限値を超えた成長→分解動作。
スパイク:高速負荷ジャンプ→弾性/オートスケール。
浸漬/耐久性:時間/日→リーク、断片化、レイテンシードリフト。
容量/スケーラビリティ:スケールアウトでスループット/レイテンシがどのように変化するか;アムダル/グスタフソン法。
Smoke perf:各リリースに短い「smoke」が実行されます(パフォーマンスの尊厳)。
3)トラフィック生成モデル
VU/concurrency: 'N'ユーザーを修正しました。各ユーザーはクライアント上で→queueをリクエストします。過負荷を隠す危険性。
到着速度:実際の生活のように、λ強度(req/s)のアプリケーションの流れ。パブリックAPIの方が正しいです。
Little's Law: 'L=λ × W'。
プール/サービスの場合、最小並列性≈ 'λ × W'(在庫の20-50%を追加)です。
'λ'がスループットである場合、'W'は平均サービス時間である。
4)プロファイルとシナリオをロードする
ユーザージャーニーミックス:スクリプトの共有(ログイン、ブラウズ、入金、チェックアウト……)。
Think-time:ユーザーの一時停止(ディストリビューション:指数関数/lognormal)。
データプロファイル:応答のサイズ、ペイロード、パラメータの可変性。
相関:リアルフローと同様に、リンクステップ(クッキー/トークン/ID)。
コールド/ウォーム/ホットキャッシュ:個々の実行。
読み取りと書き込み:読み取り/レコードのバランス、リトレイのidempotency。
複数の地域:RTT、 POP/ASNによる配分。
5)テスト環境
アイソレーション:スタンドはトポロジー/設定で製品の近くにあります(ただし、製品を「ビート」しないでください)。
データ:PIIマスキング、ボリューム、売上指数。
負荷発生器:CPU/ネットワークに対して休まないで下さい;分散ランナー、時間同期。
観測可能性:メトリック/トレイル/ログ、周囲の合成、CPU/ヒーププロファイルのエクスポート。
6)メトリクスとSLI
スループット: RPS/トランザクション/秒
レイテンシー:p50/p95/p99、 TTFB、サーバー時間vsネットワーク。
エラー:5xx/4xx/ドメインエラーの共有。
飽和:CPU、負荷avg、 GC、 ディスクIOps/レイテンシ、ネットワーク、プール待ち。
ビジネスSLI: ≤ 5s沈殿物の成功、≤ 2s順序の確認。
SLOからしきい値を取得します(例:"99。95% ≤ 300ミリ秒)、実行中のモニター燃焼率。
7)ボトルネックの発見(技術)
1.一貫して目標負荷の60-80%によってシステムを暖めて下さい。
2.ステップの増加(ランプ)→p95/p99とエラー率が増加する問題を修正しました。
- プール内のキュー(DB/HTTP)、
- WAIT/ロック (DB)の増加、
- GC-pauses/heap、
- ネットワークリトランスミット/パケット損失、
- ディスク遅延/キャッシュのミス。
- 4.ローカライズ:クエリパス、プロファイラ(CPU/alloc/lock-profile)によるバイナリ検索。
- 5.「ボトル」→チューニング→実行を繰り返すのを修正しました。
8)ストレス下での行動
優美な劣化:限界、回路遮断器、バックプレスキュー、処理に受け入れられます。
リトレイ:最大1、 idempotentのみ;ジッタ;リトレイ予算≤ RPSの10%です。
Fail-open/Fail-closed:重要でない依存関係の場合、fail-open(キャッシュ/スタブ)を許可します。
カスケード障害:プール/クォータ(隔壁)の分離、高速タイムアウト、関数(フィーチャーフラグ)の「スムーズ」無効化。
9)ツール(タスクの選択)
k6 (JavaScript、オープン/オープンモデル、高速、CIで便利)。
JMeter(エコシステム、GUI/CLI、プラグインが豊富だが重い)。
ガトリング(Scala DSL、高性能)。
Locust (Python、スクリプトの柔軟性)。
ベジータ/hey/wrk(マイクロベンチとクイックチェック)。
規則:PRの煙ペンのための1つの「主要な」用具+軽いCLI。
10)例(スニペット)
10.1k6(到着率のオープンモデル)
js import http from 'k6/http';
import { sleep } from 'k6';
export const options = {
scenarios: {
open_model: {
executor: 'ramping-arrival-rate',
startRate: 200, timeUnit: '1s',
preAllocatedVUs: 200, maxVUs: 2000,
stages: [
{ target: 500, duration: '5m' }, // до 500 rps
{ target: 800, duration: '5m' }, // стресс
{ target: 0, duration: '1m' }
]
}
},
thresholds: {
http_req_duration: ['p(95)<300', 'p(99)<800'],
http_req_failed: ['rate<0.005'],
},
};
export default function () {
const res = http.get(`${__ENV.BASE_URL}/api/catalog?limit=20`);
sleep(Math.random() 2); // think-time
}
10.2 JMeter(プロフィールのアイデア)
Thread Group+Stepping Thread(オープンライク)
HTTPリクエストのデフォルト、Cookie Manager、 CSV Data Set。
バックエンドリスナー→InfluxDB/Grafana;時間/コードによるアサーション。
10.3 Locust (Python)
python from locust import HttpUser, task, between class WebUser(HttpUser):
wait_time = between(0.2, 2.0)
@task(5)
def browse(self): self.client.get("/api/catalog?limit=20")
@task(1)
def buy(self): self.client.post("/api/checkout", json={"sku":"A1","qty":1})
11)データ、相関、準備
シードデータ:ディレクトリ、ユーザー、残高、トークン-売上と同様に。
PIIマスキング/匿名化;実際の分布の上に合成を生成します。
相関:レスポンス(RegExp/JSONPath)からID/トークンを抽出し、その後のステップで使用します。
12)実行中の観察可能性
ルートに沿ったREDダッシュボード(レート、エラー、期間)。
例題-メトリクスからトレース(trace_id)への遷移。
エラーログ:sampling+aggregation、 duplicates/idempotence。
システム:CPU/GC/ヒープ、ディスク/ネットワーク、プールの待機。
DB:トップクエリ、ロック、インデックススキャン、bloat。
13)オートメーションおよび性能のゲート
CI:マージ時のショートラン(例:k6 2-3分)しきい値で。
毎晩/毎週:別の媒体で長い浸漬/ストレス;レポートとトレンド。
カナリアリリース:プロモーションの「ゲート」としてのSLO (error-rate、 p95)の分析。
リグレッション:ベースラインと現在のビルド;劣化時のアラート>X%。
14)容量の計画および費用
カーブのスループット→レイテンシ:膝のポイントを定義します。
スケールアウト:スケーリング効率(RPSデルタ/ノードデルタ)を測定します。
費用:「1時間あたりのRPS」、ピークイベントの予約+DR-reserve。
15)アンチパターン
「空の」環境で制御やテストせずにprodにビート、prodのようではありません。
オーバーロードを隠す固定VUを備えたクローズドモデル。
think-time/data→非現実的なキャッシュ・ヒットの欠如、またはその逆-ソースへのストーム。
カスタムフローの代わりに1つの「/ping「スクリプト。
観測可能性の欠如:"我々は、RPSと平均遅延のみを参照してください。
制御されていないリトレイ→自己DDoS。
仮説/変更を修正せずにテストと最適化をミックスします。
16)チェックリスト(0-30日)
0-7日
SLI/SLOとターゲットトラフィックプロファイル(mix、 think-time、 data)を定義します。
ツール(k6/JMeter/Locust)を選択し、REDダッシュボードを上げます。
スタンドとシードデータを準備し、サードパーティの制限/キャプチャを無効にします。
8-20日
ビルドシナリオ:オープンモデル(到着率)、コールド/ウォーム/ホットキャッシュ。
負荷→応力→スパイクを実行します。膝のポイントおよびボトルネックを修理して下さい。
CI(マイクロラン)でパフォーマンスゲートを実装します。
21-30日
浸るテスト4-24h: GCの漏出/ドリフト、安定。
ドキュメントリミット、容量プラン、「RPS→p95/oshibki」イラスト。
runbookを準備する「制限/スケールを増やす方法」と「劣化する方法」。
17)成熟度の指標
トラフィックの≥ 80%をカバーする現実的なプロファイル(ミックス、think-time、データ)があります。
REDダッシュボード+トレースはすべてのテストに接続されています。
パフォーマンスゲートは、p95/errorsを取り消すときにリリースをブロックします。
容量と膝のポイントは、主要なサービスによって文書化されています。
毎月の浸漬/ストレスランと進捗レポート。
「スパイク」への抵抗はオートスケールおよびカスケード失敗の不在によって確認されます。
18)結論
負荷テストは、1回限りの測定ではなく、通常のエンジニアリング実践です。"モデルリアルユーザー(オープンモデル)、クライアントの経験(SLI/SLO)を反映したものを測定し、CI/CDの観測性とゲートを維持し、ストレス/スパイク/ソークランを実行し、膝のポイントを修正します。その後、ピークイベントとブラックスワンは管理可能なシナリオに変わり、パフォーマンスはプラットフォームの予測可能で測定可能なパラメータに変わります。