Git sh.exe processus de bifurcation problème sur windows XP, lent?
Git est essentiel de mon flux de travail. - Je exécuter MSYS Git sur Windows XP sur mon quad core avec 3 go de RAM, et normalement il est réactif et rapide.
Tout à coup un problème a surgi, en vertu de laquelle il prend >30 secondes pour exécuter n'importe quelle commande à partir de Git Bash invite de commande, y compris ls
ou cd
. Il est intéressant de noter, à partir de l'invite bash, il semble aime ls
s'exécute assez rapidement, je peux alors voir la sortie de ls
, mais ensuite, il faut environ 30 secondes pour que l'invite à rentrer. Si je passe à l'invite de commande windows (en exécutant cmd
à partir du menu démarrer) git commandes connexes également prendre une éternité, même juste pour s'exécuter. Par exemple git status
peut prendre près d'une minute avant que quelque chose se passe. Parfois, le processus n'est tout simplement pas terminer.
Remarque que j'ai "MSYS Git" installé ainsi que régulièrement des "MSYS" pour des choses comme MinGW
et make
.
Je crois que le problème est lié à sh.exe
situé dans C:\Program Files\Git\bin
. Quand je lance ls
à partir de l'invite bash, ou quand j'invoque git
à partir du prompt de windows, le gestionnaire des tâches affiche jusqu'à quatre instances de sh.exe
processus d'aller et venir.
Ici, je suis en attente pour ls
de retour et vous pouvez voir le gestionnaire des tâches a git.exe
en cours d'exécution et quatre instances de sh.exe
:
Si je ctrl-c
au milieu d'une ls
parfois, j'ai des erreurs qui comprennent:
sh.exe": fork: Resource temporarily unavailable
0 [main] sh.exe" 1624 proc_subproc: Couldn't duplicate my handle<0x6FC> fo
r pid 6052, Win32 error 5
sh.exe": fork: Resource temporarily unavailable
Ou pour git status
:
$ git status
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
sh.exe": fork: Resource temporarily unavailable
Puis-je résoudre ce problème de manière que git fonctionne rapidement encore, et si oui, comment?
Choses que j'ai essayé:
- Redémarrage
- De mise à niveau de la pme Git pour la plus récente version & Redémarrage
- De mise à niveau de la pme à la plus récente version & Redémarrage
- Désinstaller MSYS & désinstaller et réinstaller MSYS Git seul & Redémarrage
J'aimerais bien que pour ne pas essuyer ma boîte et réinstaller Windows, mais je le ferai si je ne peux pas régler ce problème. Je n'ai plus de code si ça me prend >30 s pour exécuter git status
ou cd.
J'ai vu ces questions, mais les solutions sont à Windows 7, je ne pouvais pas vraiment les essayer car je suis sur windows XP.
si vous aviez vu ces questions, vous auriez vu la
$PS1='$ '
option qui a été l'une des réponses.Ah oui. Je vois que maintenant. Eh bien, je suppose que j'ai soigneusement inspecté la réponse qui a été marquée correcte et les autres réponses qui se leva voix. Tous ceux qui étaient, en effet, Windows 7 solutions spécifiques.
Aucune de ces réponses semblent mentionner explicitement la croisée des erreurs. Je suis de voir que ces bien (et oui Git est très lent sur ce PC).
OriginalL'auteur AndyL | 2011-05-01
Vous devez vous connecter pour publier un commentaire.
Généralement, quand un programme a besoin de 30 secondes pour faire quelque chose qui devrait être instantané, il est plus susceptible d'être un I/O problème de délai d'attente, généralement de réseau, plutôt que de la vitesse de votre CPU ou de la quantité de RAM que vous avez. Vous pouvez vous demander comment le réseau est impliqué, mais c'est une question légitime (je ne sais pas pour votre système).
Msysgit installe un spécial invite de commande qui s'exécute une fonction spéciale
__git_ps1
qui montre une partie de l'information utile dans l'invite de commandes. Vous pouvez voir ce à l'aide deecho $PS1
, pour mon système, cette montre:Cette information supplémentaire est totalement facultative et vous pouvez le désactiver. Donc, essayez les options suivantes dans une Msysgit fenêtre:
Ceci permet de réinitialiser l'invite par défaut
$
et de ne pas essayer de courir et de commandes à l'intérieur de l'invite de commandes. Si cela résout votre problème de retard, alors il est susceptible d'être le__git_ps1
fonction. Essayer de l'exécuter manuellement:et voir combien de temps il faut pour revenir.
Vous pouvez résoudre ce problème en supprimant la ligne qui appelle
__git_ps1
deC:\Program Files\Git\etc\profile
:Sur une inspection plus poussée, en cours d'exécution juste
git
à partir de l'invite de commande de windows est d'abord rapide. Son fonctionnementgit status
ougit anything
à partir de l'invite de commande qui est lent. Après je lance ce, alors même en cours d'exécutiongit
seul est lente. Je suis vérification de Greg réponse maintenant.De toute façon, puis le fix ne va pas aider, car elle est absolument sans rapport avec cmd.
Génial! Si je lance
$ PS1='$ '
, tout est revenu à la normale snappy auto. Si je lance__git_ps1
tout s'enraye, et après environ une minute, jectrl-c
. Alors maintenant, la question est, comment puis-je obtenirPS1='$ '
automatiquement à chaque nouvelle Git bash fenêtre? Déjà il faut 30 secondes pour ouvrir un nouveau Git bash fenêtre.Ok! J'ai fait un edit pour votre réponse qui dit que vous pouvez résoudre le problème en commentant la ligne appropriée dans
C:\Program Files\Git\etc\profile
. Je vous remercie beaucoup. Grande aide.OriginalL'auteur Greg Hewgill
Nous avons donc rencontré ce problème, et je pense que nous avons enfin tracée vers le bas pour msys de la mise en œuvre du modèle de sécurité de Windows. Je vais essayer de poster un court résumé de la problématique:
Capture d'écran:
Trace de la pile de coincé sh.exe. Remarque lorsque msys-1.0.dll les appels en NetServerEnum()
C'est ce qui se passe quand sh.exe est bloqué pendant 30 secondes. Donc
NetServerEnum()
n'est appelée que dansmsys
en un seul endroit, de sécurité.cc:228 dansget_lsa_srv_inf()
, qui est appelée parget_logon_server()
etget_logon_server_and_user_domain()
, qui est appelé danscreate_token()
, qui est appelée parseteuid()
dans syscalls.cc, qui est appelée parsetuid()
.Donc, essentiellement, ce qui se passe est que lorsque le msys DLL est initialisé et sh.exe essaie de l'appeler
setuid()
, msys essaie de respecter fidèlement par le modèle de sécurité de Windows et essaye de regarder la liste des serveurs de domaine de votre domaine/groupe de travail. Malheureusement, contrairement à linux, pour Windows c'est un appel de blocage qui prend de 5 à 30 secondes/timeout, et est, de fait, assez inutile pour le bien, git.Notre solution est de créer de nouvelles msys.dll avec la sécurité "de la fonction" désactivée en définissant has_security à false dans winsup.cc. L'bash/sh.exe qui est venu avec msysgit n'était pas compatible avec notre nouvelle version de msys.dll, nous avons donc dû compiler un nouveau bash.exe à partir de zéro en trop, aucune idée pourquoi. Le résultat final a été sh.exe n'essaie plus de faire de ces NetServerEnum appelle et exécute lickity split.
OriginalL'auteur user3817699
Si le ralentissement est vu lors de l'exécution simultanée de plusieurs commandes Git, il pourrait être dû à un noyau problème de verrouillage à l'intérieur de msysgit
Nous avons vu que, sous certaines conditions, plusieurs instances de git.exe serait attendons tous sur le même noyau de l'objet (à l'intérieur de
WaitForSingleObject()
), cela signifie effectivement que d'une seule commande git peut être exécuté sur le système à un moment.Voir ici:
À l'aide de ProcessExplorer, nous avons pu voir tous les git.exe les processus ont été coincés ici:
Cela semble être lié à cette question: http://code.google.com/p/msysgit/issues/detail?id=320 en ce qu'il n'est pas Git, mais le pseudo-Linux runtime (mingw) qui semble contenir le problème.
Nous avons changé le compte d'utilisateur utilisé pour exécuter les applications de SYSTÈME à un compte d'utilisateur interactif, et l'objet de noyau attend s'en alla:
Sain git.exe processus
Par conséquent, le ralentissement de la vous voyez POURRAIENT être liées à une sorte de noyau de l'objet de la contention que lorsque la précédente commande git a publié le noyau de verrouiller les autres commandes être en mesure d'exécuter.
Essayez de modifier le compte d'utilisateur sous lequel vous exécutez les commandes git, et voir si cela résout le problème - il a fait pour nous.
OriginalL'auteur Matthew Skelton
Bien que Greg la réponse de résoudre le immédiate de problème de vitesse j'ai senti que c'est seulement de masquer le problème et non le résoudre.
J'ai commencé à avoir git bash exécuter lentement et en suivant les étapes Greg décrit n'a identifier
__git_ps1
comme étant le coupable.Plutôt que de modifier l'invite de commande info (je trouve qu'il est utile d'avoir des informations qu'il affiche), j'ai trouvé une solution qui a fonctionné pour moi, décrit dans un post de blog:
Solution pour ralentir Git bash lorsque vous êtes connecté en tant qu'utilisateur de domaine
La même solution a été aussi publié sur DONC répondant à une question similaire.
L'ajout de la variable d'environnement retourné git à pleine vitesse et je reçois toujours la ligne de commande de l'information.
OriginalL'auteur Tony
J'avais lent processus de bifurcation des problèmes sur une machine Windows XP. Parfois, un processus de fourche prendrait minutes.
Le correctif pour moi a été de vider l'ordinateur du dossier TEMP. L'ordinateur est une ressource partagée, et avait été accumulé des fichiers en plus de quelques années.
OriginalL'auteur murrayh
Si sh bloque l'énumération des serveurs d'ouverture de session dans NetServerEnum, essayez de définir la variable d'environnement LOGONSERVER à la véritable serveur d'ouverture de session.
OriginalL'auteur Arrigo Zanette