Подтвердить что ты не робот

Запуск очень медленный для всех приложений cygwin

Запуск любого приложения cygwin занимает больше минуты в Windows 8.1 x64. Это не имеет значения, я запускаю mintty из ярлыка или cygwin.bat или ls.exe или bash.exe из папки bin. Каждый из них будет медленным.

После запуска 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).
  • Запустил их в качестве администратора
  • Пытался запустить их в режиме совместимости с Win7
  • Отключено "Автоматически определять настройки" для LAN как в этом ответе
  • Добавлен 127.0.0.1 localhost cygdrive wpad для хостов как в том же ответе
  • Установить антивирус для отключенного состояния
  • Проверено, что завершение bash не установлено (нет /etc/bash_completion.d)
  • Отключить все съемные диски в диспетчере устройств (только системный ssd и hdd данных слева)
  • Пробовал работать с пустой папкой etc/profile.d
  • Пробовал работать с пустым etc/bash.bashrc файлом

Пожалуйста, совет, как еще я могу найти первопричину.

P.S. - У меня есть две разные системы, ноутбук и рабочий стол с Win 8.1 x64. Эта проблема на 100% воспроизводима для обоих.

Кроме того, если я запустил bash через несколько секунд после входа в систему, он начнется сразу.

4b9b3361

Ответ 1

В конце концов я нашел причину этой проблемы, но я все еще не уверен, почему. Cygwin очень хорошо работает для других людей в одной и той же среде.

Причина: В начале каждого приложения cygwin он пытается получить учетные данные, как описано в файле etc/nsswitch.conf. По какой-то причине для моей учетной записи требуется много времени, так как она связывается с несколькими контроллерами домена Active Directory через LDAP.

Решение 1:. Вы можете сохранить текущий пользователь и группу в файлах etc/passwd и etc/group и установить cygwing, чтобы проверить их перед активным каталогом.

  • Запустите 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.

Добавьте его к запуску или запустите его перед сеансом cygwin, и вы добры. Запуск cygserver займет время, но каждый следующий процесс cygwin начнется немедленно.

Это ваш случай?. Я хочу поделиться своими действиями по расследованию, чтобы вы могли проверить, ваш случай тот же, что и мой.

  • Установите MS Network Monitor, поскольку он может показывать трафик с определенного процесса. Запустите его как администратор.
  • Создайте новую вкладку захвата и нажмите "Пуск" (вам не нужно добавлять какие-либо фильтры или что-то еще).
  • Запустите mintty, и вы увидите его в netmon: netmon-screenshot
  • Вы увидите список подключений mintty в древовидном представлении слева и кадрах TCP и LDAP справа после выбора этих соединений.
  • Кроме того, вы можете получить имя этих удаленных компьютеров по IP. Запустите nbtstat -a 8.8.8.8 в командной строке (замените 8.8.8.8 одним из IP-адресов из netmon).

Идти глубже: Я все еще играю с файлом etc/nsswitch.conf, чтобы получить локальные учетные данные или, возможно, кешированные файлы, чтобы он быстрее работать без cygserver. Но еще не повезло.

Ответ 2

Вот что сработало для меня.

1) Запустите терминал Cygwin и запустите следующие две строки.

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

2) Отредактируйте файл "/etc/nsswitch.conf", чтобы содержать следующие две строки.

passwd:   files # db
group:    files # db

Готово!

Ответ 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.

Ответ 4

добавление 'C:\cygwin64\bin' к пути, который работал у меня.