Goにおけるコンテンツ定義チャンキング:3.7GB/s、メモリ使用量3分の1減
PlakarプロジェクトがGo向けCDCチャンカーライブラリv1.1.0をリリース。スループット3.7GB/sを達成し、メモリ使用量を従来比3分の1に削減。形式的証明により正確性も担保。コンテンツ定義チャンキング(CDC)の性能と信頼性を大幅に向上させた。
背景メモ
- 本記事は、Go言語向けの「コンテンツ定義チャンキング(CDC)」ライブラリの最新版(v1.1.0)リリースを紹介している。CDCとは、ファイルを可変長の塊(チャンク)に分割する技術で、固定サイズではなくデータ内容に基づいて区切り位置を決める。これにより、ファイルの一部が変更されても残りのチャンクが再利用できるため、バックアップや重複排除(デデュプリケーション)システムで広く使われる(例:rsync、borg、restic)。
- 著者のNicolas Hillegeerは、オランダのエンジニアで、Go製バックアップツール「Plakar」の開発者。PlakarはCDCを中核技術として採用しており、本ライブラリはその基盤コンポーネント。
- 今回の主な改良点は、(1) 処理速度を従来比で約2倍の3.7 GB/sに高速化、(2) メモリ使用量を約3分の1に削減、(3) 数学的な正当性証明(provably correct)を付与したこと。性能面では、Go標準の高速ハッシュ関数などを活用しつつ、SIMDに頼らず純Goで達成している点が特徴。
- CDCアルゴリズムの一種である「Rabin-Karpローリングハッシュ」や「Buzhash」を用いた従来実装と比べ、本ライブラリは「Gear Hashing(Gearハッシュ)」と呼ばれる手法を採用。これは特定のマジックナンバー(Gear値)とのビット演算で効率的にチャンク境界を検出する。v1.1.0ではGear値を慎重に再調整し、チャンクサイズ分布のばらつき(分散)を抑えつつ性能を向上させた。
- コードはGo製で、同時実行(並行処理)に対応。同一データに対して複数のGoroutineで並列チャンキング可能なAPIも提供する。