GNU/Linux >> Linux の 問題 >  >> Linux

開いているファイルが多すぎるとプッシュ/フェッチでgitが失敗するのはなぜですか

同様のエラー メッセージが 2 つあります:

EMFILE: Too many open files
ENFILE: Too many open files in system

EMFILE を取得しているようです 、これは、個々のプロセスのファイル数を超えていることを意味します。それで、 vi かどうかをチェックします ファイルを開くことができるかどうかは無関係です — vi 独自の別のファイル テーブルを使用します。制限を確認してください:

$ ulimit -n
1024

そのため、私のシステムでは、1 つのプロセスで開くことができるファイル数は 1024 に制限されています。上限を上げるために、システム管理者に依頼する必要はありません (頭字語 SA はわかりにくいので使用しないでください。省略しなければならない場合は、「sysadmin」を使用してください)。

strace で Git を実行して、Git が開くファイルを確認することもできます。 .

これは、Git またはライブラリのバグである可能性があります。または、何かの古いバージョンを使用している可能性があります。または、より奇妙な何かである可能性があります。 strace を試す 最初にどのファイルを開くかを確認し、Git がそれらのファイルを閉じるかどうかを確認します。

Hazok からの更新:

上記の推奨事項を使用した後、エラーの原因は緩いオブジェクトが多すぎることが判明しました。 git gc のため、ゆるいオブジェクトが多すぎました 十分な頻度で実行されていませんでした。


なぜそうなったのですか?

git ドキュメントから:

<ブロック引用>

リポジトリにこれより多くのルース オブジェクトがある場合、git gc --auto はそれらをパックします。一部の磁器コマンドは、このコマンドを使用して軽量のガベージ コレクションを時々実行します。 デフォルト値は 6700 です。

ここで「いくつかの磁器コマンド」には git push が含まれています 、 git fetch など。したがって、最大オープン ファイルが ulimit -n に制限されている場合 <6700、あなたは最終的に git gc --auto によってブロックされます 1 つの git リポジトリで最大 6700 個のルース オブジェクトを取得したら。

急いでいます。修正方法

システムの ulimit を調整するための十分な権限がある場合:

$ sudo ulimit -n 8192

それ以外の場合は、git gc を無効にすることができます git config gc.auto 0 を設定することにより 、ローカル コミットをリモートにプッシュし、リポジトリを削除し、何千ものルーズ オブジェクトなしでクローンを元に戻すことができるようにします。

このようなことが再び起こらないようにするにはどうすればよいでしょうか?

git config --global gc.auto 200 を設定 、ここで 200 は、開いているファイルの最大制限よりも小さい値です。小さすぎる値を選択した場合、git gc 頻繁に実行されるため、賢明に選択してください。

gc.auto=0 を設定した場合 git gc を実行しない限り、ルーズ オブジェクトはパックされません。 手動で。そのため、同じディレクトリに何十万ものファイルが蓄積される可能性があり、これは特に機械的なハード ドライブや Windows ユーザーにとっては問題になる可能性があります。 (以下も参照してください:ディレクトリ内のファイル数は多すぎますか? および同じ Linux ディレクトリに数百または数千のファイルがあっても (パフォーマンス的に) OK ですか?)。


Linux
  1. Mysqlエラーの解決:開いているファイルが多すぎます

  2. なぜRsyncは壊れたパイプ(32)で失敗し、Io.c(820)でソケットIo(コード10)でエラーが発生するのですか?

  3. Tomcat がポート 8080 で動作するのに 80 で動作しないのはなぜですか?

  1. リンク解除後にファイルをバインドマウントすると、ENOENT で失敗するのはなぜですか?

  2. Debian で開いているファイルが多すぎる

  3. タイムゾーンが異なるファイルで find -mtime が期待どおりに機能しないのはなぜですか?

  1. 大量のファイルがあるNfsディレクトリでLsコマンドの割り込みが遅いのはなぜですか?

  2. すでに開いているウィンドウがあるのに、ファイル(nautilus)が新しいウィンドウを開くのはなぜですか?

  3. udev の起動:udevd inotify_init に失敗しました:開いているファイルが多すぎます