GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Warum schlägt Git beim Push/Fetch mit zu vielen geöffneten Dateien fehl?

Es gibt zwei ähnliche Fehlermeldungen:

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

Anscheinend erhalten Sie EMFILE , was bedeutet, dass die Anzahl der Dateien für einen einzelnen Prozess überschritten wird. Überprüfen Sie also, ob vi Dateien öffnen kann, ist irrelevant – vi verwendet eine eigene, separate Dateitabelle. Prüfen Sie Ihre Limits mit:

$ ulimit -n
1024

Auf meinem System gibt es also ein Limit von 1024 geöffneten Dateien in einem einzigen Prozess. Sie sollten Ihren Systemadministrator nicht fragen müssen (bitte verwenden Sie nicht das Akronym SA, es ist zu undurchsichtig; wenn Sie es abkürzen müssen, verwenden Sie „sysadmin“), um das Limit zu erhöhen.

Sie können überprüfen, welche Dateien Git öffnet, indem Sie Git unter strace ausführen .

Dies könnte ein Fehler in Git oder in einer Bibliothek sein, oder es könnte sein, dass Sie eine alte Version von etwas verwenden, oder es könnte etwas Bizarres sein. Versuchen Sie es mit strace zuerst sehen, welche Dateien es öffnet, und überprüfen, ob Git diese Dateien schließt.

Update von Hazok:

Nach Anwendung der obigen Empfehlungen stellt sich heraus, dass der Fehler durch zu viele lose Objekte verursacht wurde. Es gab zu viele lose Objekte, weil git gc wurde nicht oft genug ausgeführt.


Warum ist das passiert?

Aus der Git-Dokumentation:

Wenn ungefähr mehr als diese Anzahl loser Objekte im Repository vorhanden sind, packt git gc --auto sie. Einige Porcelain-Befehle verwenden diesen Befehl, um von Zeit zu Zeit eine einfache Garbage Collection durchzuführen. Der Standardwert ist 6700.

Hier enthält "Einige Porzellanbefehle" git push , git fetch usw. Wenn also die maximale Anzahl geöffneter Dateien auf ulimit -n begrenzt ist <6700, Sie werden schließlich von git gc --auto blockiert Sobald Sie ~6700 lose Objekte in einem einzigen Git-Repo haben.

Ich habe es eilig. Wie kann ich das Problem beheben?

Wenn Sie über ausreichende Berechtigungen verfügen, um das System ulimit anzupassen:

$ sudo ulimit -n 8192

Andernfalls können Sie git gc deaktivieren durch Setzen von git config gc.auto 0 , sodass Sie Ihre lokalen Commits auf die Remote übertragen, das Repo löschen und es ohne Tausende von losen Objekten zurückklonen können.

Wie können wir verhindern, dass so etwas noch einmal passiert?

Stellen Sie git config --global gc.auto 200 ein , wobei 200 ein Wert ist, der unter Ihrem Limit für maximal geöffnete Dateien liegt. Wenn Sie einen zu kleinen Wert ausgewählt haben, git gc würde zu häufig laufen, also wähle weise.

Wenn Sie gc.auto=0 einstellen , werden die losen Objekte niemals gepackt, es sei denn, Sie führen git gc aus manuell. Es könnten sich also Hunderttausende von Dateien im selben Verzeichnis ansammeln, was insbesondere für Benutzer von mechanischen Festplatten oder Windows ein Problem darstellen könnte. (Siehe auch:Wie viele Dateien in einem Verzeichnis sind zu viele? und Ist es (leistungsmäßig) in Ordnung, Hunderte oder Tausende von Dateien im selben Linux-Verzeichnis zu haben?).


Linux
  1. Beheben des MySQL-Fehlers:Zu viele offene Dateien

  2. Warum unterbricht der Ls-Befehl das NFS-Verzeichnis mit vielen Dateien nur langsam?

  3. Warum öffnet Dateien (Nautilus) ein neues Fenster, obwohl bereits eines geöffnet ist?

  4. Warum schlägt sed mit internationalen Zeichen fehl und wie kann man das beheben?

  5. bash:/bin/tar:Argumentliste zu lang, wenn viele Dateien mit tar komprimiert werden

udev starten:udevd inotify_init fehlgeschlagen:zu viele offene Dateien

Warum funktioniert Tomcat mit Port 8080, aber nicht mit 80?

Warum schlägt das Herunterfahren von Net RPC mit den richtigen Anmeldeinformationen fehl?

Warum schlägt das Einbinden einer Datei nach dem Aufheben der Verknüpfung mit ENOENT fehl?

Zu viele offene Dateien auf Debian

Entfernt das Auffüllen der Festplatte mit dd Dateien sicher?