【TECH BLOG #51】Gitのフェッチが極端に遅くなった時、原因はGitのバージョンかもしれない

こんにちは!
グリーエンターテインメント株式会社の駆け出しフルスタックエンジニアです。
私が担当しているタイトルでは、コードやリソースのバージョン管理および開発環境のサーバーデプロイにGitを利用しています。しかし、いつからかそのサーバーデプロイが時折遅くなるという問題が発生するようになっていました。ちょっとの修正を確認するだけに長い時間を待たされることになり、チームメンバーはイライラさせられ、プロジェクトの円滑な進行の妨げにもなっていたことでしょう。
そしてサーバーデプロイのどこで時間が掛かっているのか調査した所、驚くべきことにGitのフェッチ操作で十分程の時間が使われることがあると発覚しました。この記事では、そんなサーバーデプロイが遅くなった原因の一つとして、フェッチ操作に焦点を当てていきます。
フェッチ遅延の調査その1
Gitのフェッチに時間が掛かるようになった場合、様々な原因が考えられます。最初に疑ったのはサーバーのネットワーク通信速度やディスク容量ですが、それらに問題はありませんでした。
次に疑ったのはフェッチを行うリモートあるいはローカルのGitリポジトリサイズが肥大化している影響です。そこで問題が発生しているサーバーと会社支給のPCでフェッチにかかる時間を比較してみることにしました。条件を揃えるため同じ設定でリポジトリを作り、同じタイミングでフェッチ操作を行い、完了までの時間を計るのを繰り返します。その結果、PC側はおおむね1秒以内で終わったのに対し、サーバー側は常に数分程度かかる状態でした。このことからリポジトリのサイズそのものが原因では無いと考えて良さそうです。
ここからは一般論的な考え方を止めて、問題が発生し始めた頃にサーバーで変更したものを調査することにしました。すると数ヶ月前からサーバーのディスク容量逼迫を解消するためにパーシャルクローンを使い始めたことが判明したのです。パーシャルクローンの導入と問題発生の期間が重なっていたため、関連性を疑うのは自然なことでしょう。
ところでパーシャルクローンという言葉に馴染みがない方もいらっしゃると思いますので、次章で簡単に説明します。
パーシャルクローンとは
パーシャルクローンは、クローンを行う際にリモートリポジトリからデータの一部だけを取得する方法の一つであり、Git 2.19から追加された機能です。リモートリポジトリ全体をクローンする必要がなくなるため、大規模なリポジトリや低帯域幅のネットワーク接続を持つ開発者にとって特に有用です。
代表的なGitホスティングサービスであるGithubでは、ブロブ(ファイル内容)およびツリー(ディレクトリ)を必要に応じてダウンロードする設定が利用可能です。設定を有効化すると、クローンおよびフェッチではブロブあるいはツリーを取得せず、チェックアウト時点で必要な分だけ取得するようになります。これによりリポジトリの容量を抑制し、更にフェッチの速度も向上します。
より詳しい説明や使い方については、下記のGitHub公式ブログが非常に分かり易くまとまっていますのでそちらをご参照ください。
パーシャルクローンとシャロークローンを活用しよう – GitHubブログ
フェッチ遅延の調査その2
さて、フェッチ遅延の原因調査に立ち返って、パーシャルクローンによるフェッチ速度への影響を確認してみます。結果から言うと、問題が起きているサーバーでパーシャルクローンを使わずにリポジトリを作ると、確かにフェッチの速度が改善されました。
しかしながら前章で説明した通り、パーシャルクローンによってフェッチはむしろ速くなるはずです。そもそも前々章の調査でにおいて、同じ設定でリポジトリを作った、つまりパーシャルクローンを使ってもPCではフェッチの遅延は発生していませんでした。それならばフェッチが低速になるのはパーシャルクローン以外にも要因があると考えられます。
そこでPCとサーバーの違いを検討していた折に浮上したのはGitのバージョンでした。PCはセキュリティ的な懸念から最新のバージョンに更新されていた一方、サーバーはデプロイ以外にGitを利用していなかったため更新があまりされず古いバージョンになっていたのです!
バージョンの違いによって、パフォーマンスが大きく落ちることは十分に考えられます。原因調査のためにもサーバーのGitバージョンを更新する必要がありそうです。
Gitのバージョンアップ手順
この章ではGitのバージョンアップを行なった際の具体的な手順を示していきます。
まずは、あらためて現在のGitバージョンを確認してみましょう。バージョンを表示するには下のコマンドを実行します。git version
実行すると下記のようにバージョンが表示されます。
2.23がリリースされたのは2019年8月16日なので、4年近く前のバージョンを利用していたことになります。
次に利用可能なバージョンを確認しましょう。
問題のサーバーはAmazon Linuxを利用しているため、yumコマンドを使います。
yum --showduplicate list git
これを実行すると、下記のように現在利用しているバージョンおよび利用可能なバージョンのリストが表示されます。
利用可能な中で最新のバージョンは2.40.1でした。ちょうどPCのGitバージョンと同じです。また現在のバージョンである2.23.1もリストに含まれているため、何か問題が起きた場合にバージョンを戻すことも出来ます。
それでは、Gitのバージョンを上げましょう。今回は利用可能な中で最新のもので良いため、パッケージ名のみを指定します。sudo yum update git.x86_64
もしバージョンも指定する場合は、下のようにパッケージ名とバージョン名をハイフンで繋ぎます。sudo yum update git.x86_64-2.40.1-1.amzn2.0.1
これを実行すると下のように更新内容が表示されます。
内容に問題なければ「y」と入力しましょう。
これでバージョンアップ完了です。
更新されたことを確認するために、下記コマンドでバージョンを表示してみましょう。
git version
実行してみます。
無事に更新されていますね。
フェッチ遅延の調査その3
それでは、あらためてGitバージョンを更新したサーバーでフェッチ操作を試してみましょう。…素晴らしい、何回試しても1秒と待たされることはありません!
このことから、フェッチが遅くなっていたのはGitのバージョンが原因だったと言って良いでしょう。パーシャルクローンの機能追加がバージョン2.19だったため、そこからあまり間もないバージョン2.23.1時点では、まだパフォーマンス的に問題を抱えていたと考えられます。
余談ですが、問題となっていたリポジトリではGit LFSも使用していたのですが、今回のGitのバージョンアップ直後にGit LFSが未インストールの状態になってしまいました。すぐに検知して、再度GitLFSのインストールを行うことで解決はしましたが、やはりバージョンアップ直後はしっかりとした動作チェックが必要ですね。
まとめ
この記事ではGitのバージョンが古いことでフェッチが極端に遅くなる事例を紹介しました。
Gitは常に進化し、新しいバージョンではパフォーマンス向上やセキュリティ強化が行われています。また新しい機能や改善点を取り入れることで、効率的な開発環境を維持し、問題を未然に防ぐことができるでしょう。Gitは後方互換性にもよく注意を払われていますので、積極的にバージョンアップを行なっていくことをオススメします。
以上、最後まで読んでいただきありがとうございました。
本件に関するお問い合わせ先
グリーエンターテインメント株式会社 広報担当
東京都港区六本木6-11-1 六本木ヒルズゲートタワー
E-mail:info-ent@ml.gree.net