
2026/09/01 22:41
Zstandard と Pingora を活用すれば、キャッシュストレージの容量をペタバイト単位で節約できます。
RSS: https://news.ycombinator.com/rss
要約▶
Japanese Translation:
Cloudflare は、インターン・プログラムの 1.1.1.1 インターンプログラムを通じて実装した「Cache Transcoding」機能のプロトタイプを開発しました。この機能は、2016 年にオープンソース化された高速でロスレスなアルゴリズムである Zstandard(zstd)を活用し、キャッシュレイヤー内で直接対象となるテキストアセットを圧縮します。システムは zstd レベル 3 を適用し、わずかな CPU リソースの増加に対して、格納容量およびクロスデータセンター帯域幅の大幅な削減を実現しています:初期テストの結果、ディスク上のサイズが元の約 3 分の 1 にまで削減され、圧縮率は約 2.8 倍となりました。対象となる条件は、HTML、JSON、CSS、JavaScript のような圧縮可能なテキストタイプ(200 OK レスポンスであり、以前に Content-Encoding が付与されていないもの)で、かつサイズが 4 KiB を超える場合です。メディアファイルは CPU コストがかかる割にメリットがないため除外されています。キャッシュフィルloff 時のエンコードコストはバイトあたり約 4.31 ns(約 232 MB/s)、デコードは各リクエストで約 1.56 ns per byte(約 641 MB/s)で発生します。10 サーバーのキャッシュにおいて 100 万件以上のリクエストをテストし、設計が CPU ブジェット内で動作し、コンテンツの整合性が保たれていることを確認しました。キャッシュ密度を高めることで、貴重なコンテンツの破棄リスクを低減し、インフラコストを削減します。今後の取り組みでは、より高い圧縮レベル、より広いコンテンツタイプ・サイズの対応、および圧縮済みオブジェクトを下流コンポーネントへ直接渡す評価を行う予定です。これにより、最適化されたフォーマットを効率的に処理できるユーザーのレイテンシ低下が実現する可能性があります。
本文
ピングオラ「キャッシュ変換」によるメモリコスト削減とストレージ効率化の実現
クラウドフレードルにおいて RAM と HDD の価格が急騰する中、効率的なメモリアクティブ活用によりサービスの継続性を保つため、実効的なキャッシュ容量を増やすプロトタイプを 개발했습니다。これにより、CPU リソースのわずかな増加分に対し、ストレージおよびデータセンター間転送(バックボーン)の使用量を大幅に削減することに成功しました。
この仕組みは「キャッシュ変換(Cache Transcoding)」と呼ばれ、キャッシュ保存時に資産を Zstandard 符号化し、配信時に復号化するアーキテクチャです。
キャッシュ変換の概要
基本概念
- 処理フロー: データセンター間で移動しキャッシュに格納される際、ディスク書き込み前に Zstandard(zstd) で圧縮します。
- 保存形態: 圧縮された形式のままティアードキャッシュを通じてデータセンター間を移動。
- 配信時: クライアントへのレスポンス配信時にのみ復号化されます。
効果とトレードオフ
- ディスク容量削減: 符号化により対象資産のディスク上サイズを平均して 約 3 分の 1 に削減可能。
- CPU コスト: オリジンへのプロキシ処理でわずかな追加 CPU コストが発生しますが、これはペタバイト単位の実効キャッシュ確保と帯域幅削減に見合う代償です。
- コスト構造:
- 符号化コストは資産がキャッシュに保存される際に一度のみ。
- ストレージおよび帯域幅の節約効果は、その資産が再利用されるたびに得られます。
Zstandard (zstd) の特徴
Zstandard は Facebook 開発、2016 年オープンソース化された非可逆圧縮アルゴリズムです。
- 特性: 復号化した後に元のデータと完全一致するバイトを保持し、コンテンツ自体は変更せず表現方法を自在に変換できます。
- 性能バランス:
- Brotli: 約 42% 高速でありながらほぼ同等のファイルサイズを実現。
- gzip: 同じく同等の速度で約 11.3% 小型化を実現。
- キャッシュ変換では大量トラフィックを扱うため、符号化・復号化双方の高速性が求められます。
- 採用設定: プロトタイプでは zstd レベル 3 を採用(圧縮メリットの大半を得つつ CPU ボトルネックを防ぐバランス)。
ストレージ戦略と適格化基準
従来アプローチとの違い
- 従来: オリジンからのレスポンスをそのまま(無圧縮または既存符号化)ディスク保存および転送。
- キャッシュ変換: キャッシュ内部で追加の圧縮層を適用する仕組みです。
すべてのデータを圧縮すべきではない
画像、動画、フォントなどは既に最適化されているため再圧縮は無駄です。
| コンテンツタイプ | リクエスト数比率 | データ量比率 | 処理判断 |
|---|---|---|---|
| メディア (画像/動画等) | 21.4% | 63.3% | ❌ 再圧縮しない(CPU コスト対効果低) |
| テキスト (HTML, JSON 等) | 67.3% | 22.3% | ✅ 対象外圧縮(大部分は未圧縮で再圧縮可能) |
- テストコーパスでの圧縮率:約 2.8 倍
- テスト結果:管理されたテストコーパスにおいて、対象資産は概ね 2.83 倍 に圧縮されました。
コスト対効果の詳細
| 項目 | 値・説明 |
|---|---|
| 圧縮率 | 2.83 倍 |
| 符号化コスト | バイトあたり (約 232 MB/s)、保存時に一度課金 |
| 復号化コスト | バイトあたり (約 641 MB/s)、配信時に毎回課金 |
- 符号化の方がバイト単位のコストは高いですが、キャッシュ保存頻度远比クライアント配信回数が多いため、全体としての節約効果が明確です。
- メリット: ディスク上のデータ量減少 → サーバーごとの保持オブジェクト数増加 → キャッシュ密度向上 → スペース効率化。
動作メカニズム:キャッシュ変換の仕組み
システム内の各ステージにおける処理フローです。
-
キャッシュミス時(新規保存)
- ピングオラベースのプロキシが、ディスク書き込み前に本体を
で符号化。zstd - キャッシュメタデータに「保存表現は圧縮済み」「元コンテンツ長保持」と記録。
- プロキシ离开時に、本体を元のアイデンティティ表現へ復号化。
- ピングオラベースのプロキシが、ディスク書き込み前に本体を
-
キャッシュヒット時(既存資産利用)
- ディスクから
オブジェクトを読み取り復号化。zstd - テアードキャッシュでは、圧縮形式のまま上層→下層へ転送。
- クライアントへのホップ(通信経路)時点でのみ復号化。
- ディスクから
-
フルキャッシュミス時(オリジンからの取得)
- 上層ティアがオリジンからアイデンティティバイトを取得。
- バイトを一度符号化して
で保存し、圧縮形式のまま下層ティアへ転送。zstd - 下層ティアも同様に保存し、必要に応じて復号化。
-
ティアードキャッシュの転送(下層ティアミス時)
- 上層ティアにオブジェクトが存在する場合、オリジンを介さない直接移動が可能。
- 有線およびディスク上は圧縮状態を維持。下層ティアで一度復号化のみ。
-
下層ティアにオブジェクトがある場合
- ネットワーク転送や符号化不要。
- 下層ティアがディスクから
バイトを読み取り復号化、次へ渡す。zstd
- 重複符号化防止: ストレージ符号化マーカーにより、オブジェクトが一度以上符号化されることを保証。別ティアからの受け取りで既存圧縮形式を認識・維持。
適用対象の選定基準
最も高速な圧縮操作とは「行う必要のない操作」であり、受益が低いコンテンツは避けます。プロトタイプは以下の条件を満たす場合にのみ
200 OK レスポンスを変換します。
適格化チェック(AND)
- ✅ Content-Encoding: 未設定であること。
- ✅ Content-Type: 圧縮可能なテキストであること。
- ✅ レスポンシサイズ: 既知のコンテンツ長かつ、少なくとも
であること。4 KiB
除外対象(変更なし)
- スライスサブリクエスト
- アクティブなアップストリーム圧縮を使用しているレスポンス
- レンジリクエスト
- 事前圧縮済みのレスポンス
- 長さ不明の本体
- バイナリコンテンツ
パラメータ選択の理由
の閾値: 多数の微小なリクエストを除外しつつ、対象となるバイト数の約 1% を残す調整が可能。これより下げるとオブジェクトごとのオーバーヘッド増加のみでストレージ削減効果は限定的。4 KiB- zstd レベル 3: 保守的なアーキテクチャ開始点。初期 CPU バジェットを把握した上で、必要に応じてレベルや最小サイズのパラメータ調整が可能。
テスト結果と検証
実験概要
制御されたテストゾーンでプロトタイプを実行し、以下のデータを収集しました。
- ログ・モニタリング: リクエストログ、Prometheus メトリクス、Jaeger トレースの関連付け実施。
- 正確性キャンペーン: キャッシュミス/ヒット、充填など各パスでの符号化・復号化発生場所の確認(キャッシュキー変化による特定)。
- パフォーマンスキャンペーン:
- 10 のキャッシュサーバー間にて100 万件以上のリクエスト送信。
- テアードキャッシュの有効/無効化の両モードで実行し、ローカル挙動とティア間転送を個別測定。
テスト結果
- 対象資産サイズ: 約
と195 KiB272 KiB - 圧縮率: 双方とも概ね 2.8 倍 に圧縮された(意図的なテストコーパスによる明確なシグナル)。
- ※インターネット上の全テキストオブジェクトを代表するものではありません。より広範なコーパスでの測定が必要ですが、アーキテクチャの効率は検証されました。
結論:一度圧縮して多くの利点をもたらす
今回の実験は、キャッシュサービス全体に展開できる顕著な効率化余地があることを示しました。テスト条件下ではトレードオフが有利であることが確認できました。
- アーキテクチャによりコンテンツを保持しつつ、CPU バジェット内での運用を実現。
- ペタバイト単位のキャッシュ容量確保とデータセンター間転送削減を実証。
今後のステップと展望
以下の計画を進める予定です:
- より高い zstd レベル の評価。
- より広範なコンテンツタイプおよびオブジェクトサイズのテスト。
- 適格性基準からの異なるパラメータの微調整。
- レンジリクエストとプレ圧縮済みオリジンレスポンスへの対応検討。
- 復号化せずに、既にそれをサポートするダウンストリームコンポーネントへ圧縮オブジェクトを直接渡す仕組みの実装。
※インターンシップ情報 今回の開発はクラウドフレードルのインターンシッププログラムの一環です。より良いインターネット構築に貢献したい方へ、同社のインターンシップ機会や求人を紹介します。