2011-07-25 129 views
14

只是测试一个非常简单的命令,如:为什么Cygwin非常缓慢地执行shell命令?

while true; do bash -c "echo hello"; done 

你会发现在Cygwin的bash的多少减缓的。有人知道为什么吗?

这是在win7上新安装的cygwin 1.7。

感谢Jared的测试想法,我修改了命令,这(增加的bash -c):

time for i in {1..10} ; do bash -c "echo Hello" ; done 
Hello 
... 
real 0m7.711s //it's the problem 
user 0m0.091s 
sys 0m0.476s 
+1

也许麻烦在于Windows 7无法快速创建进程? –

+6

Windows无法* fork *进程非常快。事实上,它根本就没有“叉”。 Cygwin欺骗它,但不能像真正的* nix那样高效地在任何地方做到。每个进程都从头开始,并且必须加载并初始化fork-and-go系统已经加载的cygwin DLL,libc等。 – cHao

+0

但奇怪的是,在创建10个进程大约7.7秒的命令期间,CPU为空,您可以看到用户&sys时间稍微有点短。看起来bash正在等待什么,但是它还在等什么呢? – Lcsky

回答

4

最后,我找到了源代码 - 在我的办公电脑上运行的一个名为“QQPCMgr RTP Service”的服务,它是“QQ PC Manager”的实时保护服务。

通过禁用它,在这个问题脚本的时候回落到:

real 0m0.943s 
user 0m0.105s 
sys  0m0.231s 

我已经告诉QQPCMgr开发商这件事,希望他们能找到原因。

这还是比Linux慢很多,但是和其他cygwin计算机的“实时”一样。

谢谢大家!

+3

你是如何确定这一点的?我寻找服务,但没有看到它,我有同样的问题。 我在{1..10};做bash -c“echo你好”;做 你好 ... 真正0m18.070s 用户0m0.061s SYS 0m0.385s –

1

从shell脚本调用Bash不能快速。是否更快地使用

while true; echo hello; done 

+2

是啊,这是为什么我在问题行中添加了“bash -c”,如果不是,它运行速度非常快!但配置脚本Makefiles通过调用一个新的bash运行,所以它非常缓慢。 – Lcsky

5

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

1

让我们给它一些数字。我跑了以下内容:

time for i in {1..1000} ; do echo "Hello" ; done 

结果我从一个标准的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本身并不是问题,它是显示器试图保持速度,这会降低速度(对于此测试)。

+0

'code' $ in for {1..10};做bash -c“echo你好”;做 你好 ... 真正0m7.711s 用户0m0.091s SYS 0m0.476s – Lcsky

+0

OK,如果它采取700毫秒执行单回声的东西肯定是不对您的设置。你在xterm中试过了吗?你必须下载X软件包才能得到它。 – Jared

+1

你在当前shell中执行'echo',而操作是产生一个新的shell来完成每个回声。这将会有性能差异。 –

1

我对James McLeod投了赞成票,因为开始一个bash过程需要一些时间,但这并不意味着它将运行比UNIX更慢的命令。

从bash脚本中调用bash -c接近无意义,Makefiles可以调用很多bash子进程,除非在命令末尾附加; \

例如,如果一个Makefile有以下几点:

echo Hello World 
echo Good Bye 

它会调用两个bash的过程。为了使其更快,并呼吁只有一个bash进程:

echo Hello World; \ 
echo Good Bye 

的Debian采用了仪表板,而不是bash作为主要的外壳,因为开始使用bash将使系统很多init脚本需要更长的时间来引导(每个脚本调用它自己的bash过程)。

3

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

  • 如果你可以选择在“局域网设置”,“自动检测设置”,Windows将使用WPAD协议来发现本地HTTP代理。首先它会发送一个DHCP“Inform”请求,其中包含选项252,然后它将尝试在“wpad”上进行DNS查找。这2个操作可能需要几秒钟才能超时。

  • 如果shell访问像/cygdrive/...这样的路径,将执行一个NetBIOS名称查询,这也可能需要一些时间才能超时。

解决方案:

  • 禁用 “自动检测设置” 中的 “局域网设置”,在Windows的 “Internet选项” 控制面板。

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

127.0.0.1 localhost cygdrive wpad

+0

“禁用 ”自动检测“ 中的 ”局域网设置设置“。” - 我该怎么做呢 ?我无法找到cygwin安装程序。 – Steam

+0

这不是Cygwin设置,而是Windows设置 – Demi

+1

@Steam,从开始搜索* Internet选项*,打开它,单击连接选项卡,单击设置,并取消选中自动检测设置 – SomeGuyOnAComputer

1

我能够解决通过卸载的bash完成和切换卡巴斯基到Windows Security Essentials的这个问题。 (我使用Process Explorer诊断卡巴斯基干扰,同时运行“echo Hello”基准测试)。将我的基准测试时间从7秒提高到了0.2秒。

+0

在我的情况下停止服务AVP(卡巴斯基端点安全服务)将进程启动时间从200ms减少到几乎<1ms。不幸的是[Microsoft Security Essentials显然不能保护你](http://www.pcpro.co.uk/reviews/software/379954/microsoft-security-essentials),所以它不是我的选择 – sinelaw

11

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

+1

我使用avast而这个解决方案已经为我工作。 – iCantSeeSharp

+0

哪条路径是cygwin路径?我排除了这一个 - C:\ cygwin64。顺便说一句,对于一些防病毒如诺顿,你可以在某处找到“例外”选项,并将该文件夹添加到例外列表中。 – Steam

+0

我是否还应该添加cygwin下载所有软件包的文件夹?也就是说,有一个怪异的名字,如 - 'ftp%3a%2f%2fftp.harvard.univ.edu%2fpub%2fcygwin%2f' – Steam

1

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

1

这就是这个问题是如何表现出来的。首先在cygwin提示符下输入的20个命令很快,然后突然变得非常缓慢。

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

我尝试了其他地方建议的认证修复 - https://superuser.com/questions/877051/cygwin-from-windows-very-slow-laggy/1247517。 它没有为我工作。

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