負荷および応力テスト
1)利用規約と目的
負荷テスト-SLOに対する作業範囲(ターゲットRPS/競合)のテスト(例: p95 <200 ms、エラー率<0)。5%).
ストレステスト-(CPU/DB/ネットワークの飽和前後)を超えて、劣化と回復のメカニズムを観察します。
スパイクテスト-急激な負荷バースト(数分で× N)。
浸漬/耐久性-長期(時間/日)リーク、GCドリフト、断片化、キューの成長を見つけるために。
容量テスト-スループット(飽和点)と埋蔵量の高原の計算。
目標:SLOを確認し、高原を修正し、ボトルネックを理解し、自動スケーリングと制限を調整します。
2)交通モデル: 開いた対閉鎖した
クローズドモデル(concurrency-driven):一定の数のバーチャルユーザー(VU)。
オープンモデル(到着率):応答に関係なく、リクエストの固定率(RPS)。
リトルの法則: 'L=λ W'
'L'は同時にサービスリクエストの平均数です、
'λ'-強度(RPS)、
'W'は平均応答時間です。
したがって、ジェネレータの必要な競争力の評価:"並行性≈ target_RPS p95_latency'。
3)メトリクス: 私たちが測定するもの
遅延SLI: p50/p90/p95/p99およびp99の尾。9;「hot」パスと「cold」パスを分離します。
エラー:'5xx'、 '4xx'(有効/無効)、タイムアウトが中止されました。
スループット:持続RPS、スループットストリーム/バイト。
リソース:CPU、 RAM/ヒープ、 GCの一時停止、ディスクIOPS/lat、ネットワーク帯域幅、接続数/FD。
キューとバックプレッシャー:深さ、待ち時間、shed/limitedリクエストの数。
キャッシュ効率:ヒット/ミス、ウォームアップ嵐。
DB/キャッシュ/キュー: p95リクエスト、ロック、競合、プール使用率。
4)立場およびデータ
設定等価性:ソフトウェアバージョン、制限(uLimit、 conntrack)、 JVM/GC構成、プール。
トポロジ:LB、 CDN、 WAF、 TLS、同じネットワーク「ホップ」。
データ:現実的な分布(オブジェクトのサイズ「、ホット「/」コールド「キー、地域性)。
冷たい/暖かい/熱い開始:個々の操業;必ず「cold」キャッシュをテストしてください。
バックグラウンドアイソレーション:無関係なジョブ/クロノムを無効にするか、その効果を説明します。
5)シナリオ(ロードプロファイル)
1.ベースライン:目標RPSへのステップ加速、保持10-30分。
2.ランプ&ホールド:ターゲット、保持→テール分析の上のX%へのスムーズな成長。
3.スパイク:インスタント× 2- × 5スプラッシュ1-5分間、その後、戻ります。
4.失敗への圧力:失敗へのステップ;最初のSLO障害ポイントと「break」ポイントを修正しました。
5.浸る:交通(昼/夜)の可変性の6-24時間、表面/漂流のための腕時計。
6.混合:実際の分布(Zipf/pareto)によるエンドポイントの混合物、異なる重み。
6)ステップバイステップのプロセス
SLOとターゲットトラフィックプロファイルを定義します。
荷重モデル(オープン/クローズ)、到着率またはVUを設定します。
データと「ホット「/」コールド「モードを用意します。
テレメトリー(trails/metrics/logs)、テスト実行との相関関係を設定します。
ウォームアップと実行、アーティファクトの収集(CPU/ヒーププロファイル、フレームグラフ、説明/スローログDB)。
ボトルネック分析、アクション項目の形成。
修正後の再プロゴン、ベースラインの更新と容量のプレイブック。
7)ボトルネックと典型的な修正
CPUバウンドサービス:プロファイリング→ホット関数の排除、割り当て、ブランチ;ベクトル化、キャッシュに優しい構造。
Network/TLS: keep-alive、 HTTP/2/3、接続プール、正しいタイムアウト、チャットの短縮。
DB:インデックス、バッチ処理、準備済みクエリ、接続プール、R/W分離、結果キャッシュ、クエリ重複排除。
キャッシュ:サイズ、TTL、要求合体、嵐の保護、温暖化、地域のボール。
キュー/ブローカー:受け入れ制限/並列性、バッチのサイズ、idempotent消費者、DLQ天井。
ごみ/一時停止:GCチューニング、バッファレンタル、合理的な範囲内のオブジェクトプール。
I/O/ディスク:非同期I/O、圧縮、合理的なレベルの応答の圧縮。
8)限界および保護
予算のタイムアウト:カスケードを避けるために、上から下へ。
レートリミット/トークンバケット:「長死」ではなく予測可能な劣化。
遮断器および低い優先順位の飽和の陰影。
Backpressure:信号とチェーンの奥深くにある並行性を拘束します。
隔壁:クリティカルエンドポイントのための分離プール。
Idempotency:リトレース下での安全な繰り返しのためのキー。
9)ツールとそれらを選択するとき
k6-laconic JS、到着率、統合、グラフの優れたサポート。
ガトリング-Scala DSL、高性能ジェネレータ。
JMeter-柔軟で豊富な生態系;プロトコル/プラグインに便利です。
Locust-複雑なユーザーフローのロジックに便利なPythonスクリプト。
Vegeta/hey/wrk-マイクロベンチとポイントはHTTP上で実行されます。
tc/netem、 toxiproxy-ネットワーク劣化注入。
Flamegraph/profiler-CPU/ヒープホットスポットを検索します。
10)例(スケッチ)
k6(オープンモデル、ミックスエンドポイント)
javascript import http from 'k6/http';
import { check, sleep } from 'k6';
export const options = {
scenarios: {
open_model: {
executor: 'constant-arrival-rate',
rate: 800, timeUnit: '1s', duration: '20m',
preAllocatedVUs: 500, maxVUs: 2000
}
},
thresholds: {
'http_req_duration{kind:hot}': ['p(95)<200'],
'http_req_failed': ['rate<0. 005']
}
};
export default function () {
const r = Math. random();
let res;
if (r < 0. 6) {
res = http. get('https://svc/api/hot', { tags: { kind: 'hot' }});
} else if (r < 0. 9) {
res = http. get('https://svc/api/warm', { tags: { kind: 'warm' }});
} else {
res = http. post('https://svc/api/heavy', JSON. stringify({ n: 1000 }), { headers: { 'Content-Type': 'application/json' }});
}
check(res, { 'status is 2xx': (r) => r. status >= 200 && r. status < 300 });
sleep(0. 2);
}
ガトリング(ステップとスパイク)
scala setUp(
scn. inject(
rampUsersPerSec(50) to 500 during (10 minutes),
constantUsersPerSec(500) during (20 minutes),
spikeUsers(2000). during(30. seconds)
)
). protocols(http. baseUrl("https://svc"))
負荷計画(YAMLスケルトン)
yaml profile: "mix-traffic"
targets:
- endpoint: GET /api/hot weight: 0. 6
- endpoint: GET /api/warm weight: 0. 3
- endpoint: POST /api/heavy weight: 0. 1 schedule:
- step: { rps: 300, hold: 10m }
- step: { rps: 600, hold: 10m }
- step: { rps: 900, hold: 10m }
guardrails:
slo:
p95_ms: 200 error_rate: 0. 5%
abort_if:
- metric: error_rate op: ">"
value: 2%
window: 2m
11)オートメーションとライフサイクル
各PRでPerf-smoke(キーエンドポイントの短い実行)。
夜の「容量」は、レポートとプロファイルアーティファクトでステージ上で実行されます。
CI/CDのゲート:ベースラインまたはエラー率の増加のp95/p99> X%を取り戻すときのビルドファイル。
ベースラインのバージョニングとアーティファクトとしてのプロファイル/フラメグラフの保存。
関連タグ:どのサービス/エンドポイントがカバーされ、トラフィックプロファイルが使用されます。
12)アンチパターン
同じ機械の発電機およびテストサービス→歪んだ結果。
APIbacks→undershootingとmisjudgmentのクローズドモデル(VU)のみ。
コールドスタートなしで空のデータベース/キャッシュで実行されます。
現実的なディストリビューションはありません(すべてのクエリは同じです)。
テレメトリーなし(RPS/レイテンシはジェネレータ側のみ)。
安定したベースラインと環境制御のない比較。
原因を修正するのではなく、タイムアウトの増加による「最適化」。
13)建築家のチェックリスト
1.SLOと標準/ピーク負荷が定義されていますか?
2.正しいモデル(オープン/クローズ)が選択され、トラフィックプロファイルが記述されていますか?
3.スタンドはコンフィギュレーションとトポロジーに相当しますが、コールド/ホットモードはありますか?
4.テレメトリーとプロファイルを有効にし、タグ付けされた傷をテストしますか?
5.実行:ベースライン/ランプ/スパイク/ストレス/浸漬-カバー?
6.飽和ポイントは固定され、安全マージンは計画されていますか?
7.設定された制限、ブレーカ、バックプレッシャー、idempotency、シェーディングポリシー?
8.p95/p99回帰とエラー率のCIゲートはありますか?ベースラインはバージョン管理されていますか?
9.修正後-reprogonとplaybookの電源アップデート?
10.自動ズームと緊急時の計画が文書化されていますか?
お知らせいたします
負荷とストレステストは、1回限りの「レース」ではなく、継続的なエンジニアリングの練習です。現実的なトラフィックモデル、正しいスタンド、CI/CDのテレメトリーとオートメーションは、パフォーマンスを「秘密の魔法」からメートル駆動の能力に変えます。天井がどこにあるか、在庫がどのように安全であるか、そして変更が実際にユーザーエクスペリエンスを向上させるかを知っています。