Welcher Befehl steuert die Grenzen für offene Dateien?

Welcher Befehl/welche Konfigurationsdatei steuert die Beschränkungen für offene Dateien unter OS X? Gibt es einen anderen Befehl für OS X 10.5 / 10.6 / 10.7? Die Optionen, die ich unten untersuche, sind ulimit, sysctl, undlaunchctl

"Zu viele offene Dateien" ist anscheinend ein häufiger Fehler bei Leopard, möglicherweise anderen Versionen von OS X:

Es gibt viele (verwandte?) Möglichkeiten, die Limits für offene Dateien anzuzeigen:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
file size               (blocks, -f) unlimited
max locked memory       (kbytes, -l) unlimited
max memory size         (kbytes, -m) unlimited
open files                      (-n) 2048
pipe size            (512 bytes, -p) 1
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 512
virtual memory          (kbytes, -v) unlimited


$ launchctl limit
cpu         unlimited      unlimited      
filesize    unlimited      unlimited      
data        unlimited      unlimited      
stack       8388608        67104768       
core        0              unlimited      
rss         unlimited      unlimited      
memlock     unlimited      unlimited      
maxproc     1024           2048           
maxfiles    2048           4096       

$ sysctl -a | grep files
kern.maxfiles = 32768
kern.maxfilesperproc = 16384
kern.maxfiles: 32768
kern.maxfilesperproc: 16384
kern.num_files: 2049

In einigen der obigen Beiträge wurde behauptet, dass diese mit den folgenden Befehlen geändert werden können:

sudo launchctl limit maxfiles 16384 32768
sudo ulimit -n 32768
sudo sysctl -w kern.maxfilesperproc=16384
sudo sysctl -w kern.maxfiles=32768

Von den oben genannten Befehlen haben jedoch nur die sysctlBefehle eine scheinbare Wirkung (dh ulimit -nund launchctl limitzeigen keine Änderung, nachdem die oben genannten Befehle eingegeben wurden, während sysctl -adie angeforderten Änderungen angezeigt werden).

Die entsprechenden Orte zum Ändern dieser Parameter für das Betriebssystem sind:

/etc/sysctl.conf
/etc/launchd.conf

Ich habe auch eine Antwort entdeckt, die lautet, dass ulimitnur die aktuelle Shell gesteuert wird.

Wie kann ich die maximale Dateianzahl / maximale Anzahl offener Dateien unter macOS nach oben anpassen?

Antworten (4)

Früher lautete die einfache Antwort, dass es mehrere Limits gab und das niedrigste Limit, das Sie in einem bestimmten Fall erreichen, Ihren Fehler generiert. Jetzt am 10.12 launchctl limit maxfilesist auch mit dabei. Für Details zur Implementierung wird diese großartige Antwort belohnt und verdient mehr Stimmen, als ich ihr geben kann.

Weitere relevante Threads sind:

Die ulimitStufe ist niedrig eingestellt, um zu verhindern, dass ein schlechtes Shell-Skript den Kernel mit offenen Dateien überschwemmt.

Das kern.maxfilesperprocist da, um ein wenig Platz in der maximalen Anzahl von Dateien zu lassen, damit ein Prozess den größten, aber nicht den gesamten Speicherplatz für offene Dateihandler aus dem Kernel verwenden kann.

Für normale Situationen kern.maxfilesist dies der letzte begrenzende Faktor.

Auf Sierra - die Grenzen sind 256 geöffnete Dateien und unbegrenztes Maximum, also finde ich, dass das Setzen von 3 bis 4.000 Dateien für das Soft-Limit für fast unsere gesamte Hardware funktioniert und das System trotzdem reaktionsfähig hält, wenn ein außer Kontrolle geratener Prozess zu viele öffnet Dateien. Wir halten unsere Entwicklungsserver gerne auf der 256-Grenze, damit wir undichte und problematische Software in der Entwicklung/Staging und beim Testen abfangen, anstatt davon in der Produktion zu erfahren.

Ich bin kein Fan von 10.000 Dateien – vielleicht werden wir mit APFS und NVMe-Speicher den Tag sehen, an dem das nicht undenkbar ist, aber versuchen Sie, bei Ihren Dateigrenzen bei Hunderten oder niedrigen Tausenden zu bleiben. Besonders wenn Ihr Mac ein niedriges Prozesslimit hat, kann es problematisch sein, so viele Dateien von so wenigen Prozessen öffnen zu lassen.

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

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

1. Erstellen Sie in Library/LaunchDaemonseine Datei mit limit.maxfiles.plistdem Namen und fügen Sie Folgendes ein (Sie können die beiden Zahlen ändern (die jeweils die weichen und harten Grenzen sind):

<?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
Ich habe anscheinend Probleme, die Maxfiles auf diese Weise auf unbegrenzt zu setzen, indem ich den zweiten Wert auf "unbegrenzt" setze. Irgendwelche Gedanken?

Die folgenden sollten die häufigsten Probleme lösen (und sind 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 Sie können unter OS X keine Grenzen mehr auf "unbegrenzt" setzen
  3. launchctl maxfiles sind durch sysctl maxfiles begrenzt und können diese daher nicht überschreiten
  4. sysctl scheint kern.maxfilesperproc von launchctl maxfiles zu erben
  5. ulimit scheint standardmäßig den Wert "Dateien öffnen" 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 bereitgestellt
  7. Seien Sie vorsichtig, wenn Sie einen dieser Werte im Vergleich zu ihrem Standardwert auf eine sehr hohe Zahl setzen - die Funktionen existieren Stabilität/Sicherheit. Ich habe diese Beispielnummern genommen, die ich für vernünftig halte und die auf anderen Websites geschrieben wurden.

In einfachen Worten:

  • Der ulimitBefehl bietet "Kontrolle über die Ressourcen, die der Shell und den von ihr erstellten Prozessen zur Verfügung stehen" (siehe: help ulimitund man bash). Ressourcen, die der Shell gegeben werden, sind durch die Ressourcengrenzen des Systems begrenzt.

  • Der launchctlsteuert den maximalen Systemressourcenverbrauch durch den aktuellen Prozess (siehe: man setrlimitund man launchctl). Maximalwerte werden durch die Kernel-Limits begrenzt.

  • Der sysctlsteuert die Kernel-Limits (siehe: man sysctlund BSD's Tuning Kernel Limits ).

Um die Limits zu erhöhen, können Sie je nach Problem jeden der Befehle verwenden.

Siehe auch: Welche Beziehung besteht zwischen `launchctl limit` und `ulimit`?


Für das Problem mit zu vielen geöffneten Dateien hängt dies davon ab, welches weiche oder harte Limit genau erreicht wurde (ob es sich um ein lokales Shell-Skript handelt, das globale Skript, das von ausgeführt wird root, eine App oder alle Prozesse gleichzeitig). Es lohnt sich, alle Limits (Shell-, Launchd- und Kernel-Limits) zu erhöhen.

Informationen zum dauerhaften Erhöhen der Grenzwerte finden Sie unter: Wie kann der maximale Systemressourcenverbrauch auf dem Mac dauerhaft gesteuert werden?