所有 Cygwin 应用程序的启动速度都非常慢
Startup is really slow for all Cygwin applications
在 Windows 8.1 x64 上,任何 Cygwin 应用程序的启动都需要 一分多钟。没关系,我是从快捷方式启动 mintty
还是从 bin 文件夹启动 cygwin.bat
或 ls.exe
或 bash.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
我试过的步骤:
- 重新安装并尝试了几次 Cygwin 和 Cygwin64(版本 2.864)
- 以管理员身份启动它们
- 尝试在 Windows 7 兼容模式下 运行 它们
- 已禁用 "Automatically detect settings" LAN as in this reply
- 已将
127.0.0.1 localhost cygdrive wpad
添加到主机 as in same reply
- 将防病毒设置为禁用状态
- 已检查 Bash 完成未安装(没有
/etc/bash_completion.d
文件夹)
- 已在设备管理器中禁用所有可移动驱动器(仅保留系统 SSD 和数据 HDD)
- 尝试 运行 空
etc/profile.d
文件夹
- 尝试 运行 使用空
etc/bash.bashrc
文件
我还能如何找到根本原因?
P.S。 -
我有两个不同的系统,笔记本电脑和台式机都使用 Windows 8.1 64 位。这个问题在两者上都是 100% 可重现的。
此外,如果我在登录后 Bash 几秒钟后启动,它会立即启动。
最终我找到了导致这个问题的原因,但我仍然不确定为什么。 Cygwin 可以很好地为处于相同环境中的其他人工作。
原因: 在每个 Cygwin 应用程序启动时,它都会尝试获取凭据,如 etc/nsswitch.conf
文件中所述。出于某种原因,我的帐户需要花费大量时间,因为它通过 LDAP 与多个 Active Directory 域控制器联系。
解决方案 1: 您可以将当前用户和组保存在 etc/passwd
和 etc/group
文件中,并设置 Cygwin 在 Active Directory 之前检查它们。
- 启动
mintty.exe
并等待它打开
- 运行
mkpasswd -c
并将其输出保存到 etc/passwd
文件(您必须创建它,输出应该是一行)
- 运行
mkgroup -c
并将其输出保存到 etc/group
文件(您必须创建它,输出应该是一行)
- 打开
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 的情况下它会 运行 更快。但还没有运气。
这是对我有用的方法。
启动 Cygwin 终端,然后 运行 以下两个字符串。
mkpasswd -c > /etc/passwd
mkgroup -c > /etc/group
编辑您的“/etc/nsswitch.conf”文件以包含以下两行。
passwd: files # db
group: files # db
重新启动 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' 添加到路径对我有用。
在 Windows 8.1 x64 上,任何 Cygwin 应用程序的启动都需要 一分多钟。没关系,我是从快捷方式启动 mintty
还是从 bin 文件夹启动 cygwin.bat
或 ls.exe
或 bash.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
我试过的步骤:
- 重新安装并尝试了几次 Cygwin 和 Cygwin64(版本 2.864)
- 以管理员身份启动它们
- 尝试在 Windows 7 兼容模式下 运行 它们
- 已禁用 "Automatically detect settings" LAN as in this reply
- 已将
127.0.0.1 localhost cygdrive wpad
添加到主机 as in same reply - 将防病毒设置为禁用状态
- 已检查 Bash 完成未安装(没有
/etc/bash_completion.d
文件夹) - 已在设备管理器中禁用所有可移动驱动器(仅保留系统 SSD 和数据 HDD)
- 尝试 运行 空
etc/profile.d
文件夹 - 尝试 运行 使用空
etc/bash.bashrc
文件
我还能如何找到根本原因?
P.S。 - 我有两个不同的系统,笔记本电脑和台式机都使用 Windows 8.1 64 位。这个问题在两者上都是 100% 可重现的。
此外,如果我在登录后 Bash 几秒钟后启动,它会立即启动。
最终我找到了导致这个问题的原因,但我仍然不确定为什么。 Cygwin 可以很好地为处于相同环境中的其他人工作。
原因: 在每个 Cygwin 应用程序启动时,它都会尝试获取凭据,如 etc/nsswitch.conf
文件中所述。出于某种原因,我的帐户需要花费大量时间,因为它通过 LDAP 与多个 Active Directory 域控制器联系。
解决方案 1: 您可以将当前用户和组保存在 etc/passwd
和 etc/group
文件中,并设置 Cygwin 在 Active Directory 之前检查它们。
- 启动
mintty.exe
并等待它打开 - 运行
mkpasswd -c
并将其输出保存到etc/passwd
文件(您必须创建它,输出应该是一行) - 运行
mkgroup -c
并将其输出保存到etc/group
文件(您必须创建它,输出应该是一行) - 打开
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 的情况下它会 运行 更快。但还没有运气。
这是对我有用的方法。
启动 Cygwin 终端,然后 运行 以下两个字符串。
mkpasswd -c > /etc/passwd mkgroup -c > /etc/group
编辑您的“/etc/nsswitch.conf”文件以包含以下两行。
passwd: files # db group: files # db
重新启动 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' 添加到路径对我有用。