【问题标题】:Why does Cygwin execute shell commands very slowly?为什么 Cygwin 执行 shell 命令很慢?
【发布时间】:2011-07-25 03:04:08
【问题描述】:

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

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

【问题讨论】:

  • 问题可能只是Windows 7无法快速创建进程?
  • Windows 不能非常快地fork 进程。事实上,它根本不是fork。 Cygwin 捏造它,但不能像真正的 *nix 那样有效地做到这一点。每个进程都是从头开始,并且必须加载和初始化 fork-and-go 系统已经加载的 cygwin DLL、libc 等。
  • 但奇怪的是,在创建10个进程的命令大约7.7秒的过程中,CPU是空的,可以看到user & sys时间稍微有点。看起来 bash 正在等待什么,但它在等待什么?
  • 我得到 0.970s 真实,0.090s 用户,0.307s 系统。 (我认为它可能是一个启动脚本,但bash -c ... 不会调用任何启动脚本。)strace -o bash.strace bash -c "echo hello" 可能会告诉您一些有用的信息。
  • > time ls -la ~/c/cygwin64/bin 给了我一个难以想象的 3 分 46.373 秒!!它总是很慢,但最近我们的 IT 部门。更改了 Windows 登录域和用户名,从那以后一切都崩溃了……

标签: bash cygwin


【解决方案1】:

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

【讨论】:

  • 哪些路径是 cygwin 路径?我排除了这个 - C:\cygwin64。顺便说一句,对于诺顿等一些防病毒软件,您可以在某处找到“例外”选项并将此文件夹添加到例外列表中。
  • 我还应该添加 cygwin 下载所有包的文件夹吗?也就是说,那个名字很奇怪的那个 - ftp%3a%2f%2fftp.harvard.univ.edu%2fpub%2fcygwin%2f
  • 据我所知,下载的包文件夹仅用于缓存下载的包和安装/重新安装 Cygwin 设置。运行 cygwin 时不使用这些文件。我认为 c:\cygwin64 应该足够了。我也会检查 Windows 系统文件夹中的 cygwin DLL。并不是说我建议将重要的 Windows 文件夹添加到 AV 异常中:)
  • 我使用 Avast 防病毒软件。 Cygwin 执行任何操作都非常缓慢。禁用 Avast 盾牌使 Cygwin 速度非常快。
  • 在我的例子中,我的 PS1(自定义提示)变量集的性能非常差。一旦我删除它,一切都非常快。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

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

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

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

    解决方案:

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

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

    127.0.0.1 localhost cygdrive wpad

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

    【讨论】:

    • “禁用“局域网设置”中的“自动检测设置”。 - 我该怎么做呢 ?我找不到 cygwin 安装程序。
    • 这不是 Cygwin 设置,而是 Windows 设置
    • @Steam,从“开始”>“搜索”中搜索Internet选项,打开它,单击“连接”选项卡,单击“设置”,然后取消选中“自动检测设置”
    • 正确。谢谢伙计,一直在寻找解决网络 UNC 路径上目录更改缓慢的解决方案。更清楚一点,如果您正在浏览 \\somehost\some\path,那么 somehost 应该在 hosts 文件中。这在使用 DFS 映射的 UNC 路径时特别有用。
    【解决方案4】:

    终于找到了源头——在我的办公电脑上运行了一个名为“QQPCMgr RTP Service”的服务,它就是“QQ电脑管家”的实时防护服务。

    通过禁用它,问题中脚本的时间回落到:

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

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

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

    谢谢大家!

    【讨论】:

    • 您是如何确定这一点的?我寻找服务,但没有看到它,我遇到了同样的问题。 {1..10} 中 i 的时间;执行 bash -c "echo Hello" ;完成 你好...真正的 0m18.070s 用户 0m0.061s 系统 0m0.385s
    【解决方案5】:

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

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

    我尝试了其他地方建议的身份验证修复 - https://superuser.com/questions/877051/cygwin-from-windows-very-slow-laggy/1247517 。 它对我不起作用。

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

    【讨论】:

      【解决方案6】:

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

      在 bash 脚本中调用 bash -c 几乎毫无意义,而且 Makefile 可以调用许多 bash 子进程,除非您在命令末尾附加 ; \

      例如,如果 Makefile 具有以下内容:

      echo Hello World
      echo Good Bye
      

      它将调用两个 bash 进程。为了让它更快并且只调用一个 bash 进程:

      echo Hello World; \
      echo Good Bye
      

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

      【讨论】:

        【解决方案7】:

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

        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 本身不是问题,是试图跟上的显示器导致速度变慢(对于这个测试)。

        【讨论】:

        • code $ time for i in {1..10} ;执行 bash -c "echo Hello" ;完成 你好...真正的 0m7.711s 用户 0m0.091s 系统 0m0.476s
        • 好的,如果执行单个回显需要 700 毫秒,那么您的设置肯定有问题。你在xterm中试过了吗?您也必须下载 X 包才能获得它。
        • 您在当前 shell 中执行 echo 而操作正在生成一个新 shell 来执行每个回显。这将产生性能差异。
        【解决方案8】:

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

        【讨论】:

        • 在我的情况下,停止服务 AVP(卡巴斯基端点安全服务)将进程启动时间从 200 毫秒减少到几乎 Microsoft Security Essentials apparently does not protect you,所以这不是我的选择
        【解决方案9】:

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

        【讨论】:

          【解决方案10】:

          对于 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
          

          【讨论】:

            【解决方案11】:

            从 shell 脚本调用 bash 并不快。只是使用会更快吗

            while true; echo hello; done
            

            ?

            【讨论】:

            • 是的,这就是我在问题行中添加“bash -c”的原因,如果没有,它运行得非常快!但是配置脚本,Makefiles 通过调用一个新的 bash 来运行,所以非常慢。
            猜你喜欢
            • 2018-12-31
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2020-06-08
            • 2012-06-17
            • 2023-02-17
            相关资源
            最近更新 更多