大規模リポジトリでのGitパフォーマンスの問題

Joshua Redstoneは、Gitメーリングリストで、Facebookが大きなリポジトリで抱えていたパフォーマンスの問題について不満を述べました。 彼らは合成リポジトリを作成し、テストを実施しました。



テストリポジトリ

400万件のコミット、線形履歴、約130万件のファイル。 .gitフォルダーのサイズは約15 GBで、repackコマンドで圧縮されています。



git repack -a -d -f --max-pack-size=10g --depth=100 --window=250







このプロセスは、優れたマシン(大量のメモリ、SSD)で約2日かかりました。 インデックスファイルのサイズは191 MBでした。



このようなリポジトリーでのGitの速度は、まったく楽しいものではありません。 通常のHDDと10 GBを超えるRAMを搭載したサーバーでコマンドを実行した結果(コマンドは数回繰り返され、「ホット」OSキャッシュを使用した場合よりも高速に動作します):



git status





コールドキャッシュで39分、ホットキャッシュで24秒。



git blame





44分11分。



git add



(ファイルの最後に数文字を追加して追加)

7秒と5秒。



git commit -m "foo bar3" --no-verify --untracked-files=no –quiet --no-status





41分20秒。



Facebookの開発者は、このような結果は自分に合わないと言い、状況を修正する方法についてアドバイスを求めます。 おそらく、Gitでは、特殊な個別のサーバーを割り当て、ファイルシステムレベルでそれをサポートして、個々の操作を高速化する必要があります(たとえば、どのファイルが変更されたかを判断します)。 個々のサーバーをサポートするためにGitコードを書き直すか、一種のアクセスインターフェイスとしてスクリプトを使用してアドインを作成する必要があります。



Redstoneの同僚 、パフォーマンスの低下はGitの多数のO(n)構造によるものであり、大きなサイズで問題が発生すると説明しました。 インデックスファイル自体は、わずかな変更でも完全にゼロから書き換えられ、大規模なプロジェクトではサイズが100 MBを超えます。 さらに、Gitはlstat



を使用してファイルの変更をチェックするため、特にコールドキャッシュでは、何百万ものファイルにディスクブレーキがかかります。



一般的に、Facebookの開発者は、パフォーマンスを改善するためにGitを書き直した方が良いと示唆しています。 リポジトリをいくつかの部分に分割することを拒否します。



All Articles