所有 Cygwin 应用程序的启动速度都非常慢

Startup is really slow for all Cygwin applications

在 Windows 8.1 x64 上,任何 Cygwin 应用程序的启动都需要 一分多钟。没关系,我是从快捷方式启动 mintty 还是从 bin 文件夹启动 cygwin.batls.exebash.exe。他们每个人都会很慢。

Bash 或 mintty 启动后,它们运行得相当快:

$ time for i in {1..10} ; do bash -c "echo Hello" ; done
Hello
...
Hello

real    0m1.273s
user    0m0.060s
sys     0m1.181s

我试过的步骤:

我还能如何找到根本原因?

P.S。 - 我有两个不同的系统,笔记本电脑和台式机都使用 Windows 8.1 64 位。这个问题在两者上都是 100% 可重现的。

此外,如果我在登录后 Bash 几秒钟后启动,它会立即启动。

最终我找到了导致这个问题的原因,但我仍然不确定为什么。 Cygwin 可以很好地为处于相同环境中的其他人工作。

原因: 在每个 Cygwin 应用程序启动时,它都会尝试获取凭据,如 etc/nsswitch.conf 文件中所述。出于某种原因,我的帐户需要花费大量时间,因为它通过 LDAP 与多个 Active Directory 域控制器联系。

解决方案 1: 您可以将当前用户和组保存在 etc/passwdetc/group 文件中,并设置 Cygwin 在 Active Directory 之前检查它们。

  1. 启动mintty.exe并等待它打开
  2. 运行 mkpasswd -c 并将其输出保存到 etc/passwd 文件(您必须创建它,输出应该是一行)
  3. 运行 mkgroup -c 并将其输出保存到 etc/group 文件(您必须创建它,输出应该是一行)
  4. 打开etc/nsswitch.conf并写入

nsswitch.conf内容:

passwd: files # db
group:  files # db

现在您的 Cygwin 应该会立即启动。

解决方案 2:有一个特殊的 CygServer 应用程序,随 Cygwin 一起提供,它可以作为 NT 服务或简单进程启动(只是 运行 usr/sbin/cygserver.exe)。它缓存凭证并将它们传播到每个下一个 Cygwin 进程 而 cygserver 是 运行ning.

将它添加到启动程序或在您的 Cygwin 会话之前启动它,这很好 — cygserver 启动需要时间,但每个下一个 Cygwin 进程都会立即启动。

是你的情况吗?我想分享我的调查步骤,你可以看看你的情况是否与我相同。

  • 安装MS Network Monitor,因为它能够显示来自特定进程的流量。 运行 它作为管理员。
  • 创建新的捕获选项卡并单击开始(您不必添加任何过滤器或任何东西)。
  • 启动mintty,你会在netmon中看到它的连接:
  • 选择这些连接后,您将在左侧的树视图中看到 mintty 个连接的列表,在右侧看到 TCP 和 LDAP 框架。
  • 此外,您可以通过 IP 地址获取那些远程计算机的名称。 运行 nbtstat -a 8.8.8.8 在命令行中(将 8.8.8.8 替换为来自 netmon 的 IP 地址之一)。

更深入: 我仍在使用 etc/nsswitch.conf 文件来获取本地凭据或缓存的凭据,因此在没有 cygserver 的情况下它会 运行 更快。但还没有运气。

这是对我有用的方法。

  1. 启动 Cygwin 终端,然后 运行 以下两个字符串。

    mkpasswd -c > /etc/passwd
    mkgroup -c > /etc/group
    
  2. 编辑您的“/etc/nsswitch.conf”文件以包含以下两行。

    passwd:   files # db
    group:    files # db
    
  3. 重新启动 Cygwin。

Cygwin 打开速度很快。

如果您在具有大型 AD 目录的网络上,mkpasswd 将花费大量时间(在我的情况下为几天)。所以考虑使用:

mkpasswd -c -l > /etc/passwd
mkgroup -c -l > /etc/group

 -l,--local [machine]    Print local user accounts of \"machine\",
                         from local machine if no machine specified.
                         Automatically adding machine prefix for local
                         machine depends on settings in /etc/nsswitch.conf.

将 'C:\cygwin64\bin' 添加到路径对我有用。