OpenAIにおけるGitのスケーリング:Pandoの紹介

OpenAIは、リポジトリ全体の整合性を切り離し、パックファイルを再利用することで高並行開発をサポートするように設計された、新しい水平スケーラブルなGitバックエンド「Pando」を開発しました。従来の3相コミットや先行書き込みログ(WAL)パターンから脱却することで、Pandoはプッシュの平均レイテンシを約80%削減しました。現在では、標準的なGitクライアントとの完全な互換性を維持しながら、1日あたり1ペタバイト近いGitデータを処理しています。

Pandoの開発動機

OpenAIにおけるCodexの採用により、同時実行されるブランチ、プッシュ、フェッチの量が大幅に増加し、既存のソース管理インフラストラクチャは限界に達しました。電子メールベースのパッチ交換という歴史から発展した従来のGitサーバーは、現代の自動化ワークフローの規模に対応するのに苦労していました。OpenAIは、頻繁なフェッチの遅延、マージの失敗、信頼性の問題に直面しており、既存のエンジニアリングワークフローを中断させることなく、大規模な並列書き込みと高スループットの読み取りを処理できるシステムが必要でした。

アーキテクチャの原則

Pandoは、通常Gitのパフォーマンスを制限する従来の制約を緩和することでスケーラビリティを実現しています。

  • 因果整合性(Causal Consistency): グローバルな調整を必要とするリポジトリ全体の整合性を強制する代わりに、Pandoは因果整合性を使用します。これにより、無関係なブランチへのプッシュを並列で実行できます。クライアントは個々の参照に対して直列化可能な履歴を確認できますが、リポジトリ全体で見ると異なる時点を観測する可能性があります。
  • パックファイルの再利用: 従来のGitサーバーは、クライアントのローカル履歴に基づいてクライアントごとに固有のパックファイルを生成することがよくあります。Pandoは、受信したパックファイルを不変のBLOBとして保存し、それを読み取り側に直接提供します。これにより、コストのかかるオンザフライの計算が不要になり、同じデータを多くのクライアントに同時に提供することでネットワーク帯域幅を飽和させることが可能になります。

技術的実装

Pandoは、プッシュ、フェッチ、バックグラウンドコンパクションという3つの主要なサービスを通じて動作します。

プッシュのスケーリング

クライアントがプッシュを行う際、Pandoはパックファイルを1回のパスで検証し、水平スケーラブルなBLOBストアにストリーミングします。その後、マルチキー・トランザクションを使用してメタデータストアに「ref version」を記録します。アドバタイズされる参照のセットを制限することで、Pandoはクライアントが他のユーザーと共有・再利用しやすいパックファイルを生成できるようにし、ブランチの数に関係なくアドバタイズサイズを一定に保ちます。

ラインレートでのフェッチ

フェッチ操作は、Gitプロトコルの have と want を一連のref versionにマッピングすることで最適化されています。Pandoは、OpenAIがアップストリームへの改善を支援した packfile-uri 機能を使用して、キャッシュされたパックファイルへのリンクを返します。これにより、クライアントはリージョナルキャッシュからデータをダウンロードでき、10 Gbpsのネットワークリンクを飽和させるスループットを実現します。

コンパクション

数千もの小さなパックファイルを管理するオーバーヘッドを防ぐため、Pandoはログ構造化マージツリーに似たバックグラウンドコンパクションプロセスを採用しています。このプロセスは、パックファイルを幾何学的な「カバー」(L0からL4)にグループ化します。これらのカバーは圧縮率を向上させ、システムが対数時間でフェッチ計画を実行できるようにし、リポジトリの成長に伴ってもパフォーマンスが安定するようにします。

開発とデプロイ

PandoはRustを使用して10週間で構築され、開発にはAIエージェントが大きく貢献しました。チームは、LeanやTLA+を含む形式検証手法を使用して、システムの特性を証明し、エッジケースを特定しました。システムは、最初は読み取り/書き込みスループロキシとして機能することでデプロイされ、ダウンタイムなしで既存のワークフローをシームレスに移行できました。

OpenAIは、特に packfile-uri のパフォーマンス、同時ダウンロード、フェッチ操作のより良いトレーシングに関連する分野で、アップストリームのGitプロジェクトへの改善を継続的に提供しています。チームは現在、Pandoの技術をより広い開発者コミュニティと共有する方法を模索しています。

Sources