Existe-t-il un correctif pour l’erreur «Trop de fichiers ouverts dans le système» sur OS X 10.7.1?


191

Je dois me débarrasser de la limite "Trop de fichiers ouverts dans le système" sur OS X 10.7.1. 

Y a-t-il un moyen?


4
Voulez-vous expliquer plus quand cela se produit? Dans quelles circonstances?
Slhck

1
@slhck - J'ai le même problème. Les circonstances sont fondamentalement "au hasard". Je suis développeur et j'utilise donc beaucoup mon Mac: exploitation simultanée d'une ou plusieurs bases de données, d'un serveur Web, d'outils de test, d'un ou de plusieurs navigateurs et d'un lecteur de musique. Google Chrome semble être un programme qui a beaucoup de fichiers ouverts.
Nathan Long

En fait, mon "usage intensif" n'était pas le problème; mes paramètres pour le nombre maximal de fichiers ouverts pour kernal et par processus étaient bien inférieurs à ce que devraient être les paramètres par défaut.
Nathan Long

2
Si vous lisez le commentaire de Nathan et que vous vous demandez pourquoi il n'a pas donné de détails sur les valeurs par défaut, c'est parce qu'il a tout expliqué dans sa réponse, ci-dessous. (
Olie

Je suis dans la même situation d'utilisation que Nathan Long et j'ai constaté que le redémarrage d'Apache était la seule étape qui "résolvait" le problème. J'ai appliqué toutes les augmentations inférieures à la limite, mais elles n'ont pas aidé immédiatement. J'exécute les tests en ligne de commande phpUnit> serveur sélénium> firefox> apache> php> mysql sur le même macbook. Habitué à bien fonctionner jusqu'à ce que je passe au mavericks. L'erreur que je reçois est dans l'application Web testée, c'est-à-dire que php / apache est à court de fichiers, donc probablement pas contrôlé par le paramètre du shell.
scipilot le

Réponses:


225

Selon cet article utile (que je recommande de lire):

Par défaut, le nombre maximal de fichiers que Mac OS X peut ouvrir est défini sur 12 288 et le nombre maximal de fichiers qu'un processus donné peut ouvrir est de 10 240.

Vous pouvez les vérifier avec:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Vous pouvez augmenter les limites (à vos risques et périls) avec:

  • sysctl -w kern.maxfiles=20480 (ou le numéro que vous choisissez)
  • sysctl -w kern.maxfilesperproc=18000 (ou le numéro que vous choisissez)

Pour rendre le changement permanent, utilisez sudopour définir vos paramètres /etc/sysctl.conf(que vous devrez éventuellement créer), comme ceci:

kern.maxfiles=20480
kern.maxfilesperproc=18000

Remarque: sous OS X 10.10 ou version antérieure, vous pouvez ajouter un paramètre de la /etc/launchd.confmême manière limit maxfiles, ce qui annulera ce que vous avez indiqué ici.

Encore une fois, de l'article:

Une fois que cela est fait, le noyau lui-même aura un nombre maximum de fichiers, mais le shell pourrait ne pas en avoir. Et comme la plupart des processus qui vont utiliser autant de fichiers vont être lancés par le shell, vous allez vouloir augmenter cela.

La commande pour cela est:

ulimit -S -n 2048 # or whatever number you choose

Ce changement est également temporaire; cela ne dure que pour la session shell en cours. Vous pouvez l' ajouter à votre fichier de configuration du shell ( .bashrc, .zshrcou autre) si vous souhaitez l'exécuter à chaque fois que vous ouvrez un shell.


1
Quelle limite s'applique aux processus lancés en cliquant sur des icônes dans la zone de lancement? Et comment changer cette limite? Quand vous dites "shell", je suppose que vous parlez d'un terminal interactif.
Cheeso

@ Cheeso - Je pense que la limite globale du système (sysctl) ou la limite launchd, quelle que soit celle qui est la plus basse, contrôle cela.
Nathan Long

1
créer un fichier /etc/launchd.conf avec une limite de contenu maxfiles 1000000 1000000 a très bien fonctionné pour moi! (OSX 10.8.2 ici)
Zugwalt

1
J'ai mis kern.maxfiles=65000 kern.maxfilesperproc=65000dans /etc/sysctl.conf et redémarré. kern.maxfiles a été ignoré et est resté le paramètre par défaut, mais kern.maxfilesperproc a été défini sur 65000. Je n'ai pas de fichier /etc/launchd.conf, alors quoi de neuf?
pferrel

2
Si quelqu'un a des problèmes avec des fichiers max qui ne collent pas, c'est qu'il y a un espace final après la ligne maxfiles, il doit être supprimé.
Jjathman

62

Il semble qu'il existe une méthode totalement différente pour modifier la limite de fichiers ouverts pour chaque version d'OS X!

Pour OS X Sierra (10.12.X), vous devez:

1. Créez un fichier à /Library/LaunchDaemons/limit.maxfiles.plistet collez le texte suivant dans (sentez-vous libre de changer les deux nombres (qui sont les limites soft et hard, respectivement):

<?xml version="1.0" encoding="UTF-8"?>  
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"  
        "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">  
  <dict>
    <key>Label</key>
    <string>limit.maxfiles</string>
    <key>ProgramArguments</key>
    <array>
      <string>launchctl</string>
      <string>limit</string>
      <string>maxfiles</string>
      <string>64000</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist> 

2. Changez le propriétaire de votre nouveau fichier:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. Chargez ces nouveaux paramètres:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. Enfin, vérifiez que les limites sont correctes:

launchctl limit maxfiles

a parfaitement fonctionné, merci! Dans mon cas, l'erreur s'est manifestée dans un processus Java avec le messageIO Error: Bad file descriptor (Write failed)
agradl

1
Fonctionne également sur El Capitan 10.11.6
Troy Daniels

ne peut toujours pas changer le ulimit pour shell. Le maximum reste 1024 quoi que je fasse
DataGreed

A l'étape 2, exécutez: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen le

33

Vous devrez augmenter vos paramètres ulimit - il est plutôt faible sous OS X de nos jours - 256 par défaut. Ajoutez ulimit -n 4096ou similaire à votre ~ / .profile ou équivalent et cela le résoudra dans votre environnement local. Exécuter ulimit -apour vérifier vos niveaux actuels

Pour voir les paramètres du système, lancez ceci:

launchctl limit maxfiles

Il est beaucoup plus élevé dans Lion (10240) qu’auparavant, processus par processus. Mais si vous le frappez toujours là, vous pouvez le régler plus haut en utilisant la même commande avec les niveaux souhaités. Pour que les modifications soient permanentes, vous devez ajouter les lignes appropriées dans /etc/launchd.conf.


1
256? C'est 2560 descripteurs de fichier pour moi et je ne l'ai jamais changé. La limite est de 266 processus (cf ulimit -a).
Slhck

2
Pareil pour moi, 256 fichiers sur MacOS X Maverick
Climbatize

4
256 sous OS X Yosemite également
Alexander,

2
256 sur El Capitan aussi.
TMN

1
256 à Yosemite.
Jaec

31

Une autre option peut être de trouver le coupable:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Pour le dernier, vous pouvez voir quels fichiers sont ouverts:

sudo lsof -n | grep socketfil

Et tuez le processus si vous le souhaitez

kill $pid

D'après les commentaires:

Pour ce que cela vaut, vous pouvez également obtenir une liste des ID de processus avec les fichiers les plus ouverts à l'aide de

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail

Utile! Mais trier sur OS X (10.11) ne prend pas -h. (Peut-être -g?)
Robert Calhoun

Pour moi, a bien fonctionné sans -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop

Ainsi soit-il-h
sanmai

C'est la seule réponse qui m'a permis de
trouver la

1
Utiliser lsof -n +c 0pour empêcher la troncature du nom du processus
vaughan

10

Les gens, sur Mavericks 10.9.4

ulimit -n 2048fonctionne bien. Vous devrez peut-être lancer une nouvelle session de connexion.


3

Pour le dernier macOS (au moment de la rédaction: 10.14.1), vous pouvez utiliser sudo launchctl limit maxfiles 64000 524288(256 par défaut), mais cela ne fonctionne que dans la session en cours. Utilisez le launchctltravail de @ninjaPixel ( https://superuser.com/a/1171028/760235 ) pour une solution permanente.


Comment avez-vous trouvé le numéro 524288? Mes valeurs précédentes étaient 256 et illimitées.
Puce Roberson

1

Tu peux courir

lsof -n

quel processus ouvrir trop de fichiers.

alors tuez-le.

ou

sysctl -w kern.maxfiles=20480

changez-le en un plus grand.


3
Veuillez expliquer en quoi cette réponse diffère de celles déjà données.
Stephen Rauch

1

Après tous les changements ci-dessus, mon java n'a pas généré plus de 10000 fichiers. La solution était ce drapeau jvm -XX: -MaxFDLimit


0

Je l'ai rencontré en faisant un chmod -R alors je l'ai fait en prenant de plus petites étapes, par exemple

# for each directory
find . -type d -exec chmod 755 {} \;

1
Bien que cela puisse être une solution de contournement, cela ne semble pas réellement répondre à la question. Peut-être qu'expliquer que vous ne pouvez pas vous débarrasser du message et le proposer comme moyen de réduire le problème améliorerait votre réponse.
music2myear

0

Similaire à https://superuser.com/a/1171028/367819

Pour vérifier les limites actuelles sur votre système Mac OS X, exécutez:

launchctl limit maxfiles

Les deux dernières colonnes sont respectivement les limites soft et hard.

Pour ajuster les limites des fichiers ouverts sur l'ensemble du système sous Mac OS X Yosemite, vous devez créer deux fichiers de configuration. Le premier est un fichier de liste de propriétés (ou plist) dans /Library/LaunchDaemons/limit.maxfiles.plist qui contient la configuration XML suivante:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxfiles</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxfiles</string>
          <string>200000</string>
          <string>200000</string>
        </array>
      <key>RunAtLoad</key>
        <true/>
      <key>ServiceIPC</key>
        <false/>
    </dict>
  </plist>

Cela définira la limite de fichiers ouverts sur 200 000. Le deuxième fichier de configuration de la liste de plis doit être stocké dans /Library/LaunchDaemons/limit.maxproc.plist avec le contenu suivant:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
  <plist version="1.0">
    <dict>
      <key>Label</key>
        <string>limit.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Les deux fichiers plist doivent appartenir à root: wheel et avoir les permissions -rw-r - r--. Ces autorisations doivent être en place par défaut, mais vous pouvez vous assurer qu'elles le sont en exécutant sudo chmod 644. Bien que les étapes expliquées ci-dessus entraînent la définition correcte des limites de fichiers ouverts à l’échelle du système au redémarrage, vous pouvez les appliquer manuellement en exécutant launchctl limit.

Outre la définition de ces limites au niveau du système, nous vous recommandons de définir également au niveau de la session en ajoutant les lignes suivantes à votre fichier bashrc, bashprofile ou analogue:

ulimit -n 200000
ulimit -u 2048

Comme les fichiers plist, votre fichier bashrc ou similaire devrait avoir les autorisations -rw-r - r--. À ce stade, vous pouvez redémarrer votre ordinateur et entrer ulimit -n dans votre terminal. Si votre système est configuré correctement, vous devriez voir que maxfiles a été défini sur 200000.


Vous pouvez suivre cet article pour plus de détails.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


N'oubliez pas de redémarrer votre Mac pour que les valeurs soient effectives.


Soit le message doit être marqué comme un doublon s'il y a déjà une réponse, sinon, veuillez poster les informations pertinentes à partir d'un lien, car le lien pourrait ne pas être valide pour toujours.
Zymhan
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.