Bash 为什么Cygwin执行shell命令非常慢?

Bash 为什么Cygwin执行shell命令非常慢?,bash,cygwin,Bash,Cygwin,只需测试一个非常简单的命令,如: while true; do bash -c "echo hello"; done 你会发现Cygwin中的bash有多慢。有人知道为什么吗 这是在win7上新安装的cygwin 1.7 多亏了Jared的测试思想,我修改了命令(添加了bash-c): 从shell脚本调用bash不会很快。仅仅使用它更快吗 while true; echo hello; done 检查您的路径。引用不存在的路径或非常慢的网络共享可能会导致您描述的症状。让我们用一些数字来说明

只需测试一个非常简单的命令,如:

while true; do bash -c "echo hello"; done
你会发现Cygwin中的bash有多慢。有人知道为什么吗

这是在win7上新安装的cygwin 1.7

多亏了Jared的测试思想,我修改了命令(添加了bash-c):


从shell脚本调用bash不会很快。仅仅使用它更快吗

while true; echo hello; done

检查您的路径。引用不存在的路径或非常慢的网络共享可能会导致您描述的症状。

让我们用一些数字来说明它。我运行了以下命令:

time for i in {1..1000} ; do echo "Hello" ; done
echo Hello World
echo Good Bye
我从标准Cygwin bash窗口获得的结果是:

...
Hello
Hello

real    0m0.584s
user    0m0.031s
sys     0m0.000s
从同一系统上的xterm bash窗口中,我得到:

...
Hello
Hello

real    0m0.037s
user    0m0.016s
sys     0m0.000s

我想这基本上回答了你的问题。问题是您正在通过一个类似于“Windows”“cmd”的窗口,这本身就是一个缓慢的窗口。Cygwin本身并不是问题所在,是显示器试图跟上,这会使速度变慢(在本测试中)。

我对James McLeod投了赞成票,因为启动bash进程需要一些时间,但这并不意味着它运行命令的速度会比UNIX慢

从bash脚本中调用
bash-c
几乎毫无意义,makefile可以调用许多bash子进程,除非附加
\位于命令末尾

例如,如果生成文件具有以下内容:

time for i in {1..1000} ; do echo "Hello" ; done
echo Hello World
echo Good Bye
它将调用两个bash进程。要加快速度并只调用一个bash进程,请执行以下操作:

echo Hello World; \
echo Good Bye

Debian采用dash而不是bash作为主shell,因为使用bash启动许多init脚本将使系统需要更长的启动时间(每个脚本调用自己的bash进程)。

最后,我找到了源代码——一个名为“QQPCMgr RTP服务”的服务,它运行在我的办公室计算机上,是的实时保护服务“QQ电脑管理员”

禁用该选项后,问题中脚本的时间将返回到:

real    0m0.943s
user    0m0.105s
sys     0m0.231s
我已经告诉了QQPCMgr的开发者,希望他们能找到原因

这仍然比Linux慢得多,但与其他cygwin计算机的“实时性”相同


谢谢大家!

下面是我遇到的3个可能的原因。当然,没有提到的其他问题也会导致Cygwin中的shell命令变慢

  • 如果您在“LAN设置”中有“自动检测设置”选项,Windows将使用该协议来发现本地HTTP代理。首先,它将使用选项252发送DHCP“通知”请求,然后它将尝试在“wpad”上进行DNS查找。这两个操作可能需要几秒钟才能超时

  • 如果shell访问一些路径,如
    /cygdrive/…
    ,将执行NetBIOS名称查询,这也可能需要一些时间超时

  • 如果shell访问一些路径,如
    //mypath/…
    ,将执行NetBIOS名称查询,这也可能需要一些时间超时

解决方案:

  • 在Windows“Internet选项”控制面板的“LAN设置”中禁用“自动检测设置”

  • %SystemRoot%\system32\drivers\etc\hosts
    中添加以下条目:

127.0.0.1本地主机cygdrive wpad

  • 确保避免在所有路径的开头使用双斜杠

我通过卸载bash completion并从Kaspersky切换到Windows Security Essentials解决了这个问题。(我在运行“echo Hello”基准测试时使用Process Explorer诊断出卡巴斯基干扰。)将我的基准时间从7秒增加到0.2。

如何从防病毒软件中排除Cygwin路径?

在Comodo Internet Security Premium 10上,我在受信任文件列表中添加了“C:\Users\\Documents\MobaXterm\slash\bin”(设置->文件分级->文件列表).本地终端现在又快了。

这就是这个问题在我看来的表现。对于在cygwin提示符下输入的前20个命令来说,它是快的,然后突然变得非常慢

我检查了路径中的每个项目是否都是有效的目录

我尝试了别处建议的身份验证修复- . 这对我不起作用

我用Sophos替换了现有的病毒扫描程序(System Center Endpoint Protection)。这为我解决了问题。希望这有帮助。

对于Windows Defender:

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender]
"DisableAntiSpyware"=dword:00000001

[HKEY_LOCAL_MACHINE\SOFTWARE\Policies\Microsoft\Windows Defender\Real-Time Protection]
"DisableBehaviorMonitoring"=dword:00000001
"DisableOnAccessProtection"=dword:00000001
"DisableScanOnRealtimeEnable"=dword:00000001
或者不那么引人注目:

powershell -Command Add-MpPreference -ExclusionPath "C:\opt\cygwin64"
powershell -Command Add-MpPreference -ExclusionPath "C:\home"
powershell -Command Add-MpPreference -ExclusionProcess "git.exe"
powershell -Command Add-MpPreference -ExclusionExtension ".c"
powershell -Command Add-MpPreference -ExclusionExtension ".cpp"
powershell -Command Add-MpPreference -ExclusionExtension ".cxx"
对于Sophos:

REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\Sophos Endpoint Defense\Scanning\Config" /v "OnAccessExcludeFilePaths" /t REG_MULTI_SZ /d "C:\Program Files (x86)\Sophos\Sophos Anti-Virus\\0C:\home\\0D:\Video\\" /f
REG ADD "HKLM\SYSTEM\CurrentControlSet\Services\Sophos Endpoint Defense\Scanning\Config" /v "OnAccessExcludeProcessPaths" /t REG_MULTI_SZ /d "C:\opt\cygwin64\\" /f

也许问题只是Windows 7不能很快地创建进程?Windows不能很快地分叉进程。事实上,它根本就没有
fork
。Cygwin对它进行了篡改,但却不能像真正的*nix那样高效地完成。每个进程都是从零开始的,必须加载并初始化分叉的Cygwin DLL、libc等-go系统已经加载了。但奇怪的是,在创建10个进程的命令执行7.7秒的过程中,CPU是空的,你可以看到user&sys时间稍微有点长。看起来bash在等待什么,但它在等待什么呢?我得到了0.970s real,0.090s user,0.307s sys。(我认为它可能是一个启动脚本,但是
bash-c…
没有调用任何启动脚本。)
strace-obash.strace-bash-c“echo hello”“
可能会告诉你一些有用的信息。
>时间ls-la~/c/cygwin64/bin
给了我一个难以想象的3m46.373s!!它总是很慢,但最近我们的It部门更改了Windows登录域和用户名,从那以后一切都糟透了…是的,这就是我添加“bash-c”的原因。”在问题行中,如果不是,它运行得很快!但是配置脚本、makefile通过调用新的bash运行,因此速度非常慢。
code
$time for i in{1..10};执行bash-c“echo Hello”;完成您好…real 0m7.711s用户0m0.091s系统0m0.476sOK,如果执行单个echo需要700ms,则您的设置肯定有问题。您在xterm中尝试过吗?您也必须下载X软件包才能获得此功能。您正在执行
echo