web-dev-qa-db-fra.com

Le démarrage est vraiment lent pour toutes les applications Cygwin

Le démarrage d'une application Cygwin prend plus d'une minute sous Windows 8.1 x64. Peu importe, que je démarre mintty à partir du raccourci ou cygwin.bat Ou ls.exe Ou bash.exe À partir du dossier bin. Chacun d'eux sera lent.

Après le démarrage de Bash ou mintty, ils fonctionnent assez rapidement:

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

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

Étapes que j'ai essayées:

  • Réinstallé et essayé Cygwin et Cygwin64 plusieurs fois (version 2.864)
  • Les a démarrés en tant qu'administrateur
  • J'ai essayé de les exécuter en mode de compatibilité Windows 7
  • Désactivé "Détecter automatiquement les paramètres" pour le LAN comme dans cette réponse
  • 127.0.0.1 localhost cygdrive wpad Ajouté aux hôtes comme dans la même réponse
  • Définir l'antivirus sur l'état désactivé
  • Vérifié que l'achèvement de Bash n'est pas installé (pas de dossier /etc/bash_completion.d)
  • Désactivé tous les lecteurs amovibles dans le Gestionnaire de périphériques (seul le SSD système et le disque dur de données restent)
  • J'ai essayé de courir avec le dossier etc/profile.d Vide
  • Tentative d'exécution avec un fichier etc/bash.bashrc Vide

Sinon, comment puis-je trouver la cause première?

P.S. - J'ai deux systèmes différents, un ordinateur portable et un ordinateur de bureau avec Windows 8.1 64 bits. Ce problème est 100% reproductible sur les deux.

De plus, si je démarre Bash quelques secondes après la connexion, il démarre immédiatement.

36
Anton Purin

Finalement, j'ai trouvé la cause de ce problème, mais je ne sais toujours pas pourquoi. Cygwin fonctionne très bien pour d'autres personnes dans le même environnement.

Cause: Au démarrage de chaque application Cygwin, il essaie d'obtenir les informations d'identification comme décrit dans etc/nsswitch.conf fichier. Pour une raison quelconque, cela prend beaucoup de temps pour mon compte car il contacte plusieurs contrôleurs de domaine Active Directory via LDAP.

Solution 1: Vous pouvez enregistrer l'utilisateur et le groupe actuels dans etc/passwd et etc/group fichiers et paramétrez Cygwin pour les vérifier avant Active Directory.

  1. Début mintty.exe et attendez son ouverture
  2. Courir mkpasswd -c et enregistrez sa sortie dans etc/passwd fichier (vous devrez le créer, la sortie doit être sur une ligne)
  3. Courir mkgroup -c et enregistrez sa sortie dans etc/group fichier (vous devrez le créer, la sortie doit être sur une ligne)
  4. Ouvert etc/nsswitch.conf et écrire

contenu de nsswitch.conf:

passwd: files # db
group:  files # db

Votre Cygwin devrait maintenant démarrer immédiatement.

Solution 2: Il existe une application spéciale CygServer , livrée avec Cygwin, qui peut être démarrée en tant que service NT ou en tant que simple processus (exécutez simplement usr/sbin/cygserver.exe). Il met en cache les informations d'identification et les propage à chaque processus Cygwin suivant pendant que cygserver est en cours d'exécution.

Ajoutez-le au démarrage ou démarrez-le avant votre session Cygwin et vous êtes bon - le démarrage de cygserver prendra du temps, mais chaque prochain processus Cygwin démarrera immédiatement.

Est-ce votre cas? Je veux partager mes étapes d'enquête, afin que vous puissiez vérifier si votre cas est le même que le mien.

  • Installez MS Network Monitor car il est capable d'afficher le trafic d'un processus spécifique. Exécutez-le en tant qu'administrateur.
  • Créez Nouvel onglet de capture et cliquez sur Commencez (vous n'avez pas besoin d'ajouter de filtres ou quoi que ce soit).
  • Démarrez mintty et vous verrez ses connexions dans netmon: netmon-screenshot
  • Vous verrez la liste des connexions mintty dans l'arborescence à gauche et TCP et cadres LDAP à droite après avoir sélectionné l'une de ces connexions.
  • De plus, vous pouvez obtenir le nom de ces machines distantes par adresse IP. Courir nbtstat -a 8.8.8.8 en ligne de commande (remplacez 8.8.8.8 par l'une des adresses IP de netmon).

Approfondissement: Je joue toujours avec le fichier etc/nsswitch.conf pour obtenir les informations d'identification locales ou peut-être celles en cache afin qu'il fonctionnera plus rapidement sans cygserver. Mais pas encore de chance.

69
Anton Purin

Voici ce qui a fonctionné pour moi.

  1. Lancez le terminal Cygwin, puis exécutez les deux chaînes suivantes.

    mkpasswd -c > /etc/passwd
    mkgroup -c > /etc/group
    
  2. Modifiez votre fichier "/etc/nsswitch.conf" pour qu'il contienne les deux lignes suivantes.

    passwd:   files # db
    group:    files # db
    
  3. Relancez Cygwin.

Cygwin ouvre rapidement.

23
Whifix

Si vous êtes sur un réseau avec un grand répertoire AD, mkpasswd prendra beaucoup de temps (plusieurs jours dans mon cas). Pensez donc à utiliser:

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.
7
marius

L'ajout de "C:\cygwin64\bin" au chemin a fonctionné pour moi.

2
Aaron Carlton