Quelle commande contrôle les limites des fichiers ouverts?

19

Quel fichier de commande / configuration contrôle les limites de fichiers ouverts sur OS X? Existe-t-il une commande différente pour OS X 10.5 / 10.6 / 10.7? Les options ci - dessous sont que j'explore ulimit, sysctletlaunchctl

"Trop de fichiers ouverts" est apparemment une erreur courante sur Leopard, peut-être d'autres versions d'OS X:

Il existe de nombreuses façons (connexes?) D'afficher les limites des fichiers ouverts:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

Il a été affirmé dans certains des articles ci-dessus que ceux-ci peuvent être modifiés avec les commandes suivantes:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

Cependant, parmi les commandes ci-dessus, seules les sysctlcommandes ont un effet apparent (c'est-à ulimit -n- dire launchctl limitqu'elles ne montrent aucun changement après que les commandes ci-dessus ont été entrées, alors sysctl -aqu'elles montrent les modifications demandées).

Les emplacements correspondants pour modifier ces paramètres pour le système d'exploitation sont:

/etc/sysctl.conf
/etc/launchd.conf

J'ai également découvert une réponse qui lit que ulimitne contrôle que le shell actuel.

Comment puis - je ajuster à la hausse les fichiers max / fichiers ouverts max limites macOS?

keflavich
la source

Réponses:

9

La réponse simple était qu'il y avait plusieurs limites et la limite la plus basse que vous atteignez dans une instance spécifique générera votre erreur. Maintenant, le 10.12 launchctl limit maxfilesest également dans le mix. Pour plus de détails sur la mise en œuvre, cette excellente réponse reçoit des primes et mérite plus de votes que celle que je peux lui donner.

d'autres discussions pertinentes sont:

Le ulimitniveau est bas pour empêcher un mauvais script shell d'inonder le noyau de fichiers ouverts.

Le kern.maxfilesperprocest là pour laisser un peu de place dans le nombre maximal de fichiers afin qu'un processus puisse utiliser la plupart mais pas la totalité de l'espace du gestionnaire de fichiers ouverts du noyau.

Pour les situations normales, le kern.maxfilesest le dernier facteur limitant.

Sur Sierra - les limites sont de 256 fichiers ouverts et un nombre maximal illimité, donc je trouve qu'avoir 3 à 4 000 fichiers définis pour la limite logicielle fonctionne pour à peu près tout notre matériel et maintient le système réactif lorsqu'un processus galopant ouvre trop des dossiers. Nous aimons garder nos serveurs de développement à la limite de 256 afin de détecter les logiciels qui fuient et qui posent problème lors du développement / de la mise en scène et des tests plutôt que de le découvrir en production.

Je ne suis pas un fan des fichiers 10k - peut-être qu'avec le stockage APFS et NVMe, nous verrons le jour où ce n'est pas impensable, mais essayez de vous en tenir à des centaines ou des milliers bas pour vos limites de fichiers. Surtout si votre Mac a une limite de processus basse , avoir autant de fichiers ouverts par si peu de processus peut être problématique.

bmike
la source
9

Il semble qu'il existe une méthode entièrement 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. Dans Library/LaunchDaemonscréez un fichier nommé limit.maxfiles.plistet collez ce qui suit (n'hésitez pas à modifier les deux nombres (qui sont respectivement les limites logicielle et matérielle):

<?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
ninjaPixel
la source
Je semble avoir du mal à définir les fichiers max sur illimité de cette manière en définissant la deuxième valeur sur «illimité». Des pensées?
user200857
7

Les éléments suivants devraient résoudre les problèmes les plus courants (et sont répertoriés dans l'ordre de leur hiérarchie):

echo 'kern.maxfiles=20480' | sudo tee -a /etc/sysctl.conf
echo -e 'limit maxfiles 8192 20480\nlimit maxproc 1000 2000' | sudo tee -a /etc/launchd.conf
echo 'ulimit -n 4096' | sudo tee -a /etc/profile

Remarques:

  1. Vous devrez redémarrer pour que ces modifications prennent effet.
  2. AFAIK, vous ne pouvez plus définir de limites à «illimité» sous OS X
  3. launchctl maxfiles sont limités par sysctl maxfiles, et ne peuvent donc pas les dépasser
  4. sysctl semble hériter de kern.maxfilesperproc de launchctl maxfiles
  5. ulimit semble hériter par défaut de sa valeur 'open files' de launchctl
  6. vous pouvez définir un ulimit personnalisé dans / etc / profile ou ~ / .profile; bien que cela ne soit pas nécessaire, j'ai fourni un exemple
  7. Soyez prudent lorsque vous définissez l'une de ces valeurs à un nombre très élevé par rapport à leur valeur par défaut - les fonctionnalités existent stabilité / sécurité. J'ai pris ces exemples de chiffres que je pense être raisonnables, écrits sur d'autres sites Web.
errant.info
la source
0

En termes simples:

  • La ulimitcommande permet de "contrôler les ressources disponibles pour le shell et les processus qu'il crée" (voir: help ulimitet man bash). Les ressources accordées au shell sont limitées par les limites des ressources système.

  • Le launchctlcontrôle la consommation maximale de ressources système par le processus en cours (voir: man setrlimitet man launchctl). Les valeurs maximales sont limitées par les limites du noyau.

  • Les sysctlcontrôles limites noyau (voir: man sysctlet les limites du noyau Tuning BSD ).

Pour augmenter les limites, vous pouvez utiliser chacune des commandes, selon le problème.

Voir aussi: Quelle est la relation entre `launchctl limit` et` ulimit`?


Pour le problème avec trop de fichiers ouverts, cela dépend de la limite exactement souple ou stricte atteinte (que ce soit un script shell local, le script global exécuté par root, une application ou tous les processus en même temps). Cela vaut la peine d'augmenter toutes les limites (limites shell, launchd et noyau).

Pour augmenter les limites de façon persistante, voir: Comment contrôler de manière persistante la consommation maximale de ressources système sur Mac?

kenorb
la source