Git sh.exe Prozess Forking Problem auf Windows XP, langsam?

8

Git ist wichtig für meinen Workflow. Ich laufe MSYS Git unter Windows XP auf meinem Quad-Core-Rechner mit 3 GB RAM, und normalerweise ist es reaktionsschnell und zippy.

Plötzlich ist ein Problem aufgetreten, bei dem es 30 Sekunden dauert, einen Befehl von der Git Bash-Eingabeaufforderung auszuführen, einschließlich ls oder cd . Interessanterweise sieht es von der Bash-Eingabe aus so aus, dass ls relativ schnell läuft. Ich kann dann die Ausgabe von ls sehen, aber es dauert dann ~ 30 Sekunden, bis die Eingabeaufforderung zurückkommt. Wenn ich auf die Windows-Eingabeaufforderung umschalte (indem ich cmd aus dem Startmenü heraus führe), benötigen git-bezogene Befehle auch ewig, sogar nur um zu laufen. Zum Beispiel kann git status fast eine Minute dauern, bevor etwas passiert. Manchmal enden die Prozesse einfach nicht.

Beachten Sie, dass ich "MSYS Git" installiert habe, ebenso wie reguläre "MSYS" für Dinge wie MinGW und make .

Ich glaube, dass das Problem mit sh.exe in C:\Program Files\Git\bin zusammenhängt. Wenn ich ls von der Bash-Eingabeaufforderung aus ausführen oder wenn ich git von der Windows-Eingabeaufforderung aus aufrufe, zeigt der Task-Manager bis zu vier Instanzen von sh.exe an, die kommen und gehen.

Hier warte ich darauf, dass ls zurückkommt und Sie sehen, dass der Taskmanager git.exe läuft und vier Instanzen von sh.exe :

Wenn ich ctrl-c in der Mitte von ls bekomme, bekomme ich manchmal Fehler, die beinhalten:

%Vor%

Oder für git status : $ git status

%Vor%

Kann ich das beheben, damit git schnell wieder läuft und wenn ja wie?

Dinge, die ich versucht habe:

  • Neustart
  • Aktualisieren Sie MSYS Git auf die neueste Version & amp; Starten Sie
  • neu
  • Aktualisieren Sie MSYS auf die neueste Version & amp; Starten Sie
  • neu
  • Deinstallieren von MSYS & amp; deinstallieren und neu installieren MSYS Git allein & amp; Starten Sie
  • neu

Ich möchte sehr gerne meine Box nicht löschen und Windows neu installieren, aber ich werde, wenn ich das nicht beheben kann. Ich kann nicht mehr codieren, wenn ich 30 Tage brauche, um git status oder cd.

auszuführen     
AndyL 01.05.2011, 21:42
quelle

6 Antworten

7

Wenn ein Programm 30 Sekunden benötigt, um etwas sofort zu tun, ist es wahrscheinlich eher ein I / O-Timeout-Problem, normalerweise ein Netzwerk, als die Geschwindigkeit Ihrer CPU oder die Menge an RAM, die Sie haben. Sie mögen sich fragen, wie das Netzwerk ist, aber das ist eine berechtigte Frage (ich würde auch nicht für Ihr System wissen).

Msysgit installiert eine spezielle Eingabeaufforderung, die eine spezielle Funktion __git_ps1 ausführt, die einige nützliche Informationen in der Eingabeaufforderung anzeigt. Sie können dies mit echo $PS1 sehen, für mein System zeigt dies:

%Vor%

Diese zusätzlichen Informationen sind völlig optional und Sie können sie ausschalten. Versuchen Sie Folgendes in einem Msysgit-Fenster:

%Vor%

Dadurch wird die Eingabeaufforderung auf den Standard $ zurückgesetzt und nicht versucht, Befehle in der Eingabeaufforderung auszuführen. Wenn dies Ihr Verzögerungsproblem löst, ist es wahrscheinlich die Funktion __git_ps1 . Versuchen Sie es manuell:

%Vor%

und sehen, wie lange es dauert, um zurückzukehren.

Sie können das beheben, indem Sie die Zeile entfernen, die __git_ps1 von C:\Program Files\Git\etc\profile aufruft:

%Vor%     
Greg Hewgill 01.05.2011, 22:15
quelle
6

Wir sind also auch auf dieses Problem gestoßen, und ich denke, wir haben es schließlich auf die Implementierung des Windows-Sicherheitsmodells von msys zurückgeführt. Ich werde versuchen, eine kurze Zusammenfassung des Problems zu veröffentlichen:

Screenshot: Stack-Spur von stecken sh.exe. Beachten Sie, wenn msys-1.0.dll in NetServerEnum ()

aufruft

Dies ist, was passiert, wenn sh.exe für 30 Sekunden blockiert ist. So wird NetServerEnum() nur an einem Ort in msys aufgerufen, security.cc:228 in get_lsa_srv_inf() , welches von get_logon_server() und get_logon_server_and_user_domain() aufgerufen wird, welches in create_token() aufgerufen wird, welches von seteuid() in syscalls.cc aufgerufen wird wird von setuid() aufgerufen.

Was im Wesentlichen passiert, ist Folgendes: Wenn die msys-DLL initialisiert wird und sh.exe versucht, setuid() aufzurufen, versucht msys, sich an das Windows-Sicherheitsmodell zu halten und versucht, die Liste der Domänenserver von Ihrer Domäne zu suchen. Arbeitsgruppe. Leider ist dies im Gegensatz zu Linux ein blockierender Aufruf für Windows, der 5-30 Sekunden dauert, bis er abgeschlossen ist / Timeout ist, und ist eigentlich ziemlich unnötig für gut, git.

Unsere Lösung besteht darin, eine neue msys.dll zu erstellen, bei der das Sicherheitsfeature deaktiviert ist, indem Sie has_security in winsup.cc auf false gesetzt. Die mit msysgit gelieferte bash / sh.exe war nicht kompatibel mit unserer neuen Version von msys.dll, also mussten wir eine neue bash.exe von Grund auf neu kompilieren, keine Ahnung warum. Das Endergebnis war sh.exe nicht mehr versucht, diese NetServerEnum Aufrufe und führt Lickity Split.

    
user3817699 08.07.2014 18:44
quelle
3

Wenn die Verlangsamung beim Ausführen mehrerer simultaner Git-Befehle auftritt, kann dies auf ein Kernel-Locking-Problem in msysgit

zurückzuführen sein

Wir haben gesehen, dass unter einigen Bedingungen mehrere Instanzen von git.exe alle auf dasselbe Kernel-Objekt warten (innerhalb WaitForSingleObject() ), was bedeutet, dass nur ein einzelner git-Befehl gleichzeitig auf dem System ausgeführt werden kann.

Siehe hier:

Mit ProcessExplorer konnten wir sehen, dass alle git.exe-Prozesse hier stecken geblieben sind:

%Vor%

Dies scheint mit diesem Problem zu tun zu haben: Ссылка , da es nicht Git ist aber die Pseudo-Linux-Laufzeit (Mingw), die das Problem zu enthalten scheint.

Wir haben das Benutzerkonto, mit dem die Anwendungen von SYSTEM ausgeführt werden, in ein interaktives Benutzerkonto geändert, und das Warten auf das Kernel-Objekt wurde abgebrochen:

Gesunde git.exe-Prozesse

Daher könnte die Verlangsamung, die Sie sehen, mit einer Art von Kernel-Objektkonflikten zusammenhängen - nur wenn der vorherige git-Befehl die Kernelsperre freigegeben hat, könnten andere Befehle ausgeführt werden können.

Versuchen Sie, das Benutzerkonto zu ändern, unter dem Sie die Git-Befehle ausführen, und sehen Sie, ob dies das Problem löst - für uns.

    
Matthew Skelton 24.10.2012 16:58
quelle
2

Obwohl Gregs Antwort das Problem der unmittelbaren Geschwindigkeit löst, habe ich das Gefühl, dass es nur das Problem maskiert und nicht löst.

Ich fing an, git bash langsam laufen zu lassen und den Schritten zu folgen, die Greg beschreibt, identifizierte __git_ps1 als den Täter.

Anstatt die Eingabeaufforderungsinformationen zu ändern (ich finde es nützlich, die angezeigten Informationen zu haben), fand ich eine Lösung, die für mich funktionierte und in einem Blogpost beschrieben wurde:

Lösung, um Git Bash zu verlangsamen, wenn Sie als Domänenbenutzer angemeldet sind

  

Ich habe im Internet ein wenig gesucht und festgestellt, dass git das Standard-Home verwendet.   auf meinem Konto als Netzwerkkonto festgelegt. Dieses Ding, dass git würde   schaue in diesem Verzeichnis die ganze Zeit und verursache die Verzögerung.

     

Um das zu beheben, habe ich eine lokale Benutzerumgebungsvariable erstellt, die überschrieben wird   der Standardwert ist und auf% USERPROFILE% festgelegt, der auf zeigt   c: \ Benutzer [Benutzername].

Die gleiche Lösung wurde auch auf SO zur Beantwortung einer ähnlichen Frage veröffentlicht.

Das Hinzufügen der Umgebungsvariablen brachte git auf volle Geschwindigkeit zurück und ich bekomme immer noch die Befehlszeileninformationen.

    
Tony 09.10.2012 13:32
quelle
0

Ich hatte Probleme mit langsamen Prozessen auf einem Windows XP-Rechner. Gelegentlich würde eine Prozessgabel Minuten dauern.

Die Lösung für mich war, den TEMP-Ordner des Computers zu leeren. Der Computer war eine gemeinsam genutzte Ressource und es wurden über Jahre hinweg Dateien gesammelt.

    
murrayh 14.05.2013 23:55
quelle
0

Wenn die Anmeldeserver in NetServerEnum aufgelistet werden, versuchen Sie, die LOGONSERVER-Umgebungsvariable auf den tatsächlichen Anmeldeserver zu setzen.

    
Arrigo Zanette 13.11.2014 23:40
quelle

Tags und Links