La nofile
limite par défaut pour les comptes d'utilisateurs OS X semble être d'environ 256 descripteurs de fichiers ces jours-ci. J'essaie de tester des logiciels qui nécessitent beaucoup plus de connexions que ceux ouverts en même temps.
Sur une boîte 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 ne sais pas où définir ces limites dans OS X.
Y a-t-il une interface graphique quelque part pour cela? Existe-t-il un fichier de configuration quelque part? Quelle est la façon la plus simple de modifier les ulimits par défaut sous OS X?
Réponses:
Sous Leopard, le processus initial est
launchd
. Les ulimits par défaut de chaque processus sont hérités delaunchd
. Pour référence, les limites par défaut (compilées en) sontPour modifier l'une de ces limites, ajoutez une ligne (vous devrez peut-être d'abord créer le fichier) à
/etc/launchd.conf
, les arguments sont les mêmes que ceux transmis à lalaunchctl
commande. Par exempleCependant,
launchd
votre shell de connexion a déjà démarré, donc le moyen le plus simple pour que ces modifications prennent effet est de redémarrer notre machine. (Utilisez >> pour ajouter à /etc/launchd.conf.)la source
sysctl.maxfiles
? (question connexe: apple.stackexchange.com/questions/33715/too-many-open-files )echo
sous sudo mais essayez de faire ajouter votre shell non privilégié au fichier, ce qu'il n'a pas l'autorisation de faire. Essayezecho "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
plutôt.ne fonctionne pas car sudo est au mauvais endroit, essayez ceci:
la source
Limites du shell
Les ressources disponibles pour le shell et les processus peuvent être modifiées par une
ulimit
commande qui peut être ajoutée aux scripts de démarrage tels que~/.bashrc
ou~/.bash_profile
pour des utilisateurs individuels ou/etc/bashrc
pour tous les utilisateurs . Exemple de ligne à ajouter:Voir:
help ulimit
etman bash
pour plus d'informations.Limites du système
En général, les limites du système sont contrôlées par le framework Launchd et peuvent être modifiées par
launchctl
commande, par exemplePour rendre les modifications persistantes, vous devez créer un fichier de liste de propriétés dans des dossiers conformes au lancement spécifiques qui agit comme un agent de démarrage.
Voici l'exemple de commande créant un tel fichier de démarrage:
Le fichier serait chargé au lancement du système, cependant, à charger pour exécuter manuellement:
Pour vérifier les limites actuelles, exécutez:
launchctl limit
.Voir: Créer des démons et des agents de lancement .
Limites du noyau
sysctl
commande.sysctl -a | grep ^kern.max
.sudo sysctl -w kern.maxfiles=20480
.En relation:
Méthodes obsolètes
Dans la version antérieure de macOS, vous pouviez définir ces limites à l'
/etc/sysctl.conf
échelle du système comme vous le faites normalement sur Unix, mais il semble que ce ne soit pas pris en charge.L'utilisation de
~/.launchd.conf
ou/etc/launchd.conf
semble ne pas non plus être prise en charge dans aucune version existante de macOS. wikiIdem avec
/etc/rc.local
le fichier de démarrage, il n'est pas pris en charge sur macOS.la source
Maintenant, je dois trouver pourquoi il existe 2 moyens de vérifier / fixer des limites ....
D'accord - semble
ulimit
etsysctl
donne un sentiment faussement positif qu'ils font réellement quelque chose - mais à la place, ils semblent inutiles . Quelqu'un pourrait-il vérifier cela?D'accord, je commence à comprendre. Depuis la version 10.4, il n'y
init
a plus de processus, il a été remplacé parlaunchd
, qui fonctionne également avec un PID de 1.Et bien sûr, il convient de mentionner que
ulimit
c'est un shell intégré,launchctl
un programme indépendant du shell.la source
Sous OS X, si vous essayez de modifier les limites logicielles pour un démon ou un processus ou une tâche, la bonne façon de modifier ces limites logicielles n'est pas de modifier la configuration de launchd par défaut pour tous les processus, mais en la définissant pour le processus que vous êtes essayant de courir.
Ceci est accompli dans votre fichier launchd .plist pour votre processus.
Si vous avez un démon ou un processus en cours d'exécution pour lequel vous avez besoin d'avoir plus de fichiers ouverts, créez un fichier plist pour lui et ajoutez-lui ces paramètres:
Un exemple, en utilisant mongodb. Je crée un fichier .plist appelé org.mongo.mongodb.plist et l'enregistre dans /Library/LaunchDaemons/org.mongo.mongodb.plist. Le fichier ressemble à ceci:
Désormais, votre processus dispose des ressources dont il a besoin, sans contourner la configuration globale du système. Ce sera automatiquement configuré au redémarrage. Ou, si vous ne voulez pas redémarrer, vous pouvez exécuter
Si votre processus ou tâche est plus un agent qu'un démon, vous pouvez mettre le .plist dans / Library / LaunchAgents à la place. Différentes règles s'appliquent à la façon dont launchd contrôlera votre processus dans les deux cas. LaunchDaemons semble réservé aux processus que launchd tentera de suivre à tout moment.
la source
Les éléments suivants devraient résoudre la plupart des solutions (et sont répertoriés dans l'ordre de leur hiérarchie):
Remarques:
la source
D'après mon expérience, ma tâche à nombre de processus élevé n'a réussi qu'avec:
Les deux premiers peuvent aller dans
/etc/sysctl.conf
et la valeur ulimit dans launchd.conf, pour un réglage fiable.Puisque tcp / ip faisait partie de ce que je faisais, je devais aussi augmenter
de son 128 par défaut.
Avant d'augmenter les limites du processus, j'obtenais des échecs «fork», pas assez de ressources. Avant d'augmenter kern.ipc.somaxconn, je recevais des erreurs de "tuyau cassé".
C'était en exécutant un bon nombre (500-4000) de processus détachés sur mon monstre Mac, OS 10.5.7, puis 10.5.8, maintenant 10.6.1. Sous Linux sur l'ordinateur de mes patrons, cela a juste fonctionné.
Je pensais que le nombre de processus serait plus proche de 1000, mais il semble que chaque processus que j'ai commencé comprenait sa propre copie du shell en plus de l'élément réel faisant le travail réel. Très festif.
J'ai écrit un jouet d'affichage qui ressemblait à quelque chose comme:
et regardé le nombre maximum de processus dans ps -ef et traîner dans netstat en attente
TIME_WAIT
d'expiration ... Avec les limites augmentées, j'ai vu plus de 3500TIME_WAIT
articles au maximum.Avant de relever les limites, je pouvais `` me faufiler '' sur le seuil de défaillance, qui a commencé au-dessous de 1K mais a atteint une valeur élevée de 1190. mis en cache qui s'est étendu à sa limite chaque fois qu'il a échoué.
Bien que mon cas de test ait eu une «attente» comme déclaration finale, il y avait encore BEAUCOUP de processus détachés qui traînaient après sa sortie.
J'ai obtenu la plupart des informations que j'ai utilisées à partir de publications sur Internet, mais elles n'étaient pas toutes exactes. Votre kilométrage peut varier.
la source