【问题标题】:Startup is really slow for all Cygwin applications所有 Cygwin 应用程序的启动速度都很慢
【发布时间】:2015-02-09 13:25:04
【问题描述】:

在 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 兼容模式下运行它们
  • 为 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 文件运行

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

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

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

【问题讨论】:

  • 禁用网络适配后,cygwin 会立即启动。因此,它会尝试连接到某个网络资源。
  • 网络监视器显示 cygwin 应用程序的大量网络活动。他们通过 TCP 和 LDAPMessage 从我的网络访问一些机器到 LDAP 端口。
  • 我也有同样的问题。我尝试了下面的解决方案 1 和解决方案 2,但都没有解决问题。顺便说一句,当我运行“mkpasswd”时,我的组织中有一个非常长的列表。
  • @Hugues 你很可能忘记了 mkpasswd 的 -c 标志。最后,您必须只将一行保存到passwd 文件中。 mkgroup 也一样。
  • 我在尝试解决方案 1 时确实包含了 -c 标志; /etc/passwd 和 /etc/group 都是单行文件。我只是在报告这样一个事实,即缓慢的原因可能是由于我的组织的用户列表很长(mkpasswd | wc -l 报告 >50K 行)

标签: windows cygwin windows-8.1


【解决方案1】:

最终我找到了导致此问题的原因,但我仍然不确定原因。 Cygwin 非常适用于同一环境中的其他人。

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

解决方案1:您可以将当前用户和组保存在etc/passwd和etc/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 运行时。

将它添加到启动中或在 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 的发行说明突出了这一变化。见cygwin.com/ml/cygwin-announce/2015-02/msg00009.html
  • 嗨,我找到了这个帖子并想说我也有类似的问题让我发疯。在发布问题之前,我想了解一下我是否遇到了同样的问题。基本上,我正在运行加入我公司域的 W7。在最近的 cygwin 更新之后,我的 cygwin 终端启动时间非常长,它们大约需要 1 到 2 分钟才能启动!这真是令人沮丧。我将开始阅读上一条评论中建议的主题。
  • @JoseCifuentes 我建议您尝试解决方案 2(只需启动 usr/sbin/cygserver.exe,等到它加载完毕并并行运行任何其他 cygwin 应用程序)。如果有帮助 - 使用解决方案 1,因为它需要更长的时间才能解决,但肯定可以解决问题。
  • 谢谢!我尝试了解决方案 1,但它没有用(不确定我做错了什么),但解决方案 2 确实对我有用。实际提示出现大约需要 2 到 3 秒(猜想它正在运行一些脚本等),但我可以忍受。
  • 不应该解决方案 1 是 passwd: files # db (不要查询 SAM/AD),如其他答案中所建议的那样?至少对我来说,仅仅创建本地文件但在 nsswitch.conf 中保持 db 处于活动状态并不能解决问题。
【解决方案2】:

这对我有用。

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

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

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

Cygwin 打开很快。

【讨论】:

    【解决方案3】:

    如果您在具有大型 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 标志会花费这么多时间吗?另外,不要忘记编辑 nsswitch.conf,如其他答案中所述。
    • 为我工作.. 谢谢
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-01-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2023-04-02
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多