Frage Wo sind die standardmäßigen ulimits, die unter OS X (10.5) angegeben sind?


Der Standard nofile Limit für OS X Benutzerkonten scheint in diesen Tagen etwa 256 Dateideskriptoren zu sein. Ich versuche, eine Software zu testen, die viel mehr Verbindungen benötigt als diese gleichzeitig öffnen.

Auf einer typischen Debian-Box, auf der das Pam-Limit-Modul läuft, würde ich bearbeiten /etc/security/limits.conf um höhere Limits für den Benutzer festzulegen, der die Software ausführen wird, aber ich bin verwirrt, wo diese Grenzen in OS X festgelegt werden.

Gibt es irgendwo eine GUI? Gibt es dafür irgendwo eine Konfigurationsdatei? Was ist der sauberste Weg, um die standardmäßigen ulimits unter OS X zu ändern?


25
2018-05-30 13:09


Ursprung


Für Mac OS X Lion, siehe superuser.com/questions/396102/ulimit-does-not-obey-me - David J.
Verbunden: Welcher Befehl steuert die Dateilimits? - kenorb


Antworten:


Unter Leopard ist der Anfangsprozess launchd. Die Standard-ulimits jedes Prozesses werden von vererbt launchd. Als Referenz sind die voreingestellten (inkompilierten) Grenzen

$ sudo launchctl limit
    cpu         unlimited      unlimited      
    filesize    unlimited      unlimited      
    data        6291456        unlimited      
    stack       8388608        67104768       
    core        0              unlimited      
    rss         unlimited      unlimited      
    memlock     unlimited      unlimited      
    maxproc     266            532            
    maxfiles    256            unlimited

Um eine dieser Grenzen zu ändern, fügen Sie eine Zeile hinzu (möglicherweise müssen Sie zuerst die Datei erstellen) /etc/launchd.conf, die Argumente sind die gleichen wie an die übergeben launchctl Befehl. Zum Beispiel

echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf

jedoch launchd hat Ihre Login-Shell bereits gestartet. Der einfachste Weg, diese Änderungen wirksam werden zu lassen, besteht darin, unseren Computer neu zu starten. (Verwenden Sie >>, um an /etc/launchd.conf anzuhängen.)


27
2018-05-30 13:24



Könnten Sie dazu einen Link zur offiziellen Dokumentation hinzufügen? - Glyph
Alter, wenn das war nirgendwo dokumentiert, wird diese Seite nicht benötigt - Dave Cheney
Scheint nicht auf Snow Leopard zu funktionieren. - ismail
Irgendeine Idee, wie sich das unterscheidet sysctl.maxfiles? (verwandte Frage: apple.stackexchange.com/questions/33715/too-many-open-files) - keflavich
Kleine Korrektur: Du rennst echo unter sudo, aber versuchen, Ihre unprivilegierte Shell an die Datei anhängen zu lassen, zu der sie keine Berechtigung hat. Versuchen echo "limit maxfiles 1024 unlimited" | sudo tee -a /etc/launchd.conf stattdessen. - Vineet


sudo echo "limit maxfiles 1024 unlimited" >> /etc/launchd.conf

funktioniert nicht, weil sudo an der falschen Stelle ist, versuchen Sie Folgendes:

echo 'limit maxfiles 10000 unlimited' | sudo tee -a /etc/launchd.conf

4
2018-03-08 06:55



Dies wäre wahrscheinlich besser als eine "vorgeschlagene Bearbeitung" für die Antwort, auf die Sie sich beziehen. - Chris Johnsen


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

Jetzt muss ich herausfinden, warum es 2 Mittel gibt, Grenzen zu überprüfen / festzulegen ....


Okay - scheint so ulimit und sysctl geben Sie einen falsch-positiven Sinn, dass sie tatsächlich etwas tun - aber stattdessen scheinen sie zu sein nutzlos. Könnte jemand das überprüfen?


Okay, ich beginne zu verstehen. Ab Version 10.4 gibt es keine init Prozess mehr, es wurde durch ersetzt launchd, die auch mit einer PID von 1 läuft.

% ps -fu root
  UID   PID  PPID   C     STIME TTY           TIME CMD
    0     1     0   0   0:30.72 ??         0:46.72 /sbin/launchd

Und das ist natürlich erwähnenswert ulimit ist eine Muschel eingebaut, launchctl ist ein Shell-unabhängiges Programm.


2
2018-05-30 14:18





Wenn Sie unter OS X versuchen, die Softlimits für einen Daemon oder Prozess oder eine Task zu ändern, können Sie diese weichen Grenzen nicht durch Ändern der standardmäßigen Launchd-Konfiguration für ändern alles Prozesse, sondern indem Sie es für den Prozess festlegen, den Sie ausführen möchten.

Dies geschieht in Ihrer launchd .plist-Datei für Ihren Prozess.

Wenn Sie einen Daemon oder Prozess haben, für den Sie mehr geöffnete Dateien benötigen, erstellen Sie eine Plist-Datei und fügen Sie folgende Parameter hinzu:

    <key>SoftResourceLimits</key>
    <dict>
        <key>NumberOfFiles</key>
        <integer>1024</integer>
    </dict>

Ein Beispiel, das mongodb verwendet. Ich erstelle eine .plist-Datei namens org.mongo.mongodb.plist und speichere sie in /Library/LaunchDaemons/org.mongo.mongodb.plist. Die Datei sieht so aus:

<?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>Disabled</key>
  <false/>
  <key>Label</key>
  <string>org.mongo.mongod</string>
  <key>ProgramArguments</key>
  <array>
    <string>/usr/local/lib/mongodb/bin/mongod</string>
    <string>--dbpath</string>
    <string>/Users/Shared/mongodata/</string>
    <string>--logpath</string>
    <string>/var/log/mongodb.log</string>
  </array>
  <key>QueueDirectories</key>
  <array/>
  <key>RunAtLoad</key>
  <true/>
  <key>UserName</key>
  <string>daemon</string>
  <key>SoftResourceLimits</key>
  <dict>
    <key>NumberOfFiles</key>
    <integer>1024</integer>
    <key>NumberOfProcesses</key>
    <integer>512</integer>
  </dict>
</dict>
</plist>

Jetzt hat Ihr Prozess die Ressourcen, die er benötigt, ohne mit der globalen Konfiguration für das System zu misten. Dies wird automatisch beim Neustart eingerichtet. Oder, wenn Sie nicht neu starten möchten, können Sie ausführen

sudo launchctl load /Library/LaunchDaemons/org.mongod.plist

Wenn Ihr Prozess oder Ihre Aufgabe eher ein Agent als ein Daemon ist, können Sie die .plist stattdessen in / Library / LaunchAgents platzieren. Es gelten verschiedene Regeln dafür, wie launchd Ihren Prozess in beiden Fällen steuert. LaunchDaemons scheint für Prozesse reserviert zu sein, die von Launchd versuchen, jederzeit mitzuhalten.


2
2017-07-31 17:36





Folgendes sollte die meisten Lösungen auflö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 kann man unter OS X keine Grenzen mehr auf "unbegrenzt" setzen
  3. launchctl maxfiles sind durch sysctl maxfiles und daher kann sie nicht überschreiten
  4. sysctl scheint kern.maxfilesperproc von launchctl zu erben Max Dateien
  5. ulimit scheint den Wert 'open files' zu erben launchctl standardmäßig
  6. Sie können ein benutzerdefiniertes ulimit innerhalb von / etc / profile oder festlegen ~ / .Profil; Während dies nicht erforderlich ist, habe ich ein Beispiel angegeben
  7. Seien Sie vorsichtig, wenn Sie einen dieser Werte auf eine sehr hohe Zahl setzen, verglichen mit der Standardeinstellung - die Funktionen bestehen aus Stabilität / Sicherheit. Ich habe diese Beispielnummern, die ich für vernünftig halte, auf anderen Websites geschrieben.
  8. Wenn launchctl-Limits niedriger als die sysctl-Limits sind, gab es Berichte, dass die relevanten sysctl-Limits automatisch aufgestockt werden, um die Anforderungen zu erfüllen.

1
2017-12-03 12:13





Ich habe die Erfahrung gemacht, dass meine Aufgabe mit hoher Prozessanzahl nur erfolgreich war mit:

kern.maxproc=2500  # This is as big as I could set it.

kern.maxprocperuid=2048

ulimit -u 2048

Die ersten beiden können hineingehen /etc/sysctl.conf und der ulimit-Wert in launchd.conf für eine zuverlässige Einstellung.

Da tcp / ip ein Teil von dem war, was ich tat, musste ich auch aufstoßen

kern.ipc.somaxconn=8192

von seinem Standard 128.

Bevor ich die Prozessgrenzen erhöhte, bekam ich "Gabel" -Fehler, nicht genug Ressourcen. Bevor ich kern.ipc.somaconn erweiterte, bekam ich "defekte Pipe" -Fehler.

Dies war, während ich eine ordentliche Anzahl (500-4000) abgetrennter Prozesse auf meinem Monster Mac, OS 10.5.7, 10.5.8, jetzt 10.6.1 laufen ließ. Unter Linux auf dem Computer meines Chefs funktionierte es einfach.

Ich dachte, dass die Anzahl der Prozesse näher bei 1000 liegen würde, aber es scheint, dass jeder Prozess, den ich startete, eine eigene Kopie der Shell enthielt, zusätzlich zu dem eigentlichen Element, das die eigentliche Arbeit verrichtet. Sehr festlich.

Ich habe ein Display-Spielzeug geschrieben, das ungefähr so ​​aussieht:

#!/bin/sh

while[ 1 ]

do

    n=netstat -an | wc -l

    nw=netstat -an | grep WAIT | wc -l

    p=ps -ef | wc -l

    psh=ps -ef | fgrep sh | wc -l

    echo "netstat: $n   wait: $nw      ps: $p   sh: $psh"

    sleep 0.5

done

und beobachtete die maximale Anzahl von Prozessen in ps -ef und herumhängen in Netstat warten auf TIME_WAIT auslaufen ... Mit den gesetzten Grenzen sah ich 3500+ TIME_WAIT Artikel auf dem Höhepunkt.

Bevor ich die Grenzen erhöhte, konnte ich mich auf die Fehlerschwelle "schleichen", die unter 1K begann, aber auf einen hohen Wert von 1190 stieg. Jedes Mal, wenn es ins Scheitern geriet, könnte es nächstes Mal etwas mehr dauern zwischengespeichert, die bei jedem Fehler bis zum Limit expandierte.

Obwohl mein Testfall ein "Warten" als letzte Aussage hatte, gab es immer noch PLENTY von abgetrennten Prozessen, die herumhingen, nachdem es beendet wurde.

Ich habe die meisten Informationen, die ich verwendet habe, aus Postings im Internet erhalten, aber nicht alles war korrekt. Ihr Kilometerstand kann variieren.


1
2017-10-23 00:47





Shell-Grenzen

Ressourcen, die für die Shell und Prozesse verfügbar sind, können geändert werden durch ulimit Befehl, der zu Startskripten wie hinzugefügt werden kann ~/.bashrc oder ~/.bash_profile für einzelne Benutzer oder /etc/bashrc für alle Benutzer. Beispielzeile zum Hinzufügen:

ulimit -Sn 4096 && ulimit -Sl unlimited

Sehen: help ulimit und man bash für mehr Informationen.

Systemgrenzen

Im Allgemeinen werden Systemgrenzen durch gesteuert GestartetRahmen und kann durch geändert werden launchctl Befehl, z.B.

launchctl limit maxfiles 10240 unlimited

Um die Änderungen dauerhaft zu machen, müssen Sie eine Eigenschaftslistendatei spezifisch erstellen Starten Sie kompatible Ordner das als Startup-Agent fungiert.

Hier ist der Beispielbefehl, der eine solche Startdatei erstellt:

sudo /usr/libexec/PlistBuddy /Library/LaunchAgents/com.launchd.maxfiles.plist -c "add Label string com.launchd.maxfiles" -c "add ProgramArguments array" -c "add ProgramArguments: string launchctl" -c "add ProgramArguments: string limit" -c "add ProgramArguments: string maxfiles" -c "add ProgramArguments: string 10240" -c "add ProgramArguments: string unlimited" -c "add RunAtLoad bool true"

Die Datei würde jedoch beim Systemstart geladen werden, um manuell zu laden:

sudo launchctl load /Library/LaunchAgents/com.launchd.maxfiles.plist

Führen Sie folgende Schritte aus, um die aktuellen Grenzwerte zu überprüfen: launchctl limit.

Sehen: Erstellen von Startdämonen und -agenten.

Kernel-Grenzen

  • Kernellimits werden von der. Gesteuert sysctl Befehl.
  • Um die aktuellen Kernel-Limits anzuzeigen, führen Sie Folgendes aus: sysctl -a | grep ^kern.max.
  • Um das Maximum der Dateien zu ändern, die geöffnet werden dürfen, führen Sie Folgendes aus: sudo sysctl -w kern.maxfiles=20480.
  • Um die Änderungen dauerhaft zu machen, verwenden Sie die obige ähnliche Methode, um die Eigenschaftslistendatei im Systemstartordner zu erstellen.

Verbunden:


Veraltete Methoden

In früheren Versionen von macOS konnten Sie diese Grenzwerte einstellen /etc/sysctl.conf systemweit wie normalerweise unter Unix, scheint es jedoch nicht unterstützt zu werden.

Verwenden ~/.launchd.conf oder /etc/launchd.conf scheint, dass es auch in keiner existierenden Version von macOS unterstützt wird.Wiki

Das gleiche mit /etc/rc.local Startdatei wird auf Mac OS nicht unterstützt.


1
2017-07-29 13:48