概要
- 大規模リポジトリ のバックアップ時間短縮のため、 Git内部のO(N²)問題 を特定・修正
- 新アルゴリズム 導入により、バックアップ時間が 48時間から41分 に大幅短縮
- 運用コスト削減 ・リスク低減・バックアップ戦略の拡張性向上
- GitLab 18.0 以降、全ユーザーが追加設定なしで恩恵を享受可能
- Git本体にも貢献 し、全Gitユーザーのスケーラビリティ向上に寄与
大規模リポジトリのバックアップ課題
- リポジトリの肥大化 に伴い、バックアップ作成が 時間的・資源的に困難
- バックアップ頻度とシステムパフォーマンス のトレードオフ発生
- バックアップウィンドウの確保困難、24時間稼働組織での運用障壁
- 長時間処理による失敗リスク (ネットワーク障害・サーバ再起動など)
- レースコンディション による不整合なバックアップ発生リスク
- 作成中にリポジトリ内容が変化する可能性
- 結果として バックアップ頻度や完全性の妥協、外部ツール依存の増加
技術的ボトルネックの特定
- GitLabのバックアップ機能 は
git bundle createコマンドを利用- 全リファレンス(ブランチ・タグ等)を含むリポジトリスナップショット作成
- リファレンス数増加 に伴い 処理時間が指数関数的に増加
- Flame graph解析 により、
object_array_remove_duplicates()関数が全体の約80%を占有- 2009年コミットで導入、重複リファレンス排除のため O(N²)のネストループ を使用
- 大規模リポジトリ (リファレンス数100万以上)でバックアップが48時間超に
アルゴリズム改善による解決策
- ネストループ を マップ構造 へ置換
- 各リファレンスをマップに追加することで 重複排除を高速化
- ベンチマーク結果
- 10,000リファレンスで 6倍以上の性能向上
- 100,000リファレンスで 14.6秒→2.3秒 に短縮(HEAD基準)
- パッチはGit本体にマージ済み
- GitLabでは 即時バックポート し、全顧客が恩恵を受けられるよう対応
効果と顧客へのメリット
- 最大リポジトリのバックアップ時間 が 48時間→41分 (1.4%)に短縮
- リポジトリサイズ問わず一貫したパフォーマンス
- サーバ負荷・運用コストの大幅削減
- 全てのバンドル操作で恩恵 (バックアップ以外にも適用可能)
- エンタープライズのバックアップ戦略が劇的に進化
- 毎晩の定期バックアップが現実的に
- 復旧ポイント目標(RPO) の大幅短縮、ビジネスリスク低減
- メンテナンスウィンドウ短縮 によるコスト削減
- 将来のリポジトリ拡張にも柔軟対応
GitLab 18.0以降の運用
- 追加設定不要で自動適用
- 全ライセンスユーザーが即時利用可能
- 持続的なパフォーマンス改善への取り組み
- 今後もボトルネック特定・解消を継続
Gitコミュニティへの貢献と今後
- Git本体への貢献 により、全Gitユーザーのスケーラビリティ向上
- 継続的なインフラ改善 とエンタープライズ向け機能強化
- GitLab 18バーチャルローンチイベント で他の改善点も紹介予定
- 参加登録を推奨