windows XP上的Git sh.exe进程分叉问题,速度慢?
Git对我的工作流程至关重要。我在我的四核机器上用3GB内存在WindowsXP上运行MSYSGit,通常它响应迅速 突然出现了一个问题,从gitbash命令提示符运行任何命令都需要>30秒,包括windows XP上的Git sh.exe进程分叉问题,速度慢?,git,bash,shell,windows-xp,msysgit,Git,Bash,Shell,Windows Xp,Msysgit,Git对我的工作流程至关重要。我在我的四核机器上用3GB内存在WindowsXP上运行MSYSGit,通常它响应迅速 突然出现了一个问题,从gitbash命令提示符运行任何命令都需要>30秒,包括ls或cd。有趣的是,从bash提示符来看,它看起来像是ls运行得相当快,然后我可以看到ls的输出,但是提示符返回大约需要30秒。如果我切换到windows命令提示符(通过从“开始”菜单运行cmd),git相关的命令也会花费很长时间,即使只是运行。例如,git status可能需要将近一分钟的时间才能发
ls
或cd
。有趣的是,从bash提示符来看,它看起来像是ls
运行得相当快,然后我可以看到ls
的输出,但是提示符返回大约需要30秒。如果我切换到windows命令提示符(通过从“开始”菜单运行cmd
),git相关的命令也会花费很长时间,即使只是运行。例如,git status
可能需要将近一分钟的时间才能发生任何事情。有时这些过程根本就没有完成
请注意,我已经安装了“MSYS Git”以及用于MinGW
和make
之类的常规“MSYS”
我认为问题与位于C:\Program Files\Git\bin
中的sh.exe
有关。当我从bash提示符运行ls
或从windows提示符调用git
时,任务管理器最多显示四个来来去的sh.exe
进程实例
在这里,我正在等待ls
返回,您可以看到任务管理器正在运行git.exe
和四个sh.exe
实例:
如果我在<代码> L/<代码>的中间出现代码> CTRL C <代码>,我有时会得到一些错误,其中包括:
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
我可以修复这个问题以使git再次快速运行吗?如果可以,如何修复
我尝试过的事情:
- 重新启动
- 将MSYS Git升级到最新版本并重新启动
- 将MSYS升级到最新版本并重新启动
- 卸载MSYS&仅卸载和重新安装MSYS Git&重新启动
我很想不擦我的盒子,重新安装Windows,但如果我不能修复这个问题,我会的。如果运行
git status
或cd需要30秒以上的时间,我就不能再编写代码了。
通常,当一个程序需要30秒来完成一些应该是即时的事情时,更可能是I/O超时问题,通常是网络问题,而不是CPU的速度或RAM的数量。您可能想知道网络是如何涉及的,但这是一个合理的问题(我也不知道您的系统)
Msysgit安装一个特殊的提示符,运行一个特殊的函数\uu git\u ps1
,在提示符中显示一些有用的信息。您可以使用echo$PS1查看此信息,对于我的系统,此信息显示:
$ echo $PS1
\[\033]0;$MSYSTEM:\w\007 \033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\] $
此额外信息是完全可选的,您可以将其关闭。因此,请在Msysgit窗口中尝试以下操作:
$ PS1='$ '
$
这会将提示重置为默认的$
,而不会尝试在提示内运行和命令。如果这解决了延迟问题,那么很可能是\uu git\u ps1
函数。尝试手动运行它:
$ __git_ps1
(master)
看看需要多长时间才能回来
您可以通过从C:\Program Files\git\etc\profile
中删除调用\u git\u ps1
的行来修复此问题:
#Comment the lines below
#PS1='\[\033]0;$MSYSTEM:\w\007
#\033[32m\]\u@\h \[\033[33m\w$(__git_ps1)\033[0m\]
#$ '
虽然格雷格的回答解决了眼前的速度问题,但我觉得这只是掩盖了问题,而不是解决问题 我开始让git bash缓慢运行,按照Greg描述的步骤,我确实确定了肇事者是
\ugit\ups1
我没有修改命令提示符信息(我发现它显示的信息很有用),而是找到了一个适合我的解决方案,在一篇博客文章中描述:
搜索一下互联网,我发现git使用默认的home,
在我的帐户上设置为网络帐户。这是git将要做的承诺
一直查看此目录,导致延迟
为了解决这个问题,我创建了一个本地用户环境变量,覆盖
默认值,并将其设置为%USERPROFILE%,指向
c:\users[用户名]
同样的解决方案也发布在SO上
添加环境变量使git恢复全速运行,我仍然可以获得命令行信息。如果在同时运行多个git命令时发现速度减慢,则可能是由于msysgit中的内核锁定问题造成的 我们看到,在某些情况下,git.exe的多个实例都会在同一个内核对象上等待(在
WaitForSingleObject()
中),这实际上意味着一次只能在系统上运行一个git命令
请看这里:
使用ProcessExplorer,我们可以看到所有git.exe进程都卡在这里:
ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
ntoskrnl.exe!KeWaitForMutexObject+0x19f
ntoskrnl.exe!FsRtlCancellableWaitForMultipleObjects+0x5e
ntoskrnl.exe!FsRtlCancellableWaitForSingleObject+0x27
这似乎与这个问题有关:不是Git而是伪Linux运行时(mingw),它似乎包含了这个问题
我们将用于从系统运行应用程序的用户帐户更改为交互式用户帐户,内核对象等待消失:
正常的git.exe进程
因此,您所看到的减速可能与某种内核对象争用有关——只有当前面的git命令释放了内核锁时,其他命令才能运行
尝试更改运行git命令所使用的用户帐户,看看这是否解决了问题—我们确实解决了。我在Windows XP机器上遇到了缓慢的进程分叉问题。有时,一个进程分叉需要几分钟的时间
我的解决办法是清空计算机的临时文件夹。计算机是一种共享资源,多年来一直在其中积累文件。因此我们也遇到了这个问题,我认为我们最终将其追溯到msys对Windows安全模型的实现。我将尝试发布该问题的简短摘要: 截图: 卡住的sh.exe的堆栈跟踪。当msys-1.0.dll调用NetServerEnum()时请注意 这就是sh.exe被阻止30秒时发生的情况。因此,
NetServerEnum()
只在msys
中的一个地方调用,即
ntoskrnl.exe!KeWaitForMultipleObjects+0xc0a
ntoskrnl.exe!KeAcquireSpinLockAtDpcLevel+0x732
ntoskrnl.exe!KeWaitForMutexObject+0x19f
ntoskrnl.exe!FsRtlCancellableWaitForMultipleObjects+0x5e
ntoskrnl.exe!FsRtlCancellableWaitForSingleObject+0x27