8 votes

Réparer "fork : ressource temporairement non disponible" sur OS X / macOS

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?

13voto

Old Pro Points 5634

Si votre ordinateur se heurte régulièrement aux limites de processus et que ce n'est pas dû à un programme incontrôlable ou à des logiciels malveillants, alors au lieu de essayer de remplacer les paramètres par défaut, vous devriez passer à un ensemble de paramètres différents appelé "Mode Performance" (alias "Mode Performance Serveur" ou perfmode ou serverperfmode).

Pour ce faire sur El Capitan (et les versions macOS ultérieures jusqu'à nouvel ordre), vous n'avez pas besoin de créer de nouveaux fichiers ou de trifouiller pour activer ou désactiver SIP, tout ce que vous avez à faire est

$ sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)"

Ceci est officiellement supporté par Apple, et modifie la configuration par défaut de votre ordinateur, d'un ordinateur interactif que vous allez utiliser pour les emails et la navigation web à un serveur que vous allez utiliser pour exécuter de nombreux logiciels non interactifs.

Les nouvelles limites dépendent de la quantité de mémoire que vous avez et nécessitent que vous ayez au moins 16 GiB de mémoire installée, mais au minimum, vous verrez votre limite utilisateur sur le nombre de processus que vous pouvez exécuter passer de 709 à 3 750 et de nombreuses autres limites sont augmentées. Plus important encore, les limites système seront également augmentées afin qu'un seul utilisateur ou programme malveillant ne puisse pas faire planter le système en épuisant les ressources.

C'est une bien meilleure façon d'augmenter les limites de votre système car cela augmente toutes les limites interdépendantes de façon cohérente, en tenant compte des capacités de votre ordinateur spécifique. C'est aussi beaucoup plus facile à faire. Le seul inconvénient est que si vous réinitialisez votre NVRAM un jour, vous devrez exécuter à nouveau la commande nvram pour réactiver le mode performance. Mais c'est aussi un avantage, car si les nouveaux réglages vous causent vraiment des problèmes, tout ce que vous avez à faire pour les annuler est de réinitialiser votre NVRAM, ce qui est une étape normale en cas de problèmes graves. Si vous aviez plutôt créé les fichiers plist LaunchDaemons que certains suggèrent, vous auriez dû vous en souvenir pour penser à les éditer ou les supprimer pour revenir à une configuration standard.

LesApples.com

LesApples est une communauté de Apple où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres utilisateurs d'appareils Apple, poser vos propres questions ou résoudre celles des autres.

Powered by:

X