Maximale Anzahl offener Dateideskriptoren in Snow Leopard erhöhen?

101

Ich versuche, etwas zu tun, das eine große Anzahl von Dateideskriptoren erfordert

sudo ulimit -n 12288ist so hoch wie Snow Leopard gehen will; darüber hinaus ergibt sich

/ usr / bin / ulimit: Zeile 4: ulimit: offene Dateien: Änderung nicht möglich limit: Ungültiges Argument.

Ich möchte die Zahl viel höher anheben, sagen wir 100000. Ist es möglich?

Chris Poole
quelle
4
Die Antworten auf diese Frage funktionieren in OSX Mavericks nicht mehr.
Howard
2
Laufen echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confund Neustarten funktioniert bei mir in Mavericks.
Lri

Antworten:

95

Wenn Sie den ulimitBefehl verwenden, werden nur die Ressourcengrenzen für die aktuelle Shell und ihre sudo ulimituntergeordneten Shell geändert und eine Stamm-Shell erstellt, deren Grenzen angepasst und dann beendet (was meines Erachtens keine wirklichen Auswirkungen hat).
Um 12288 zu überschreiten, müssen Sie den Kernel kern.maxfilesund die kern.maxfilesperprocParameter sowie (zumindest gemäß diesem Blogeintrag , der eine Zusammenfassung dieser Diskussion darstellt ) ein Startlimit anpassen . Mit können Sie launchctl limitalle Einstellungen gleichzeitig vornehmen:

sudo launchctl limit maxfiles 1000000 1000000

Um dies dauerhaft zu machen (dh nicht zurückzusetzen, wenn Sie neu starten), erstellen Sie /etc/launchd.confFolgendes:

limit maxfiles 1000000 1000000

Dann können Sie ulimit(aber ohne die sudo) verwenden, um Ihr Prozesslimit anzupassen.

Wenn dies nicht der Fall ist, stoßen Sie möglicherweise auf Größenbeschränkungen im Kernel. Wenn Ihr Modell dies unterstützt , kann das Booten des Kernels im 64-Bit-Modus hilfreich sein.

Gordon Davisson
quelle
1
sudo launchctl limit maxfiles 1000000 unlimitedWeder das harte noch das weiche Limit für "maxfiles" kann unbegrenzt sein. Bitte verwenden Sie für beide einen numerischen Parameter.
Thomas Hunter
2
Seien Sie vorsichtig, wenn Sie diese Zeile hinzufügen launchd.conf. Ich denke, wenn die Zahl zu klein ist, kann es Ihren Computer unbrauchbar machen. limit maxfiles 1024 1024Ich habe es zum Beispiel benutzt und es fiel mir sehr schwer, es zurück zu ändern.
Shawn
1
Leider: "Die Datei /etc/launchd.conf wird nicht mehr für Unterbefehle herangezogen, die während des frühen Startvorgangs ausgeführt werden. Diese Funktionalität wurde aus Sicherheitsgründen entfernt."
Alice Purcell
Es funktioniert nicht, meine FD-Nummer kann 6k nicht überschreiten, auch wenn ich ulimit -Sn 10240 erfolgreich eingestellt habe.
Jian Weihang
@ JianWeihang FD-Nummern sind pro Prozess, also gehe ich davon aus, dass bei anderen Prozessen 4000 Dateien geöffnet waren. Führen Sie Chrome aus? ;)
Trejkaz
41

Das Folgende sollte die meisten Lösungen auflösen (und wird in der Reihenfolge ihrer Hierarchie aufgelistet):

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

Anmerkungen:

  1. Sie müssen neu starten, damit diese Änderungen wirksam werden.
  2. AFAIK Unter OS X können Sie keine Limits mehr auf "unbegrenzt" setzen
  3. launchctl maxfiles werden von sysctl maxfiles begrenzt und dürfen diese daher nicht überschreiten
  4. sysctl scheint kern.maxfilesperproc von launchctl maxfiles zu erben
  5. ulimit scheint standardmäßig den Wert 'open files' von launchctl zu erben
  6. Sie können ein benutzerdefiniertes Ulimit in / etc / profile oder ~ / .profile festlegen. obwohl dies nicht erforderlich ist, habe ich ein Beispiel angegeben
  7. Seien Sie vorsichtig, wenn Sie einen dieser Werte im Vergleich zu den Standardwerten auf einen sehr hohen Wert setzen - die Funktionen sind stabil und sicher. Ich habe diese Beispielzahlen, die ich für vernünftig halte, auf anderen Websites geschrieben.
errant.info
quelle
3
Leider: "Die Datei /etc/launchd.conf wird nicht mehr für Unterbefehle herangezogen, die während des frühen Startvorgangs ausgeführt werden. Diese Funktionalität wurde aus Sicherheitsgründen entfernt."
Alice Purcell
34

Es scheint, als gäbe es für jede Version von OS X eine völlig andere Methode, um das Limit für geöffnete Dateien zu ändern!

Für OS X Sierra (10.12.X) müssen Sie:

1. Library/LaunchDaemonsErstellen Sie eine Datei mit dem Namen limit.maxfiles.plistund fügen Sie Folgendes ein (Sie können die beiden Zahlen (die weichen bzw. harten Grenzen) jederzeit ändern):

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

2. Ändern Sie den Eigentümer Ihrer neuen Datei:

sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist

3. Laden Sie diese neuen Einstellungen:

sudo launchctl load -w /Library/LaunchDaemons/limit.maxfiles.plist

4. Überprüfen Sie abschließend, ob die Grenzwerte korrekt sind:

launchctl limit maxfiles
NinjaPixel
quelle
2
Diese Antwort ist großartig und ich habe Hintergrundinformationen gefunden, die ich hier hinzufügen kann: @ninjaPixel
Dean Radcliffe
20

Es scheint, dass OS X Lion "unbegrenzt" als Wert nicht zulässt:

% sudo launchctl limit maxfiles 8192 unlimited
Neither the hard nor soft limit for "maxfiles" can be unlimited. Please use a numeric parameter for both.

Die Eingabe numerischer Werte für die weiche und die harte Grenze erledigt die Aufgabe:

% sudo launchctl limit maxfiles 4096 8192
crishoj
quelle
3
Wenn einer der Werte unbegrenzt war , führt die Verwendung -1als Wert zu 12288. Es ist möglich, größere numerische Werte zu verwenden, z sudo launchctl limit maxfiles 15000 150000. Ich bin mir dann allerdings nicht sicher, ob diese Einstellungen einen Effekt haben.
Daniel Beck
8

Auf Mavericks ist es einfach. Als regulärer Benutzer:

ulimit -n 8192

Sie können die aktualisierten Einstellungen über überprüfen

ulimit -a

Auf meinem Rechner:

ulimit -a
-t: cpu time (seconds)              unlimited
-f: file size (blocks)              unlimited
-d: data seg size (kbytes)          unlimited
-s: stack size (kbytes)             8192
-c: core file size (blocks)         0
-v: address space (kbytes)          unlimited
-l: locked-in-memory size (kbytes)  unlimited
-u: processes                       709
-n: file descriptors                8192
Clustermagnet
quelle
2
Überlegen Sie, ob Sie Ihre Lösung überarbeiten möchten. Sie setzen ein ulimit von 1024 und zeigen die Ausgabedateideskriptoren als 8192 an (sollte 1024 sein). Ihr Ansatz ist auch ohne sudo problematisch, versuchen Sie es ein paar Mal für sich selbst zu ändern.
y3sh
1
sudo sollte hier nicht verwendet werden, aber diese Antwort ist falsch. Benutzer von Mavericks sollten echo limit maxfiles 10000 10000|sudo tee -a /etc/launchd.confihren Computer verwenden und dann neu starten
Kyle Chadha
3

Unter OS X 10.13.6 funktioniert das für mich:

$ sysctl kern.maxfiles
kern.maxfiles: 12288
$ sysctl kern.maxfilesperproc
kern.maxfilesperproc: 10240
$ sudo sysctl -w kern.maxfiles=1048600
kern.maxfiles: 12288 -> 1048600
$ sudo sysctl -w kern.maxfilesperproc=1048576
kern.maxfilesperproc: 10240 -> 1048576
$ ulimit -S -n
256
$ ulimit -S -n 1048576
$ ulimit -S -n
1048576
Petr Javorik
quelle
1

Einige Grenzwerte können nicht geändert werden ulimit, da sie nur für die aktuelle Shell gelten. Daher launchctlsollte der Befehl verwendet werden, um die Grenzwerte global zu ändern, z

sudo launchctl limit maxfiles 100000 unlimited

Bitte beachten Sie, dass das Anwenden dieser Grenzwerte in /etc/launchd.conf(wie in anderen Antworten vorgeschlagen) in den aktuellen Versionen von macOS nicht mehr unterstützt wird. Kann zwar weiterhin launchd.plist(siehe man launchd.plist:) benutzerspezifische oder systemweite plistKonfigurationsdateien verwenden, wie hier , da und dort empfohlen .


Um diese Grenzwerte dauerhaft zu erhalten, können Sie /etc/sysctl.conffile verwenden und zum Beispiel Folgendes hinzufügen:

kern.maxprocperuid=1000
kern.maxproc=2000
kern.maxfilesperproc=20000
kern.maxfiles=50000

Damit Änderungen wirksam werden, ist ein Neustart erforderlich.

Führen Sie Folgendes aus, um die aktuellen Grenzwerte anzuzeigen: launchctl limitoder sysctl -a | grep ^kern.max.

Siehe auch: So behalten Sie die Einstellungen von ulimit unter macOS bei

Kenorb
quelle