La valeur par défaut nofile
limite des comptes d'utilisateurs OS X semble être d'environ 256 descripteurs de fichiers ces jours-ci. J'essaie de tester certains logiciels nécessitant beaucoup plus de connexions que cela ouvertes à la fois.
Sur une boîte de Debian typique exécutant le module PAM Limits, je modifierais /etc/security/limits.conf
Pour définir des limites plus élevées pour l'utilisateur qui exécutera le logiciel, mais je suis mystifié où définir ces limites dans OS X.
Y a-t-il une interface graphique quelque part pour cela? Y a-t-il un fichier de configuration quelque part pour cela? Quel est le moyen le moyen de modifier les ulimités par défaut sur OS X?
Sous Léopard, le processus initial est launchd
. Les ulimités par défaut de chaque processus sont hérités de launchd
. Pour référence, les limites par défaut (compilées) sont
$ Sudo launchctl limit
cpu unlimited unlimited
filesize unlimited unlimited
data 6291456 unlimited
stack 8388608 67104768
core 0 unlimited
rss unlimited unlimited
memlock unlimited unlimited
maxproc 266 532
maxfiles 256 unlimited
Pour modifier l'une de ces limites, ajoutez une ligne (vous devrez peut-être créer le fichier d'abord) à /etc/launchd.conf
, les arguments sont les mêmes que transmis à la commande launchctl
. Par exemple
echo "limit maxfiles 1024 unlimited" | Sudo tee -a /etc/launchd.conf
Cependant launchd
a déjà démarré votre shell de connexion, de sorte que le moyen le plus simple de rendre ces modifications à prendre effet est de redémarrer notre machine. (Utiliser >> à ajouter à /etc/launchd.conf.)
Sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf
ne fonctionne pas car le sudo est au mauvais endroit, essayez ceci:
echo 'limit maxfiles 10000 unlimited' | Sudo tee -a /etc/launchd.conf
Les ressources disponibles pour la coquille et les processus peuvent être modifiées par la commande ulimit
_ pouvant être ajoutée aux scripts de démarrage tels que ~/.bashrc
Ou ~/.bash_profile
Utilisateurs individuels ou /etc/bashrc
Pour tous les utilisateurs . Exemple de ligne pour ajouter:
ulimit -Sn 4096 && ulimit -Sl unlimited
Voir: help ulimit
Et man bash
Pour plus d'informations.
En général, les limites du système sont contrôlées par launchd framework et peuvent être modifiés par la commande launchctl
, par exemple.
launchctl limit maxfiles 10240 unlimited
Pour apporter les modifications persistantes, vous devez créer un fichier de liste de propriétés dans des fichiers spécifiques lancer des dossiers conformes , qui agit comme agent de démarrage.
Voici l'exemple de commande créant un tel fichier de démarrage:
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"
Le fichier serait chargé au lancement du système, cependant, de charger pour exécuter manuellement:
Sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist
Pour vérifier les limites actuelles, exécutez: launchctl limit
.
Voir: Créer des démons et des agents de lancement .
sysctl
.sysctl -a | grep ^kern.max
.Sudo sysctl -w kern.maxfiles=20480
.En rapport:
Dans la version antérieure de MacOS, vous pouvez définir ces limites dans /etc/sysctl.conf
À l'échelle du système, comme normalement que vous faites sur UNIX, cependant, il semble qu'il n'est pas pris en charge.
Utilisation de ~/.launchd.conf
Ou /etc/launchd.conf
Apparaît qu'il n'est également pas pris en charge dans une version existante des macos non plus.wiki
Même avec le fichier de démarrage /etc/rc.local
, Il n'est pas pris en charge sur MacOS.
Sur OS X, si vous essayez de modifier les limites mou pour un démon ou un processus ou une tâche, la bonne façon de modifier ces limites logicielles n'est pas en modifiant la configuration de Launchd par défaut pour Tous Processus, Mais en la fixant pour le processus, vous essayez de courir.
Ceci est accompli dans votre fichier de lancier .Plist pour votre processus.
Si vous avez un démon ou un processus en cours d'exécution que vous devez avoir plus de fichiers ouverts pour cela, créez un fichier de plateau et ajouter ces params à celui-ci:
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>1024</integer>
</dict>
Un exemple, en utilisant mongodb. Je crée un fichier .plist appelé org.mongo.mongodb.plist et enregistrez-le sur /Library/Launchdaemons/org.mongo.mongodb.plist. Le fichier ressemble à ceci:
<?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>Disabled</key>
<false/>
<key>Label</key>
<string>org.mongo.mongod</string>
<key>ProgramArguments</key>
<array>
<string>/usr/local/lib/mongodb/bin/mongod</string>
<string>--dbpath</string>
<string>/Users/Shared/mongodata/</string>
<string>--logpath</string>
<string>/var/log/mongodb.log</string>
</array>
<key>QueueDirectories</key>
<array/>
<key>RunAtLoad</key>
<true/>
<key>UserName</key>
<string>daemon</string>
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>1024</integer>
<key>NumberOfProcesses</key>
<integer>512</integer>
</dict>
</dict>
</plist>
Maintenant, votre processus a les ressources dont il a besoin, sans fumer avec la configuration globale du système. Cela sera automatiquement mis en place sur le redémarrage. Ou, si vous ne voulez pas redémarrer, vous pouvez courir
Sudo launchctl load /Library/LaunchDaemons/org.mongod.plist
Si votre processus ou votre tâche est plus d'un agent qu'un démon, vous pouvez mettre la place dans/Library/Landagents. Différentes règles s'appliquent à la manière dont LaunchD contrôlera votre processus dans les deux cas. LaunlestDaemons semble réservé aux processus que Lanchant essaiera de suivre à tout moment.
% ulimit -a
core file size (blocks, -c) 0
data seg size (kbytes, -d) 6144
file size (blocks, -f) unlimited
max locked memory (kbytes, -l) unlimited
max memory size (kbytes, -m) unlimited
open files (-n) 2560
pipe size (512 bytes, -p) 1
stack size (kbytes, -s) 8192
cpu time (seconds, -t) unlimited
max user processes (-u) 266
virtual memory (kbytes, -v) unlimited
%
Maintenant, je dois trouver pourquoi il existe 2 moyens de vérifier/de définir des limites ....
Ok - on dirait que ulimit
et sysctl
donner un sentiment faux positif qu'ils font réellement quelque chose - mais ils semblent être inutile. Quelqu'un pourrait-il vérifier cela?
D'accord, je commence à comprendre. À partir de V10.4, il n'y a plus de processus init
, il a été remplacé par launchd
, qui fonctionne également avec une PID de 1.
% ps -fu root
UID PID PPID C STIME TTY TIME CMD
0 1 0 0 0:30.72 ?? 0:46.72 /sbin/launchd
Et bien sûr mérite d'être mentionné, c'est que ulimit
est une coquille intégrée, launchctl
est un programme indépendant de coquille.
Les éléments suivants doivent 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:
Mon expérience est que ma tâche de comptage de haut niveau ne réussissait que:
kern.maxproc=2500 # This is as big as I could set it.
kern.maxprocperuid=2048
ulimit -u 2048
Les deux premiers peuvent entrer dans /etc/sysctl.conf
et la valeur ulimentaire en launchd.conf, pour un réglage fiable.
Depuis que TCP/IP faisait partie de ce que je faisais, j'ai aussi besoin de casser
kern.ipc.somaxconn=8192
de la valeur par défaut 128.
Avant d'avoir augmenté les limites de processus, je reçois des échecs "fourchettes", pas assez de ressources. Avant d'avoir augmenté Kern.ipc.somaxconn, je reçois des erreurs "tuyaux cassées".
C'était tout en exécutant un nombre équitable (500-4000) de processus détachés sur My Monster Mac, OS 10.5.7, puis 10.5.8, maintenant 10.6.1. Sous Linux sur l'ordinateur de mon patron, il vient de travailler.
Je pensais que le nombre de processus serait plus proche de 1 000, mais il semble que chaque processus que j'ai commencé à inclure sa propre copie de la coque en plus de l'élément réel effectuant le travail réel. Très festif.
J'ai écrit un jouet d'affichage qui a fait quelque chose comme:
#!/bin/sh
while[ 1 ]
do
n=netstat -an | wc -l
nw=netstat -an | grep WAIT | wc -l
p=ps -ef | wc -l
psh=ps -ef | fgrep sh | wc -l
echo "netstat: $n wait: $nw ps: $p sh: $psh"
sleep 0.5
done
et regardé le nombre maximum de processus en PS -EF et suspendu à NetStat en attente de TIME_WAIT
expirer ... avec les limites soulevées, j'ai vu 3500+ TIME_WAIT
articles au sommet.
Avant de soulever les limites, je pouvais "faufiler" sur le seuil d'échec, qui a commencé en dessous de 1 km, mais a augmenté à une valeur élevée de 1190 .. Chaque fois qu'il a été poussé dans une défaillance, il pouvait prendre un peu plus la prochaine fois, probablement à cause de quelque chose mis en cache qui s'est étendu à sa limite à chaque échec.
Bien que mon cas de test ait une "attente" comme dernière déclaration, il y avait encore beaucoup de processus détachés suspendus après sa sortie.
J'ai eu la plupart des informations que j'ai utilisées dans des publications sur Internet, mais tout cela n'était pas précis. Votre miliolier peut varier.