Das Standardlimit nofile
für OS X-Benutzerkonten scheint derzeit bei 256 Dateideskriptoren zu liegen. Ich versuche, eine Software zu testen, die viel mehr Verbindungen benötigt, als gleichzeitig geöffnet sind.
Auf einer typischen Debian-Box, auf der das Modul pam limits ausgeführt wird, würde ich bearbeiten /etc/security/limits.conf
, um höhere Grenzwerte für den Benutzer festzulegen, der die Software ausführen wird, aber ich bin nicht sicher, wo diese Grenzwerte in OS X festgelegt werden sollen.
Gibt es irgendwo eine GUI dafür? Gibt es irgendwo eine Konfigurationsdatei dafür? Was ist der schnellste Weg, um die Standard-Ulimits unter OS X zu ändern?
Antworten:
Unter Leopard ist der erste Prozess
launchd
. Die Standard-Ulimits jedes Prozesses werden von übernommenlaunchd
. Als Referenz sind die Standardgrenzen (kompiliert in)Um eine dieser Beschränkungen zu ändern, fügen Sie eine Zeile hinzu (Sie müssen möglicherweise zuerst die Datei erstellen)
/etc/launchd.conf
. Die Argumente stimmen mit denen überein, die an denlaunchctl
Befehl übergeben wurden. Beispielsweiselaunchd
Ihre Anmeldeshell wurde jedoch bereits gestartet. Der einfachste Weg, um diese Änderungen wirksam werden zu lassen, besteht darin, unseren Computer neu zu starten. (Verwenden Sie >>, um an /etc/launchd.conf anzuhängen.)quelle
sysctl.maxfiles
? (Verwandte Frage: apple.stackexchange.com/questions/33715/too-many-open-files )echo
unter sudo, versuchen aber, Ihre nichtprivilegierte Shell an die Datei anzuhängen, wozu sie keine Berechtigung hat. Versuchen Sie esecho "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf
stattdessen.funktioniert nicht, weil sudo am falschen Ort ist. Versuchen Sie Folgendes:
quelle
Shell Grenzen
Der Shell und den Prozessen zur Verfügung stehende Ressourcen können per
ulimit
Befehl geändert werden, der Startskripten wie~/.bashrc
oder~/.bash_profile
für einzelne Benutzer oder/etc/bashrc
für alle Benutzer hinzugefügt werden kann . Beispielzeile zum Hinzufügen:Siehe:
help ulimit
undman bash
für weitere Informationen.Systemgrenzen
Im Allgemeinen werden Systemgrenzen vom Launchd- Framework gesteuert und können per
launchctl
Befehl geändert werden , zUm die Änderungen dauerhaft zu speichern, müssen Sie eine Eigenschaftslistendatei in bestimmten Start-kompatiblen Ordnern erstellen, die als Start-Agent fungiert.
Hier ist der Beispielbefehl zum Erstellen einer solchen Startdatei:
Die Datei wird jedoch beim Systemstart geladen, um sie manuell auszuführen:
Um die aktuellen Grenzwerte zu überprüfen, führen:
launchctl limit
.Siehe: Erstellen von Start-Daemons und Agenten .
Kernel-Grenzen
sysctl
Befehl gesteuert .sysctl -a | grep ^kern.max
.sudo sysctl -w kern.maxfiles=20480
.Verbunden:
Veraltete Methoden
In früheren Versionen von macOS konnten Sie diese Grenzwerte
/etc/sysctl.conf
systemweit festlegen, wie Sie es normalerweise unter Unix tun. Es scheint jedoch, dass dies nicht unterstützt wird.Die Verwendung von
~/.launchd.conf
oder/etc/launchd.conf
scheint auch in keiner vorhandenen Version von macOS unterstützt zu werden. wikiWie bei der
/etc/rc.local
Startdatei wird sie unter macOS nicht unterstützt.quelle
Jetzt muss ich herausfinden, warum es 2 Möglichkeiten gibt, Grenzen zu prüfen / festzulegen ....
Ok - scheint wie
ulimit
undsysctl
gibt ein falsch-positives Gefühl , dass sie etwas tatsächlich tun - , sondern scheinen sie zu sein nutzlos . Könnte jemand das überprüfen?Okay, ich fange an zu verstehen. Ab v10.4 gibt es keinen
init
Prozess mehr, er wurde ersetzt durchlaunchd
, der auch mit einer PID von 1 läuft.Und natürlich ist zu erwähnen, dass
ulimit
es sich um ein Shell-eingebautes,launchctl
ein Shell-unabhängiges Programm handelt.quelle
Wenn Sie unter OS X versuchen, die Softwarelimits für einen Dämon oder einen Prozess oder eine Aufgabe zu ändern, müssen Sie diese Softwarelimits nicht für alle Prozesse in der Standardkonfiguration von launchd ändern , sondern für den jeweiligen Prozess festlegen versuchen zu rennen.
Dies geschieht in Ihrer launchd .plist-Datei für Ihren Prozess.
Wenn ein Daemon oder Prozess ausgeführt wird, für den Sie mehr offene Dateien benötigen, erstellen Sie eine plist-Datei und fügen Sie diese Parameter hinzu:
Ein Beispiel mit Mongodb. Ich erstelle eine .plist-Datei mit dem Namen org.mongo.mongodb.plist und speichere sie in /Library/LaunchDaemons/org.mongo.mongodb.plist. Die Datei sieht folgendermaßen aus:
Jetzt verfügt Ihr Prozess über die Ressourcen, die er benötigt, ohne die globale Konfiguration für das System zu beeinträchtigen. Dies wird beim Neustart automatisch eingerichtet. Wenn Sie nicht neu starten möchten, können Sie ausführen
Wenn Ihr Prozess oder Ihre Aufgabe eher ein Agent als ein Daemon ist, können Sie die .plist stattdessen in / Library / LaunchAgents ablegen. In beiden Fällen gelten unterschiedliche Regeln für die Steuerung Ihres Prozesses durch launchd. LaunchDaemons scheint für Prozesse reserviert zu sein, die von launchd ständig aktualisiert werden sollen.
quelle
Folgendes sollte die meisten Lösungen auflösen (und wird in der Reihenfolge ihrer Hierarchie aufgelistet):
Anmerkungen:
quelle
Ich habe die Erfahrung gemacht, dass meine Aufgabe mit hoher Prozessanzahl nur erfolgreich war mit:
Die ersten beiden können in
/etc/sysctl.conf
die Datei launchd.conf und der Wert ulimit für eine zuverlässige Einstellung eingegeben werden.Da TCP / IP ein Teil meiner Arbeit war, musste ich mich auch anstrengen
von seiner Standardeinstellung 128.
Bevor ich die Prozessgrenzen erhöht habe, gab es Gabelungsfehler, nicht genügend Ressourcen. Bevor ich kern.ipc.somaxconn vergrößerte, bekam ich "broken pipe" -Fehler.
Dies geschah, während auf meinem Monster Mac, OS 10.5.7, dann 10.5.8, jetzt 10.6.1, eine ganze Reihe (500-4000) getrennter Prozesse ausgeführt wurden. Unter Linux auf dem Computer meines Chefs hat es einfach funktioniert.
Ich dachte, dass die Anzahl der Prozesse näher bei 1000 liegen würde, aber es scheint, dass jeder Prozess, den ich gestartet habe, zusätzlich zu dem eigentlichen Gegenstand, der die eigentliche Arbeit erledigt, eine eigene Kopie der Shell enthielt. Sehr festlich
Ich habe ein Ausstellungsspielzeug geschrieben, das ungefähr so aussah:
und beobachtete die maximale Anzahl von Prozessen in ps -ef und wartete in netstat darauf
TIME_WAIT
, dass sie abliefenTIME_WAIT
.Bevor ich die Grenzen anhob, konnte ich mich an die Ausfallschwelle heranschleichen, die unterhalb von 1K begann, aber auf einen hohen Wert von 1190 anstieg. Jedes Mal, wenn es zu einem Ausfall kam, konnte es das nächste Mal ein wenig länger dauern, wahrscheinlich wegen etwas jedes Mal, wenn ein Fehler auftrat, wurde der Cache bis an sein Limit erweitert.
Obwohl mein Testfall eine "Wartezeit" als letzte Anweisung hatte, gab es nach dem Beenden VIELE getrennte Prozesse.
Ich habe die meisten Informationen, die ich verwendet habe, aus Beiträgen im Internet erhalten, aber nicht alle waren korrekt. Ihre Laufleistung kann variieren.
quelle