さらに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超のリソース削減 という大きな成果に繋がる