Git sh.exe process de forking problema en Windows XP, lento?

Git es esencial para mi flujo de trabajo. Ejecuto MSYS Git en Windows XP en mi máquina de cuatro núcleos con 3 GB de RAM, y normalmente es receptivo y rápido.

De repente, ha surgido un problema por el que se requieren más de 30 segundos para ejecutar cualquier command desde el símbolo del sistema de Git Bash, incluidos ls o cd . Curiosamente, desde el prompt Bash parece que ls gusta se ejecuta bastante rápido, entonces puedo ver el resultado de ls , pero luego toma ~ 30 segundos para que vuelva el prompt. Si cambio al indicador de commands de Windows (ejecutando cmd desde el menu de inicio) los commands relacionados con git también demoran una eternidad, incluso solo para ejecutar. Por ejemplo, el git status puede tomar cerca de un minuto antes de que ocurra algo. A veces los processs simplemente no terminan.

Tenga en count que tengo instalado "MSYS Git" y "MSYS" regulares para cosas como MinGW y make .

Creo que el problema está relacionado con sh.exe ubicado en C:\Program Files\Git\bin . Cuando ejecuto ls desde el indicador bash, o cuando invoco git desde el indicador de Windows, el administrador de tareas muestra hasta cuatro instancias de processs sh.exe que aparecen y desaparecen.

Aquí estoy esperando que ls vuelva y se puede ver que el administrador de tareas tiene ejecutando git.exe y cuatro instancias de sh.exe : Aquí estoy esperando que ls regrese y se puede ver que el administrador de tareas tiene ejecutando git.exe y cuatro instancias de sh.exe

Si ctrl-c en medio de un ls veces obtengo errores que incluyen:

 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 

O para el git status : git status $ git

 sh.exe": fork: Resource temporarily unavailable sh.exe": fork: Resource temporarily unavailable sh.exe": fork: Resource temporarily unavailable sh.exe": fork: Resource temporarily unavailable 

¿Puedo arreglar esto para que git vuelva a funcionar rápidamente y, de ser así, cómo?

Cosas que he intentado:

  • Reiniciar
  • Actualice MSYS Git a la versión más reciente y reinicie
  • Actualice MSYS a la versión más reciente y reinicie
  • Desinstalar MSYS y desinstalar y reinstalar MSYS Git solo y reiniciar

Me gustaría mucho no borrar mi caja y volver a instalar Windows, pero lo haré si no puedo solucionarlo. Ya no puedo codificar si me lleva> 30 s ejecutar el git status o cd. git status cd.

Por lo general, cuando un progtwig tarda 30 segundos en hacer algo que debe ser instantáneo, es más probable que sea un problema de time de espera de E / S, generalmente de networking, en lugar de la velocidad de su CPU o la cantidad de RAM que tiene. Puede que se pregunte cómo está involucrada la networking, pero esa es una pregunta legítima (yo tampoco lo sabría para su sistema).

Msysgit instala un aviso especial que ejecuta una function especial __git_ps1 que muestra información útil en el aviso. Puedes ver esto usando echo $PS1 , para mi sistema esto muestra:

 $ echo $PS1 \[\033]0;$MSYSTEM:\w\007 \033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\] $ 

Esta información adicional es totalmente opcional y puedes desactivarla. Intente lo siguiente en una window de Msysgit:

 $ PS1='$ ' $ 

Esto restablecerá el aviso a $ pnetworkingeterminado y no intentará ejecutar commands dentro del aviso. Si esto resuelve su problema de retraso, entonces es probable que sea la function __git_ps1 . Intente ejecutarlo manualmente:

 $ __git_ps1 (master) 

y ver cuánto tarda en regresar.

Puede solucionar esto eliminando la línea que invoca __git_ps1 desde C:\Program Files\Git\etc\profile :

 #Comment the lines below #PS1='\[\033]0;$MSYSTEM:\w\007 #\033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\] #$ ' 

Así que nos encontramos con este problema también, y creo que finalmente lo rastreamos hasta la implementación de msys del model de security de Windows. Trataré de publicar un breve resumen del problema:

Captura de pantalla: Stack trace of stuck sh.exe. Tenga en count cuando msys-1.0.dll llama a NetServerEnum ()

Esto es lo que sucede cuando sh.exe está bloqueado durante 30 segundos. Así que NetServerEnum() solo se llama en msys en un solo lugar, security.cc:228 en get_lsa_srv_inf() , que es llamado por get_logon_server() y get_logon_server_and_user_domain() , que se llama en create_token() , que es llamado por seteuid() en syscalls.cc, que es llamado por setuid() .

Entonces, esencialmente, lo que sucede es que cuando se inicializa la DLL de msys y sh.exe intenta llamar a setuid() , msys intenta cumplir fielmente con el model de security de Windows e intenta search la list de serveres de dominio de su dominio / grupo de trabajo. Desafortunadamente, a diferencia de Linux, para Windows es una llamada de locking que demora entre 5 y 30 segundos en completarse / agotar el time de espera, y en realidad es bastante innecesario para bien, git.

Nuestra solución es crear un nuevo msys.dll con la "característica" de security deshabilitada estableciendo has_security en false en winsup.cc. El bash / sh.exe que vino con msysgit no era compatible con nuestra nueva versión de msys.dll, por lo que tuvimos que comstackr un nuevo bash.exe desde cero también, ni idea de por qué. El resultado final fue que sh.exe ya no intenta hacer estas llamadas NetServerEnum y ejecuta la split de lamer.

Si la ralentización se ve al ejecutar múltiples commands simultáneos de Git, podría deberse a un problema de locking del núcleo dentro de msysgit

Vimos que bajo ciertas condiciones, múltiples instancias de git.exe esperarían todas en el mismo object kernel (dentro de WaitForSingleObject() ), lo que significa que solo un solo command git podría ejecutarse en el sistema a la vez.

Mira aquí: 10 git.exe procesa todos los que esperan en un único objeto kernel

Con ProcessExplorer, pudimos ver que todos los processs de git.exe estaban atascados aquí:

 ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732 ntoskrnl.exe!KeWaitForMutexObject+0x19f ntoskrnl.exe!FsRtlCancellableWaitForMultipleObjects+0x5e ntoskrnl.exe!FsRtlCancellableWaitForSingleObject+0x27 

Esto parece estar relacionado con este problema: http://code.google.com/p/msysgit/issues/detail?id=320 en el sentido de que no es Git, sino el time de ejecución de pseudo-Linux (mingw) que parece contener el problema. .

Cambiamos la count de usuario utilizada para ejecutar las aplicaciones de SYSTEM a una count de usuario interactiva, y el object kernel espera se fue:

Procesos saludables de git.exe git.exe procesa el desove felizmente

Por lo tanto, la ralentización que está viendo PODRÍA estar relacionada con algún tipo de conflicto de objects del kernel, solo cuando el command git anterior haya liberado el locking del kernel que podrían ejecutar otros commands.

Intente cambiar la count de usuario bajo la cual está ejecutando los commands de git, y vea si esto resuelve el problema, lo hizo por nosotros.

Aunque la respuesta de Greg resuelve el problema de la velocidad inmediata, sentí que solo está enmascarando el problema y no resolviéndolo.

Comencé a ejecutar git bash lentamente y siguiendo los pasos que describe Greg identificó a __git_ps1 como el culpable.

En lugar de modificar la información del símbolo del sistema (me parece útil tener la información que muestra) encontré una solución que funcionó para mí, descrita en una publicación de blog:

Solución para ralentizar Git bash cuando inicia session como usuario de dominio

Buscando un poco en internet, encontré que git usa el hogar pnetworkingeterminado, en mi count configurada para ser una count de networking. Este aspecto que git searchía en este directory todo el time, provocando la demora.

Para solucionar esto, creé una variable de entorno de usuario local, anulando la pnetworkingeterminada, y configurándola en% PERFILDEUSUARIO, que apunta a c: \ usuarios [nombre de usuario].

La misma solución también se publicó en SO respondiendo una pregunta similar .

Agregar la variable de entorno devolvió git a toda velocidad y todavía obtengo la información de la línea de command.

Tuve un process lento forking problemas en una máquina con Windows XP. Ocasionalmente, una horquilla de process tomaría minutos.

La solución para mí fue vaciar la carpeta TEMP de la computadora. La computadora era un recurso compartido y se habían acumulado files allí durante algunos años.

Si se bloquea la enumeración de los serveres de inicio de session en NetServerEnum, intente configurar la variable de entorno LOGONSERVER en el server de inicio de session real.