Welcher Befehl steuert die Grenzwerte für geöffnete Dateien?

19

Welche Befehls- / Konfigurationsdatei steuert die Grenzwerte für geöffnete Dateien unter OS X? Gibt es einen anderen Befehl für OS X 10.5 / 10.6 / 10.7? Die Optionen , die ich unten erforschen sind ulimit, sysctlundlaunchctl

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

Es gibt viele (verwandte?) Möglichkeiten, um die Grenzwerte für geöffnete 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 Posts 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 obigen Befehlen haben jedoch nur die sysctlBefehle eine scheinbare Wirkung (dh ulimit -nund launchctl limitzeigen keine Änderung, nachdem die obigen Befehle eingegeben wurden, während sysctl -adie angeforderten Änderungen angezeigt werden).

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

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

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

Wie kann ich die Obergrenzen für max files / max open files unter macOS nach oben korrigieren?

Keflavich
quelle

Antworten:

9

Die einfache Antwort war, dass es mehrere Grenzwerte gab und das niedrigste, das Sie in einer bestimmten Instanz erreichen, wird Ihren Fehler erzeugen. Jetzt am 10.12 launchctl limit maxfilesist auch im Mix. Für Details zur Implementierung wird diese großartige Antwort mit Kopfgeldern belegt und verdient mehr Stimmen als die, die ich geben kann.

andere relevante Themen 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, so dass ein Prozess den meisten, aber nicht den gesamten Platz des geöffneten Datei-Handlers aus dem Kernel nutzen kann.

Für normale Situationen ist der kern.maxfilesder letzte begrenzende Faktor.

In Sierra sind 256 offene Dateien und eine unbegrenzte Anzahl von Dateien zulässig. Daher kann ich feststellen, dass das Festlegen von 3 bis 4 Tausend Dateien für das Soft-Limit für nahezu alle unsere Hardware-Systeme geeignet ist und das System weiterhin reaktionsfähig bleibt, wenn ein außer Kontrolle geratener Prozess zu viele öffnet Dateien. Wir möchten, dass unsere Entwicklungsserver an der 256-Grenze bleiben, damit wir undichte und problematische Software in Entwicklung / Staging und Test erkennen, anstatt dies in der Produktion herauszufinden.

Ich bin kein Fan von 10k-Dateien - vielleicht werden wir mit APFS- und NVMe-Speicher den Tag erleben, an dem das nicht undenkbar ist, aber versuchen, Hunderttausende oder Niedrigtausende für Ihre Dateilimits einzuhalten. Besonders wenn Ihr Mac ein niedriges Prozesslimit hat , kann es problematisch sein, wenn so viele Dateien von so wenigen Prozessen geöffnet werden.

bmike
quelle
9

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. In Library/LaunchDaemonseine Datei mit dem Namen limit.maxfiles.plistund fügen Sie den folgenden in (frei fühlen , die zwei Nummern zu ändern (die die weichen und harten Grenzen sind, respectively):

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

Folgendes sollte die häufigsten Probleme lösen (und ist in der Reihenfolge ihrer Hierarchie aufgeführt):

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
0

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). Die der Shell zugewiesenen Ressourcen sind durch die Systemressourcenbeschränkungen begrenzt.

  • Das launchctlsteuert den maximalen Ressourcenverbrauch des Systems durch den aktuellen Prozess (siehe: man setrlimitund man launchctl). Maximalwerte sind durch die Kernelgrenzen begrenzt.

  • Die sysctlKontrollen Kernel-Limits (siehe: man sysctlund BSDs Tuning Kernel Limits ).

Je nach Problem können Sie die einzelnen Befehle verwenden, um die Grenzwerte zu erhöhen.

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 Soft- oder Hard-Limit genau erreicht wurde (ob es sich um ein lokales Shell-Skript, ein globales Skript root, eine App oder alle Prozesse gleichzeitig handelt). Es lohnt sich, alle Limits (Shell-, Launchd- und Kernel-Limits) zu erhöhen .

Informationen zum dauerhaften Erhöhen der Grenzwerte finden Sie unter: So steuern Sie den maximalen Ressourcenverbrauch des Systems auf einem Mac dauerhaft.

Kenorb
quelle