J'ai rencontré des problèmes sur mon Mac exécutant OS X El Capitan 10.11.6 qui semblaient être liés aux limites des ressources. Je voyais des choses comme error: cannot spawn
ou unable to fork
ou
-bash: fork: retry: Resource temporarily unavailable
-bash: fork: Resource temporarily unavailable
Du fait que mon système ne se figeait pas complètement ou ne produisait pas d'erreurs partout, je m'attendais à ce que ce qui se passait était que j'avais atteint ma limite sur le nombre de processus que je peux exécuter.
$ ulimit -u
709
709 est beaucoup de processus, mais j'exécutais beaucoup de serveurs sur mon Mac, donc il semblait possible que j'utilisais autant. J'ai essayé cette commande, qui affiche combien de processus l'utilisateur exécute (en fait un de plus que le nombre de processus)
$ ps -xu $(id -ru) | wc -l
fork: Resource temporarily unavailable
D'accord, je ne pouvais pas exécuter cette commande, qui crée 3 processus, donc j'étais probablement à la limite des processus. Et le message d'erreur ne commençait pas par -bash
donc ce n'était pas non plus à propos de ulimit
. J'atteignais la limite du système kern.maxprocperuid
.
J'ai pu confirmer cela en exécutant un shell en tant que root
:
$ id -ru
501
$ sudo -i
root# ps -xu 501 | wc -l
706
Oui, 706 < 709, mais les processus mdworker
viennent et repartent régulièrement, donc être proche de la limite était suffisant comme preuve.
Comment augmenter la limite du nombre de processus que je peux exécuter? J'ai cherché des réponses et trouvé des articles qui suggéraient de créer un fichier /Library/LaunchDaemons/limit.maxproc.plist
avec ce contenu :
Label
limit.maxproc
ProgramArguments
launchctl
limit
maxproc
2048
4096
RunAtLoad
ServiceIPC
J'ai fait cela et redémarré et maintenant
$ ulimit -u
2048
Ce qui serait génial, excepté
$ sysctl kern.maxproc
kern.maxproc:
1064
C'EST DANGEREUX. Ce que cela signifie, c'est que tout le système est encore limité à un maximum de 1064 processus, mais un utilisateur individuel est autorisé à en créer plus que cela. Quand le système atteint le nombre maximum de processus, il plante généralement rapidement et de manière très mauvaise. Il est donc très important qu'aucun utilisateur ne soit autorisé à créer suffisamment de processus pour remplir la table de processus, c'est pourquoi sur Mac les utilisateurs sont limités à 2/3 du nombre total de processus.
J'ai trouvé des suggestions similaires concernant le nombre maximum de fichiers ouverts maxfiles
et maxfilesperproc
, qui sont encore plus dangereux, car un seul processus ne devrait pas approcher de la limite du système sur le total des fichiers ouverts.
L'autre problème est que si 709 processus n'étaient pas suffisants, 1000 processus est vraiment improbable de l'être également.
Alors, quelle est la bonne façon de résoudre "Trop de fichiers ouverts" ou "fork: resource temporarily unavailable" sur OS X El Capitan?