ベンチマークとパフォーマンスの比較
概要
ベンチマークは実験であり、5分間のラン・ラックではありません。"主な原則:1.仮説と指標を定式化する。
2.制御変数(ハードウェア、コア、電源、バックグラウンドノイズ)。
3.十分なデータ(レプリカ、信頼区間)を収集します。
4.プロファイリングを行う-それがなければ、あなたは「理由」を理解することはできません。
5.repro:スクリプト、バージョンとアーティファクトを修正します。
ベンチマーク目標とビジネス指標
スループット: RPS/QPS/CPS、書き込み/秒
レイテンシー:p50/p95/p99/尾の密度。
効率:Cost-per-1k RPS、トランザクションあたりのワット、$/ミリ秒の改善。
安定性:ジッタ、サイクル間/ノードの可変性。
弾力性:N ×リソースでの指標のスケーリング方法(Amdahl/Gustafsonベンチマーク)。
方法論: 実験的な設計
仮説: 「Envoy with HTTP/3は同じRPSでp95 TTFBを10-15%削減する」
比較の単位:ironのbuild/config/instanceバージョン。
A/Bダイアグラム:同一の環境で並列実行。またはABAB/Latin Squareは漂流の影響を減らすために。
繰り返しの数:安定した評価のための構成ごとの10の短い+3つのロングランを≥して下さい。
統計:中央値、MAD、ブートストラップ信頼区間;non-parametric tests (Mann-Whitney) for 「tailed」 distributions。
DoE(最小):一度に1つの変数(OVAT)または2-3因子の因子の因子因子を変更します(例えば、TLSプロファイル× HTTPバージョン×カーネル)。
可変および騒音制御
CPUガバナー:'パフォーマンス';「節電」を無効にします。
ターボ/スロットリング:モニタリング周波数、温度、スロットリング(そうでなければウォームアップは偽の賞金を与えます)。
NUMA/ハイパースレッディング: ピンIRQとプロセス('taskset/numactl')、メモリの局所性を測定します。
C 状態/IRQバランス:設定を修正します。ネットワークテスト-特定のコアのIRQピン。
バックグラウンドプロセス:クリーンノード、cron/backup/antivirus/updatedbをオフにします。
ネットワーク:安定した道、固定MTU/ECN/AQMのチャネルのフラッタ無し。
データ:同じセット、カーディナリティ、ディストリビューション。
キャッシュ:「cold」(最初のパス)と「warm」(繰り返し)モードを分離し、明示的にマークします。
ベンチマーククラス
1)マイクロベンチマーク(機能/アルゴリズム)
目的:特定のコード/アルゴリズムを測定します。
ツール:組み込みのベンチフレームワーク(Go 'testing。B'、JMH、 pytest-benchmark)。
ルール:JITウォームアップ、ミリ秒→ナノ秒;GCの分離;種子を固定しました。
2) Mesoベンチマーク(コンポーネント/サービス)
1つのノード上のHTTPサーバ、キャッシュ、ブローカー、データベース。
ツール:wrk/wrk2、 k6(オープンモデル)、ベジータ、ghz (gRPC)、フィオ、sysbench、 iperf3。
ルール:接続/ファイル制限、プール;CPU/IRQ/GCレポート。
3)マクロベンチマーク(e2e/リクエストパス)
完全な方法:CDN/edge→proxy→service→DB/cache→answer。
ツール:k6/Locust/Gatling+RUM/OTelトレース;現実的なルートが混在しています。
ルール:現実に近い(「汚い」データ、外部システムのラグ)、きちんとレトラと。
レイヤー別メトリック
テストテンプレートとコマンド
ネットワーク(TCP/UDP):bash iperf3 -s # server iperf3 -c <host> -P 8 -t 60 # parallel, stable bandwidth
HTTPサーバ(安定したロード、wrk2):
bash wrk2 -t8 -c512 -d5m -R 20000 https://api. example. com/endpoint \
--latency --timeout 2s
オープンモデル(k6、到着率):
javascript export const options = {
scenarios: { open: { executor: 'constant-arrival-rate', rate: 1000, timeUnit: '1s',
duration: '10m', preAllocatedVUs: 2000 } },
thresholds: { http_req_failed: ['rate<0. 3%'], http_req_duration: ['p(95)<250'] }
};
ディスク(フィオ、4kランダム読み取り):
bash fio --name=randread --rw=randread --bs=4k --iodepth=64 --numjobs=4 \
--size=4G --runtime=120 --group_reporting --filename=/data/testfile
データベース(sysbench+PostgreSQLサンプルアイデア):
bash sysbench oltp_read_write --table-size=1000000 --threads=64 \
--pgsql-host=... --pgsql-user=... --pgsql-password=... prepare sysbench oltp_read_write --time=600 --threads=64 run
メモリ/CPU (Linux perf+stress-ng):
bash perf stat -e cycles,instructions,cache-misses,L1-dcache-load-misses \
-- <your_binary> --bench
統計と有効性
Replicates:最小10回の実行、外れ値を除外(堅牢:中央値/MAD)。
信頼区間:p95/p99および手段のブートストラップ95% CI。
エフェクトサイズ:相対的な変化とそのCI(例− 12% [− 9%; − 15%])。
実用的な意義:+30% CPUの価格でp95の10%の減少-それは価値がありますか?
グラフ:ディストリビューション用のヴァイオリン/ECDF、「彩度曲線」(RPS→レイテンシー)。
ボトルネックプロファイリングとローカリゼーション
CPU: 'perf'、 'async-profiler'、 eBPF/pyroscope;前後のフラメグラフ。
Alloc/GC:ランタイムプロファイル(Go pprof/Java JFR)。
I/O: 'iostat'、 'blktrace'、 'fio --lat_percentiles=1'。
Сеть: 'ss -s'、' ettool -S'、'dropwatch'、'tc -s qdisc'。
「EXPLAIN (ANALYZE、 BUFFERS)」、 pg_stat_statements、 slowlog。
現金:トップキー、TTL、立ち退きの原因。
レポートとアーティファクト
修正するもの:- git SHAビルド、コンパイル/最適化フラグ。
- カーネル/ネットワークコンフィギュレーション(sysctl)、 ドライババージョン/NIC/ファームウェア。
- トポロジー(vCPU/NUMA/HT)、ガバナー、温度/周波数。
- データ:サイズ、カーディナリティ、分布。
- 公開するもの:p50/p95/p99テーブル、エラー/秒、スループット、リソース(CPU/RAM/IO)、 CI。
- アーティファクト:スクリプト、グラフ、フラメグラフ、生のJSON/CSV結果、環境プロトコルを実行します。
公正なベンチマーク
同一のリミッター(コンプール、キープアライブ、チェーンTLS、 OCSPステープル)。
ネゴシエートされたタイムアウト/リトレイとHTTPバージョン(h2/h3)。
温度バランス:平衡までウォーミング(ターボブースト効果なし)。
フェアキャッシュ:「寒い」または「暖かい」のいずれか。
ネットワーク対称性:同じルート/MTU/ECN/AQM。
時間予算:DNS/TLS/connect-明示的にカウントするか、等しく除外します。
アンチパターン
1回の実行→「output」。
1つのシリーズのモード(部分の冷たい、部分の暖かい)の混合。
Internet load→falseの「安定性」のためのオープンなモデルの代わりに閉じたモデル。
カウントされていないリトレイ→「RPSが成長」テイクとカスケードのコストで5xx。
異なった腺/中心/力の回路の比較。
プロファイリング→ブラインド最適化なし。
プロファイル解析→テール回帰なしでGC/ヒープで遊ぶ。
実用的なレシピ
最低のベンチのパイプラインのステップ:1.環境を修正しました(スクリプト'env_capture。sh')。
2.ウォームアップ(5〜10分)、記録周波数/温度。
3.ショート+1ロングランのN反復を行います。
4.プロファイル(CPU/alloc/IO)をピーク時に削除します。
5.CI/グラフを計算し、アーティファクトを収集します。
6.解決策:仮説を受け入れ/拒否し、次のステップを形成します。
容量のカーブ:- RPSステップ(ステップの10%)→p95/エラーを修正→「膝」を見つけます。
- RPS→レイテンシとRPS→CPUのスケジュールを構築します。境界線とさらに%のコストが表示されます。
iGaming/fintech固有の
1ミリ秒あたりのコスト:$effect (変換/解凍/PSP制限)によるランクの向上。
ピーク(試合/トーナメント):TLS/CDN/キャッシュがウォームアップされたspike+plateauベンチマーク。
支払い/PSP:サンドボックス制限、idempotency、劣化に対する反応でエンドツーエンドを測定します。fixプロキシメトリックを使用したTime-to-Wallet。
不正防止/ボットフィルタ:マクロベンチ(偽陽性レート、レイテンシ添加)にルールプロファイルを含める。
リーダー/ジャックポット:ホットキー/ランキング、ロック、原子性をテストします。
ベンチマークチェックリスト
- 仮説/指標/成功基準。
- 可変監視(power/NUMA/IRQ/network/cache)。
- プランの実行(レプリカ、期間、ウォームアップ)
- 冷たい/暖かい分離。
- プロファイリングが有効(CPU/alloc/IO/DB)。
- 統計:CI、意義テスト、グラフ。
- リポジトリ内のアーティファクトとリプロスクリプト(ベンチのIaC)。
- 「改善コスト」と推奨事項を報告する。
- 回帰perf。
ミニレポート(テンプレート)
目標は、CPUの成長なしでp95 APIを15%削減することです>10%。
方法:A/B、 k6オープンモデル1k rps、 10 × 3実行、ウォームキャッシュ。
合計:p95 − 12% [− 9%; − 15%]、 CPU+6%、 5xx変更なし。
フラメグラフ:JSONシリアル化(− 30% CPU)、ボトルネックがデータベースに移行しました。
意思決定:最適化を受け入れる。次のステップはデータベースリクエストをバッチすることです。
アーティファクト:グラフィックス、プロファイル、構成、raw JSON。
合計
良いベンチマークは厳格な方法論+公正な比較+統計的妥当性+プロファイリング+再現性です。仮説を立て、環境を制御し、信頼の間隔を読み、アーティファクトを公開し、改善のコストについて決定を下す。だから、プレゼンテーションで美しい数字を得ることはできませんが、プラットフォームの速度と予測可能性の実際の増加。