Comment contrôler en permanence la consommation maximale de ressources système sur Mac?

85

Avant Mavericks, je pouvais utiliser /etc/launchd.conffile pour modifier la consommation maximale de ressources système, par exemple:

limit maxfiles 16384 unlimited
limit maxproc 16384 unlimited

Cela ne fonctionne plus dans Mavericks.

Quelle est la bonne façon de le faire dans la version récente d'OS X?

Howard
la source
Vos limites sont supérieures au maximum pour OS X. maxfiles est supérieur à 10240 et maxproc est fixé à 1064. Si la réponse approuvée fixe les limites, je lui donnerais un coup de pouce .. mais il a été mal assis et non corrigé pendant une bonne année + maintenant ..
Joey T
@atmosx: Cela devrait être /etc/sysctl.conf, pas /etc/sysctrl.conf.
Siu Ching Pong - Asuka Kenji -
1
@ JoeyT: En fait, vous pouvez définir une limite supérieure! Mais vous devez d’abord acheter "OS X Server" sur "App Store" si vous utilisez Mac OS X 10.8 (Mountain Lion) ou 10.9 (Mavericks). (Oui, vous devez payer 19,99 USD pour modifier un paramètre!) En bref, vous devez exécuter sudo serverinfo --setperfmode trueune fois pour mettre votre machine en "Mode de performance serveur". Ensuite, vous avez un "maximum plus élevé", selon la configuration de votre machine. S'il vous plaît voir mon post à discussions.apple.com/thread/5166397 pour plus de détails. Pour 10.10 (Yosemite), le mode est activé par défaut (au moins sur ma machine!). Voir ma réponse ci-dessous.
Siu Ching Pong - Asuka Kenji -

Réponses:

87

Limite de session shell

Les limites définies via ulimituniquement affectent les processus créés par la session shell en cours.

  • La "limite souple" est la limite réelle utilisée. Il pourrait être défini, dans la mesure où il n'est pas supérieur à la "limite stricte".
  • La "limite stricte" peut également être définie, mais uniquement sur une valeur inférieure à la valeur actuelle et uniquement sur une valeur non inférieure à la "limite souple".
  • La "limite stricte", ainsi que les limites applicables au système, pourraient être levées par root(l'administrateur) en exécutant des commandes de configuration du système ou en modifiant les fichiers de configuration du système.

Une fois que vous avez terminé la session shell (par Ctrl+ D, exitfermeture de la Terminal.appfenêtre, etc.), les paramètres ont disparu. Si vous souhaitez utiliser le même paramètre lors de la prochaine session shell, ajoutez-le au script de démarrage du shell.

NOTE: Si vous utilisez bash, alors il devrait être ~/.bash_proileou ~/.bash_login. Si vous utilisez d'autres coquilles, cela devrait probablement l'être ~/.profile.

Limite du système (nécessite que le redémarrage prenne effet)

Pour 10.9 (Mavericks), 10.10 (Yosemite), 10.11 (El Capitan) et 10.12 (Sierra):

Vous devez créer un fichier dans /Library/LaunchDaemons/limit.maxfiles.plist(propriétaire:, root:wheelmode:) 0644:

<?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>262144</string>
      <string>524288</string>
    </array>
    <key>RunAtLoad</key>
    <true/>
    <key>ServiceIPC</key>
    <false/>
  </dict>
</plist>

Vous devriez changer les chiffres en fonction de vos besoins. Ils sont respectivement la "limite logicielle" ( 262144) et la "limite stricte" ( 524288). Pour plus d'informations, consultez la page de manuel en cours d'exécution man launchd.plist.

Pour 10.8 (Lion de montagne):

Vous pouvez ajouter les lignes suivantes à /etc/sysctl.conf(owner:, root:wheelmode:) 0644:

kern.maxfiles=524288
kern.maxfilesperproc=262144

Vous devriez changer les chiffres en fonction de vos besoins. Ils correspondent respectivement à la "limite globale du système" ( kern.maxfiles) et à la "limite par processus" ( kern.maxfilesperproc). Pour plus de paramètres, consultez la page de manuel en lançant man sysctlou lisez le code source à l'adresse /usr/include/sys/sysctl.h.

Pour les anciens Mac OS X (je suppose que cela fonctionne sur 10.7 (Lion) ou avant):

Vous pouvez ajouter la ligne suivante à /etc/launchd.conf(owner:, root:wheelmode:) 0644:

limit maxfiles 262144 524288

Vous devriez changer les chiffres en fonction de vos besoins. Ils sont respectivement la "limite logicielle" ( 262144) et la "limite stricte" ( 524288).

Si le système ne vous permet pas de définir des limites supérieures à une certaine valeur ...

Le système ne vous permet pas de définir une valeur supérieure à un "maximum maximum" (proposé par Apple). Pour augmenter ce "maximum", vous devez acheter "OS X Server" sur "App Store", puis vous devez exécuter la commande suivante une fois:

sudo serverinfo --setperfmode true

Ceci active le "mode de performance du serveur" sur votre machine. Vous pouvez ensuite définir le maximum en fonction de la configuration de votre machine (voir ci-dessous) . J'ai déjà essayé ça (sur Mountain and Mavericks) et ça marche! S'il vous plaît voir mon post ( ici ) pour plus d'informations.

Références

Siu Ching Pong -Asuka Kenji-
la source
1
Je vous remercie; J'utilise Yosemite et la technique du pliste LaunchDaemon a fonctionné pour moi. Je crois que c'est le seul qui fait. Pour ceux qui en ont besoin, veuillez noter qu’un redémarrage est nécessaire pour que cela prenne effet .
nc
1
@NC. : Ajouté "Exiger que le redémarrage prenne effet" à ma réponse. Je travaille depuis trop longtemps sur le terrain et je n’étais donc pas au courant que certaines personnes ne le savaient pas. Merci pour le rappel!
Siu Ching Pong -Asuka Kenji-
2
J'utilise 10.9.5 mais seule l' /etc/launchd.confapproche montre un effet lorsque je cours ulimit -n. Quelqu'un pourrait-il mettre à jour les instructions si cela est important?
Sridhar Sarnobat
1
La méthode 10.10 Yosemite fonctionne également dans 10.11 El Capitan. Bien que je ne puisse pas le définir sur "illimité", je devais donc simplement utiliser un nombre très élevé
antriver
1
@aolszowka: Découvrez comment augmenter cette limite via /etc/sysctl.conf: superuser.com/questions/827984/…
Rob Johansen
11

Il semble que créer le fichier /etc/launchd.confet y mettre votre commande devrait faire l'affaire.


Si cela ne fonctionne pas, vous pouvez probablement éditer ou créer le /etc/rc.localfichier et y ajouter votre commande, car il y a peu de chance que Apple supprime la prise en charge de la limite sur la ligne de commande.


Edit 1 :
J'aurais dû commencer par cela, la launchd page de manuel fait référence aux fichiers suivants:

  ~/Library/LaunchAgents         Per-user agents provided by the user.
  /Library/LaunchAgents          Per-user agents provided by the administrator.
  /Library/LaunchDaemons         System-wide daemons provided by the administrator.
  /System/Library/LaunchAgents   Per-user agents provided by Mac OS X.
  /System/Library/LaunchDaemons  System-wide daemons provided by Mac OS X.

Mon pari est que vous devez maintenant placer votre commande dans ~/Library/LaunchAgentsou dans /Library/LaunchDaemons.
Vous devriez essayer les deux.

Edit 2 : Il
faut aussi savoir que launchd besoin fichier XML et des scripts non seulement. une interface graphique a été conçue pour aider dans cette tâche, une autre qui n’est pas gratuite est Lingon . Peut-être que d'autres produits gratuits existent.

Kiwy
la source
comme il y a beaucoup d'informations dans mon post, pouvez-vous dire quel était le bon?
Kiwy
voir ma réponse ci-dessous.
Howard
Les deux /etc/launchd.confet /etc/rc.localsont ignorés dans 10,10 et plus tard, puisque dans 10,10 launchd a été redessinée et SystemStarter a été retiré.
nisetama
@nise ne hésitez pas à mettre à jour ma réponse si quelque chose de nouveau est apparu dans la version récente de Mac OS
Kiwy
10

Je viens d'ajouter ces deux lignes dans mes .bash_profile
œuvres comme un charme

ulimit -n 1024
ulimit -u 1024
pixelass
la source
2
N'influence pas les limites du système.
not2savvy
1
Cependant, cela pourrait aller si les limites de votre système sont suffisamment élevées. Pour vérifier ce qu'ils sont, vous pouvez simplement courir ulimit -n -H. Sur macOS High Sierra, il était unlimitedtellement difficile de changer la limite "souple" de l'utilisateur .bash_profile.
Joshua Pinter
9

Limites du système

La modification des limites dans /etc/launchd.confou /etc/rc.localn'est plus prise en charge par le récent macOS. Voir: Anciens systèmes et technologies .

Au lieu de cela, vous devez créer un nouvel agent de lancement .

Voici l'exemple de commande utilisant la PlistBuddycommande (voir:) man PlistBuddy:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist \
-c "add Label string com.launchd.maxfiles" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string launchctl" \
-c "add ProgramArguments: string limit" \
-c "add ProgramArguments: string maxfiles" \
-c "add ProgramArguments: string 10240" \
-c "add ProgramArguments: string unlimited" \
-c "add RunAtLoad bool true"

Et similaire pour maxproclimite:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxproc.plist \
-c "add Label string com.launchd.maxproc" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string launchctl" \
-c "add ProgramArguments: string limit" \
-c "add ProgramArguments: string maxproc" \
-c "add ProgramArguments: string 2000" \
-c "add ProgramArguments: string unlimited" \
-c "add RunAtLoad bool true"

Pour charger les fichiers ci - dessus, exécutez: sudo launchctl load /Library/LaunchAgents/com.launchd.*.plist.

Remarques:

  • Pour imprimer le fichier, exécutez: catou PlistBuddy -x -c Print /Library/LaunchAgents/com.launchd.maxfiles.plist.
  • Pour vérifier le journal des erreurs au cours de la charge, exécutez: tail -f /var/log/system.log.
  • Pour voir les actuelles launchdlimites, exécutez: launchctl limit.
  • Le .plistfichier peut être placé dans un dossier d'agent par utilisateur ou système ( LaunchAgents). Voir: man launchdet man launchd.plist, ou ceci ou cette réponse pour plus de détails.

Limites du noyau

Veuillez noter que les limites ci-dessus du système Launchd sont toujours limitées par le noyau, vous ne pouvez donc pas les définir plus haut que les limites réelles définies dans les variables d'état du noyau (voir: man sysctlpour obtenir de l'aide).

Pour voir les limites du noyau en cours, exécutez: sysctl -a | grep ^kern.max.

Pour augmenter la maxfileslimite, exécutez: sudo sysctl -w kern.maxfiles=20480.

Pour les faire persister, utilisez la même méthode pour créer un .plistfichier de démarrage , par exemple

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.kern.maxfiles.plist \
-c "add Label string com.kern.maxfiles" \
-c "add ProgramArguments array" \
-c "add ProgramArguments: string sysctl" \
-c "add ProgramArguments: string -w" \
-c "add ProgramArguments: string kern.maxfiles=20480" \
-c "add RunAtLoad bool true"

Shell limites

Pour les limites du shell, ajoutez une ulimitcommande ~/.bashrcou ~/.bash_profileun fichier de démarrage approprié pour un utilisateur individuel ou /etc/bashrcpour tous les utilisateurs. Voir: Comment ajouter des paramètres de shell persistant ulimit sur Mac?

Lignes suggérées pour ajouter:

# Changes the ulimit limits.
ulimit -Sn 4096      # Increase open files.
ulimit -Sl unlimited # Increase max locked memory.
Kenorb
la source
1
Soyez particulièrement prudent avec, maxproccar par défaut, la limite stricte du noyau sur ce paramètre est 1064, ce qui signifie que maxprocperuid < maxprocvous devez définir 2000 ou "unlimited" pour ne définir que 1064. Malheureusement, le noyau ne l'applique pas et les paramètres que vous proposez laisseront système avec maxprocperuid=2000et maxproc=1064qui est dangereux. En savoir plus à ce sujet ici .
Vieux Pro
0

Si vous avez un seul programme qui frappe un ulimit(une limite douce sur le nombre de fichiers qu'un seul processus peut ouvrir), il est correct de l'ajuster ulimità un nombre plus élevé, surtout si vous pouvez simplement insérer la ulimitcommande dans votre .bash_profile. Au - delà de cela, je vous conseille fortement contre les fichiers d'édition comme /etc/launchd.confou /etc/sysctl.confou l' ajout de fichiers plist sous /Library/LaunchDaemons/pour quelques raisons.

  • Les modifications apportées à ces fichiers persistent dans les sauvegardes et sont reportées dans les nouvelles versions de macOS et les nouveaux ordinateurs lors de la mise à niveau.

  • Si ces modifications entraînent des problèmes (ce qui est une possibilité réelle), vous devez vous rappeler que vous avez effectué les modifications et quels en sont les modifications, puis rééditez les fichiers pour les annuler. Cela peut arriver des années plus tard.

  • Après quelques années de mise à niveau, vous constaterez peut-être que ce qui était auparavant une augmentation d'une limite correspond désormais à une diminution d'une limite. Mais vous ne saurez probablement pas que parce que vous (a) ne vous souviendrez pas que vous avez effectué le changement et (b) ne pourrez pas voir les nouvelles limites car vous les avez dépassées depuis le début.

Une bien meilleure option

En général, plutôt que de régler des paramètres individuels sur le système et de déséquilibrer celui-ci (et de laisser éventuellement un seul programme planter le système en prenant toutes les ressources), si les limites système par défaut ne suffisent pas à vos besoins, je vous recommande de choisir sur "Server Performance Mode", ou du moins l'essayer. Pour ce faire, OS X / macOS 10.8 Mountain Lion ou version ultérieure et au moins 16 Go de mémoire installés sont nécessaires. Au début, vous deviez payer pour cela, mais à partir de OS X 10.8 Mountain Lion, il est gratuit et officiellement pris en charge par Apple avec le système d'exploitation standard.

L'activation de ce mode augmente considérablement les limites du système, notamment le nombre de processus que vous pouvez exécuter et le nombre de fichiers que vous pouvez ouvrir, au détriment de l'allocation de mémoire supplémentaire au noyau du système. Vous pouvez lire en détail ce qui est modifié par le mode de performance du serveur dans la réponse à la question "Qu'est-ce que serverperfmode = 1 fait réellement sur macOS?" .

Ce mode présente plusieurs avantages par rapport à la modification des fichiers de configuration, comme le suggèrent d’autres réponses.

  • C'est un changement d'un paramètre unique, facile à annuler.
  • Il en résulte un ensemble équilibré de limites supérieures, préservant les sauvegardes contre les processus non fiables qui échouent dans le système.
  • Dans la plupart des cas, il fournit des limites plus élevées que le noyau ne le permettrait autrement, même avec l'édition de fichiers de configuration.
  • Il soulève les limites par défaut pour tous les processus sans modifications de configuration supplémentaires.
  • À partir de OS X 10.11 El Capitan, la modification de configuration est stockée dans la NVRAM. Si cela pose problème, vous revenez en mode normal lorsque vous procédez à la résolution des problèmes de réinitialisation de la NVRAM. Vous n'êtes pas obligé de vous en souvenir.
  • Comme il est en NVRAM, il ne changera pas accidentellement d'état lors de la restauration à partir de sauvegardes.
  • Comme il est en NVRAM, il ne s’allumera pas automatiquement lorsque vous clonerez la configuration de votre Mac sur un nouveau matériel.
  • Comme il est officiellement pris en charge par Apple, "cela fonctionne" et vous ne recevrez aucune plainte d'Apple Genius selon laquelle vous avez modifié le système de manière incorrecte lorsque vous demandez de l'aide.
  • Puisqu'il s'agit d'un changement d'un paramètre unique, vous pouvez facilement l'activer et le désactiver pour le dépannage ou la comparaison d'un paramètre à l'autre.

Activer ou désactiver le mode de performance du serveur

Pour activer le mode de performance du serveur, utilisez le terminal pour exécuter l'une de ces commandes, puis redémarrez-le pour qu'il prenne effet:

  • Pour OS X 10.11 El Capitan ou version ultérieure, activez-le avec
sudo nvram boot-args="serverperfmode=1 $(nvram boot-args 2>/dev/null | cut -f 2-)"

et l'éteindre avec

sudo nvram boot-args="$(nvram boot-args 2>/dev/null | sed -e $'s/boot-args\t//;s/serverperfmode=1//')"

Apple recommande officiellement les commandes ci-dessus, mais il y a en fait un problème. Si vous exécutez la commande "allumer" deux fois, vous devez exécuter la commande "éteindre" deux fois pour l'éteindre. Donc, vérifiez si il est activé ou désactivé après avoir effectué un changement en exécutant

nvram boot-args

Si la sortie inclut "serverperfmode = 1", le paramètre est activé et, dans le cas contraire, il est désactivé.

  • Pour OS X 10.8 Mountain Lion, OS X 10.9 Mavericks et OS X 10.10 Yosemite, activez le mode performances du serveur avec
serverinfo --setperfmode 1

et l'éteindre avec

serverinfo --setperfmode 0

Vérifiez le réglage avec

serverinfo --perfmode

Le paramètre ne prendra effet qu'après le redémarrage du système.

Vérification pour voir si l'ordinateur est en cours d'exécution en mode de performance du serveur

En vérifiant les paramètres, vous saurez s'il est configuré pour prendre effet (ou non) après le redémarrage. Pour vérifier s’il est actuellement actif (en supposant que vous avez suivi mes conseils et n’aviez pas modifié les fichiers de configuration modifiant les paramètres), exécutez

sysctl kern.maxproc

Cela vous donnera un nombre correspondant au nombre maximum de processus autorisés par le système. Si ce nombre est un multiple de 532 , le mode de performance du serveur est désactivé. S'il s'agit d'un nombre rond (un multiple de 2500), le mode de performance du serveur est activé pour le système en cours d'exécution.

Vieux pro
la source