Augmenter le nombre maximal de descripteurs de fichiers ouverts dans Snow Leopard?

101

J'essaie de faire quelque chose qui nécessite un grand nombre de descripteurs de fichiers

sudo ulimit -n 12288est aussi haut que Snow Leopard veut aller; au-delà, cela se traduit par

/ usr / bin / ulimit: ligne 4: ulimit: fichiers ouverts: impossible de modifier la limite: argument invalide.

Je veux augmenter le nombre beaucoup plus haut, disons 100000. Est-ce possible?

Chris Poole
la source
4
Les réponses à cette question ne fonctionnent plus sous OSX Mavericks.
Howard
2
Courir echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confet redémarrer fonctionne pour moi dans Mavericks.
Lri

Réponses:

95

L'utilisation de la ulimitcommande ne change que les limites de ressources pour le shell actuel et ses enfants et sudo ulimitcrée un shell racine, ajuste ses limites, puis quitte (ainsi, à ma connaissance, aucun effet réel).
Pour dépasser 12288, vous devez ajuster les paramètres kern.maxfileset les kern.maxfilesperprocparamètres du noyau, ainsi qu'une limite de lancement (au moins d'après cette entrée de blog , qui est un résumé de cette discussion ). Vous pouvez utiliser launchctl limitpour régler tous ces éléments simultanément:

sudo launchctl limit maxfiles 1000000 1000000

Pour rendre cela permanent (c'est-à-dire non réinitialisé lorsque vous redémarrez), créez /etc/launchd.confcontenant:

limit maxfiles 1000000 1000000

Ensuite, vous pouvez utiliser ulimit(mais sans le sudo) pour ajuster votre limite de processus.

Si cela ne le fait pas, vous risquez de rencontrer des limites de taille dans le noyau. Si votre modèle le prend en charge , l’initialisation du noyau en mode 64 bits peut être utile.

Gordon Davisson
la source
1
sudo launchctl limit maxfiles 1000000 unlimitedNi la limite stricte ni la limite souple pour les "maxfiles" ne peuvent être illimitées. Veuillez utiliser un paramètre numérique pour les deux.
Thomas Hunter
2
Soyez prudent lorsque vous ajoutez cette ligne à launchd.conf. Je pense que si le nombre est trop petit, cela peut rendre votre ordinateur inutilisable. Par exemple, j'ai utilisé limit maxfiles 1024 1024et j'ai eu beaucoup de mal à le changer.
Shawn
1
Hélas: "Le fichier /etc/launchd.conf n'est plus consulté pour l'exécution des sous-commandes au tout début du démarrage; cette fonctionnalité a été supprimée pour des raisons de sécurité."
Alice Purcell
Cela ne fonctionne pas, mon nombre fd ne peut pas dépasser 6k même si je règle avec succès ulimit -Sn 10240.
Jian Weihang
@JianWeihang Les numéros fd sont calculés par processus, donc je suppose que d'autres processus ont ouvert 4000 fichiers. Est-ce que vous utilisez Chrome? ;)
Trejkaz
41

Les éléments suivants devraient résoudre la plupart des solutions (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. Autant que je sache, vous ne pouvez plus définir de limites «illimitées» sous OS X
  3. launchctl maxfiles sont lié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 de sa valeur 'open files' de launchctl par défaut
  6. vous pouvez définir un ulimit personnalisé dans / etc / profile ou ~ / .profile; bien que cela ne soit pas obligatoire, j'ai fourni un exemple
  7. Soyez prudent lorsque vous définissez l'une de ces valeurs sur un nombre très élevé par rapport à leur valeur par défaut - les fonctions existent: stabilité / sécurité. J'ai pris ces exemples de numéros que je pense être raisonnables, écrits sur d'autres sites.
errant.info
la source
3
Hélas: "Le fichier /etc/launchd.conf n'est plus consulté pour l'exécution des sous-commandes au tout début du démarrage; cette fonctionnalité a été supprimée pour des raisons de sécurité."
Alice Purcell
34

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. Dans Library/LaunchDaemonscréer un fichier nommé limit.maxfiles.plistet coller ce qui suit (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
ninjaPixel
la source
2
Cette réponse est excellente et j'ai trouvé un contexte à ajouter ici, @ninjaPixel: blog.dekstroza.io/ulimit-shenanigans-on-osx-el-capitan
Dean Radcliffe
20

Il semble que OS X Lion n'autorise pas la valeur "illimité":

% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.

Fournir des valeurs numériques pour la limite souple et la limite stricte fait le travail:

% sudo launchctl limit maxfiles 4096 8192
Crishoj
la source
3
Si l'une des valeurs était illimitée , utiliser -1comme valeur entraîne l'affichage de 12288. Il est possible d'utiliser des valeurs numériques plus grandes, par exemple sudo launchctl limit maxfiles 15000 150000. Je ne suis toutefois pas sûr que ces paramètres aient un effet.
Daniel Beck
8

Sur Mavericks, c'est simple. En tant qu'utilisateur régulier:

ulimit -n 8192

Vous pouvez vérifier les paramètres mis à jour via

ulimit -a

Sur ma machine:

ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                8192
Clustermagnet
la source
2
Pensez à réviser votre solution. Vous définissez un ulimit de 1024, puis affichez les descripteurs de fichier de sortie sous la forme 8192 (devrait être 1024). Votre approche est également probelmatique sans sudo, essayez de le changer quelques fois pour vous-même.
Y3SCH
1
sudo ne doit pas être utilisé ici, mais cette réponse est incorrecte. Les utilisateurs de Mavericks devraient utiliser echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confpuis redémarrer leur machine
Kyle Chadha
3

Sous OS X 10.13.6, cela fonctionne pour moi:

$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576
Petr Javorik
la source
1

Certaines limites ne peuvent pas être modifiées par ulimit, car elles s'appliquent uniquement au shell actuel. Par conséquent, launchctlcommande doit être utilisée pour modifier les limites globalement, par exemple:

sudo launchctl limit maxfiles 100000 unlimited

Veuillez noter que l'application de ces limites /etc/launchd.conf(comme suggéré dans d'autres réponses) n'est plus prise en charge dans les dernières versions de macOS. Bien que vous puissiez toujours utiliser launchd.plist(voir:) man launchd.plisttels que plistles fichiers de configuration par utilisateur ou à l’échelle du système, comme suggéré ici , ici et - bas .


Pour rendre ces limites persistantes, vous pouvez utiliser /etc/sysctl.conffile et ajouter par exemple:

kern.maxprocperuid=1000
kern.maxproc=2000
kern.maxfilesperproc=20000
kern.maxfiles=50000

Pour que les modifications prennent effet, il faut redémarrer.

Pour voir les limites actuelles, exécutez: launchctl limitou sysctl -a | grep ^kern.max.

Voir aussi: Comment conserver les paramètres ulimit dans macOS?

Kenorb
la source