世界を動かす技術を、日本語で。

さらに100TBのRAMを節約する

概要

  • CloudflareのPingoraサービスで 小さなアルゴリズム改善 により大規模なメモリ削減を実現
  • 一部の構造体最適化 で世界中で100TB超のRAMを回収
  • Consistent Hashing の仕組みとその課題を数式とともに解説
  • サーバー負荷の均等化や重み付け、複数ハッシュリングの運用課題
  • Rustによる 構造体メモリ最適化 の実装例とその工夫

Cloudflareにおける大規模運用とリソース最適化

  • Cloudflare は世界中に数千台のサーバー、ペタバイト級のRAM、数百万のCPUコアを持つグローバルインフラ運用
  • すべてのノードで全サービスを動かすため、 リソースの無駄を極限まで排除 する必要性
  • 小さな改善でも全体での インパクトが巨大 になるため、1%の効率化も重要
  • 今回は Pingoraベースのサービス でアルゴリズム微調整により大幅なメモリ削減を達成
  • これにより、 全世界で100TB以上のRAM を回収

Consistent Hashingの基本と課題

  • Consistent Hashing はサーバー追加・削除時も大規模な再配置が不要な分散タスク割り当て手法
  • 内部ではキャッシュリクエストのルーティングに利用、URLごとにサーバーへ割り当て
  • ハッシュ値空間を数直線(またはリング)としてサーバー・タスクを配置
  • 各タスクは「左側に最初に現れるサーバー」に割り当てられる
  • サーバー間で担当範囲が 不均等 になる問題が発生、リクエストの偏りが生じる

数学的背景と負荷分散の改善

  • サーバー数Nに対する担当範囲の 期待値標準偏差 を数式で算出
    • 期待値: $1/N$
    • 標準偏差: $1/N \sqrt{(N-1)/(N+1)}$
  • 100台サーバーの場合、偏差が大きく最大で2倍の負荷差が生じる可能性
  • 複数ハッシュ(バーチャルノード) を各サーバーに割り当てることで偏りを軽減
    • 例: 1サーバー160ポイントで誤差率が約8%まで改善

サーバーごとの重み付けと更なる複雑化

  • サーバーによって ストレージ容量や性能が異なる 場合、重み付きハッシュ(ketamaアルゴリズム)を適用
    • サーバーの重みに応じてハッシュ数を調整
  • 機能やコンプライアンス要件により、 複数のハッシュリング が必要となる
    • 組み合わせ爆発でメモリ消費が急増
    • 一部ケースでは 6GB以上のメモリ消費 が発生

Rustによる構造体最適化とメモリ削減

  • ハッシュポイント構造体の設計見直し
    • 旧: struct Point { hash: u32, index: u32 }(8バイト)
    • 新: struct PointV2 { hash: u32, index: u16 }(理論上6バイト)
  • Rustの アライメント制約 により、単純な型変更ではメモリ削減できない
  • 生バイト配列+アクセサ関数 で6バイト構造体を実現
    • 例: struct Point([u8; 6]);
    • getterでu32, u16としてアクセス
  • こうした地道な改善の積み重ねで 全体のメモリ効率化 を達成

まとめ

  • 大規模インフラ運用 では、アルゴリズムやデータ構造の微調整が全体最適化に直結
  • Consistent Hashing の基本から、負荷分散、重み付け、実装上の工夫まで幅広く解説
  • Rust など最新技術を活用した地道な改善が、 100TB超のリソース削減 という大きな成果に繋がる