GNU/Linux >> Tutoriels Linux >  >> Linux

Pourquoi git échoue-t-il sur push/fetch avec trop de fichiers ouverts

Il y a deux messages d'erreur similaires :

EMFILE: Too many open files
ENFILE: Too many open files in system

Il semble que vous obtenez EMFILE , ce qui signifie que le nombre de fichiers pour un processus individuel est dépassé. Donc, vérifier si vi peut ouvrir des fichiers n'est pas pertinent—vi utilisera sa propre table de fichiers séparée. Vérifiez vos limites avec :

$ ulimit -n
1024

Donc, sur mon système, il y a une limite de 1024 fichiers ouverts en un seul processus. Vous ne devriez pas avoir besoin de demander à votre administrateur système (merci de ne pas utiliser l'acronyme SA, c'est trop opaque; si vous devez abréger, utilisez "sysadmin") pour augmenter la limite.

Vous voudrez peut-être vérifier quels fichiers Git ouvre en exécutant Git sous strace .

Cela pourrait être un bogue dans Git ou dans une bibliothèque, ou cela pourrait être que vous utilisez une ancienne version de quelque chose, ou cela pourrait être quelque chose de plus bizarre. Essayez strace d'abord pour voir quels fichiers il ouvre, et vérifiez si Git ferme ces fichiers.

Mise à jour de Hazok :

Après avoir utilisé les recommandations ci-dessus, il s'avère que l'erreur a été causée par trop d'objets lâches. Il y avait trop d'objets en vrac car git gc n'était pas exécuté assez souvent.


Pourquoi est-ce arrivé ?

À partir de la documentation de git :

Lorsqu'il y a approximativement plus que ce nombre d'objets libres dans le référentiel, git gc --auto les empaquetera. Certaines commandes Porcelain utilisent cette commande pour effectuer de temps en temps un ramasse-miettes léger. La valeur par défaut est 6700.

Ici "Certaines commandes Porcelaine" inclut git push , git fetch etc. Donc, si le nombre maximal de fichiers ouverts limite ulimit -n <6700, vous serez éventuellement bloqué par git gc --auto une fois que vous avez obtenu ~6700 objets libres dans un seul dépôt git.

Je suis pressé. Comment y remédier ?

Si vous disposez des autorisations suffisantes pour ajuster le système ulimit :

$ sudo ulimit -n 8192

Sinon, vous pouvez désactiver git gc en définissant git config gc.auto 0 , afin que vous puissiez pousser vos validations locales vers la télécommande, supprimer le référentiel et le recloner sans milliers d'objets lâches.

Comment pouvons-nous empêcher que cela se reproduise ?

Définir git config --global gc.auto 200 , où 200 correspond à une valeur inférieure à votre limite maximale de fichiers ouverts. Si vous avez choisi une valeur trop petite, git gc fonctionnerait trop souvent, alors choisissez judicieusement.

Si vous définissez gc.auto=0 , les objets en vrac ne seront jamais emballés à moins que vous n'exécutiez git gc manuellement. Il pourrait donc y avoir des centaines de milliers de fichiers accumulés dans le même répertoire, ce qui pourrait poser problème, en particulier pour les utilisateurs de disques durs mécaniques ou de Windows. (Voir aussi :Combien de fichiers dans un répertoire est trop ? et Est-il acceptable (en termes de performances) d'avoir des centaines ou des milliers de fichiers dans le même répertoire Linux ?).


Linux
  1. Pourquoi la commande Ls est-elle lente à s'interrompre sur le répertoire Nfs avec beaucoup de fichiers ?

  2. Pourquoi Rsync échoue-t-il avec un tuyau cassé (32), erreur dans le socket Io (code 10) à Io.c (820) ??

  3. Démarrage d'udev :udevd inotify_init a échoué :trop de fichiers ouverts

  4. Pourquoi Tomcat fonctionne-t-il avec le port 8080 mais pas 80 ?

  5. bash :/bin/tar :liste d'arguments trop longue lors de la compression de nombreux fichiers avec tar

Résolution de l'erreur Mysql :Trop de fichiers ouverts

Pourquoi les fichiers (nautilus) ouvrent-ils une nouvelle fenêtre alors qu'il y en a déjà une ouverte ?

Pourquoi sed échoue-t-il avec les caractères internationaux et comment y remédier ?

Pourquoi rsync ne parvient-il pas à copier les fichiers de /sys sous Linux ?

Pourquoi le montage lié d'un fichier après la suppression du lien échoue-t-il avec ENOENT ?

Remplir le disque avec dd supprime-t-il les fichiers en toute sécurité ?