# Retroactive Sampling ## 定義 レトロアクティブサンプリング(retroactive sampling)は、[[トレースサンプリング|テールサンプリング]]の課題(中央コレクタでの大量メモリ・CPU・ネットワーク消費)を解決する分散トレーシングのサンプリング手法。**サンプリング判断に必要な最小属性のみ**を中央コレクタへ送信し、生スパンはエッジエージェント上の**オンディスク FIFO キュー**にバッファリング。採択決定後に必要なスパンだけを引き出してストレージへ転送する。 起源は NSDI 2023 論文 "The Benefit of Hindsight: Tracing Edge-Cases in Distributed Systems"(Lei Zhang ほか)。[[VictoriaMetrics]] の[[Zhu Jiekun]]が KubeCon EU 2026 でプロトタイプを発表した。 ## テールサンプリングとの比較 | 軸 | テールサンプリング | レトロアクティブサンプリング | |--|--|--| | 中央コレクタへの転送 | 全スパン(1 KB+/件) | 最小属性のみ(**33 バイト**) | | バッファ場所 | 中央コレクタのメモリ | エッジエージェントのディスク(FIFO) | | 採択率 10% 時の不要転送 | 100% を転送→90% を破棄 | 10% のみ転送 | | ネットワーク圧縮後削減 | 基準 | **70% 削減** | | CPU 削減 | 基準 | **60–70% 削減** | | メモリ削減 | 基準 | **60–70% 削減** | | ディスク使用量 | 0(全量メモリ保持) | 1.7 GB(テールサンプリングの 4 GB メモリと交換) | ## 動作原理 ### 最小属性の抽出と送信 サンプリング判断に必要な属性は最小限。エラーや高レイテンシを判断するには `trace_id` + `start_time` + `end_time` + `status_code` の 33 バイトで十分であり、フルスパン(1 KB 以上)の大部分は判断に不要である。 ### オンディスク FIFO キューによるバッファリング 1. スパンのバッチをバイナリ形式にマーシャリングし、タイムスタンプ付きブロックとして FIFO キューへ書き込む 2. バックグラウンドワーカーがタイムスタンプヘッダを読みながら逐次消費する 3. 設定した保持期間(例: 1 分)を超えたスパンに対し、インメモリの trace_id ルックアップテーブルで採択フラグを確認する 4. 採択されたスパンはストレージへ転送し、非採択は破棄する FIFO への逐次アクセスはランダム I/O を避けるため、Pebble(KVストア)ベースのディスク型テールサンプリングが CPU を 649% 増加させるのと対照的に、CPU コストを削減できる。 ## 変形: ローカル + レトロアクティブサンプリング サンプリング判断を集約必須型と非集約型に分類できる。非集約型(例: エンドポイント値による判断)はエージェントがローカルで判断し、採択 trace_id のみ中央へ伝達(1 バイト)する。これにより複雑な条件も追加帯域幅を最小に抑えて処理できる。 ## Pebble ベースのディスク型テールサンプリングとの比較 OpenTelemetry コミュニティが提案した代替案。 | 手法 | メモリ変化 | CPU 変化 | |--|--|--| | Pebble ベースのディスク型テールサンプリング | 81% 削減 | **649% 増加** | | レトロアクティブサンプリング(FIFO) | 60–70% 削減 | **60–70% 削減** | Pebble ベースは KVストアの trace_id ランダムルックアップが CPU を爆発させる。FIFO 設計はランダム I/O を逐次 I/O に変換することでこれを回避する。 ## 横断的知見 - **「計装側での削減」の具体実装**: [[Scaling Telemetry Workloads]] の設計指針「文脈豊富な両端で削減する」を、エージェント側でのサンプリング属性絞り込みとして具現化した。中央コレクタへの転送量を 90% 以上削減する。(Source: [[@2026__VictoriaMetrics Blog__KubeCon EU 2026 Retroactive Sampling]]) - **ディスク vs メモリのトレードオフは I/O パターンが支配する**: ランダム I/O(KVストア)は CPU を爆発させるが、逐次 I/O(FIFO)は CPU コストを維持したままメモリをディスクで代替できる。この知見はサンプリング以外のデータバッファリング設計にも一般化できる。(Source: [[@2026__VictoriaMetrics Blog__KubeCon EU 2026 Retroactive Sampling]]) ## 未解決の問い - [[トレースサンプリング]]の概念ページで示された TraStrainer の「ランタイム状態を加味したテールサンプリング」とレトロアクティブサンプリングを組み合わせた場合の効率・品質トレードオフは未検証 - エッジエージェントのディスク容量が制約となるシナリオ(組み込み・エッジコンピューティング)での適用可能性 - 採択率が極めて低い(< 1%)ケースで FIFO 保持期間の最適化がどこまで効くか ## 関連 - ソース: [[@2026__VictoriaMetrics Blog__KubeCon EU 2026 Retroactive Sampling]] - 概念: [[トレースサンプリング]] / [[分散トレーシング]] / [[Scaling Telemetry Workloads]] / [[テレメトリ]] - エンティティ: [[VictoriaMetrics]] / [[VictoriaTraces]] / [[Zhu Jiekun]] / [[OpenTelemetry]] / [[OpenTelemetry Demo]] - 関連 MOC: [[SRE - MOC]]