Gibt es eine Korrektur für den Fehler "Zu viele offene Dateien im System" unter OS X 10.7.1?

191

Ich muss das lästige Limit "Zu viele offene Dateien im System" unter OS X 10.7.1 beseitigen. 

Gibt es einen Weg?

John Wilund
quelle
4
Möchten Sie mehr darüber erklären, wann dies geschieht? Unter welchen umständen
Slhck
1
@slhck - Ich habe das gleiche Problem. Die Umstände sind grundsätzlich "zufällig". Da ich ein Entwickler bin, benutze ich meinen Mac ziemlich häufig: eine oder mehrere Datenbanken, einen Webserver, Testtools, einen oder mehrere Browser und einen Musikplayer gleichzeitig. Google Chrome scheint ein Programm zu sein, in dem viele Dateien geöffnet sind.
Nathan Long
Eigentlich war meine "starke Beanspruchung" nicht das Problem; Meine Einstellungen für die maximale Anzahl offener Dateien für Kernal und Pro-Prozess lagen weit unter den Standardwerten.
Nathan Long
2
Wenn Sie Nathans Kommentar gelesen haben und sich gefragt haben, warum er keine Details zu den Standardeinstellungen angegeben hat, liegt dies daran, dass er alles in seiner Antwort unten dargelegt hat. (Schöne Antwort! :)
Olie
Ich habe die gleichen Verwendungsbedingungen wie Nathan Long und fand, dass der Neustart von Apache der einzige Schritt war, der das Problem "löste". Ich habe alle unten angegebenen Grenzwerterhöhungen angewendet, aber sie haben nicht sofort geholfen. Ich führe Kommandozeilen-PhpUnit-Tests> Selenserver> Firefox> Apache> Php> MySQL alle auf dem gleichen MacBook aus. Hat funktioniert, bis ich zu Außenseitern aufgestiegen bin. Der Fehler, den ich bekomme, liegt in der getesteten Web-App, dh, in PHP / Apache sind keine Dateien mehr verfügbar, sodass er vermutlich nicht von der Shell-Einstellung gesteuert wird.
Scipilot

Antworten:

225

Nach diesem hilfreichen Artikel (den ich zum Lesen empfehle):

Standardmäßig ist die maximale Anzahl von Dateien, die Mac OS X öffnen kann, auf 12.288 festgelegt, und die maximale Anzahl von Dateien, die ein bestimmter Prozess öffnen kann, beträgt 10.240.

Sie können dies überprüfen mit:

  • sysctl kern.maxfiles
  • sysctl kern.maxfilesperproc

Sie können die Limits (auf eigenes Risiko) erhöhen mit:

  • sysctl -w kern.maxfiles=20480 (oder welche Nummer auch immer Sie wählen)
  • sysctl -w kern.maxfilesperproc=18000 (oder welche Nummer auch immer Sie wählen)

Um die Änderung dauerhaft zu machen, verwenden Sie sudo, um Ihre Einstellungen zu speichern /etc/sysctl.conf(die Sie möglicherweise erstellen müssen):

kern.maxfiles=20480
kern.maxfilesperproc=18000

Hinweis: In OS X 10.10 oder niedriger können Sie die Einstellung /etc/launchd.conflike hinzufügen, limit maxfilesund alles, was Sie hier eingeben, wird überschrieben.

Wieder aus dem Artikel:

Sobald Sie dies getan haben, verfügt der Kernel selbst über eine maximale Anzahl von Dateien, die Shell jedoch möglicherweise nicht. Und da die meisten Prozesse, die so viele Dateien aufnehmen, von der Shell initiiert werden, möchten Sie diese erhöhen.

Der Befehl dafür lautet:

ulimit -S -n 2048 # or whatever number you choose

Diese Änderung ist auch vorübergehend; es dauert nur für die aktuelle Shell-Sitzung. Sie können es zu Ihrer Shell-Konfigurationsdatei ( oder was auch immer) hinzufügen .bashrc, .zshrcwenn Sie möchten, dass es bei jedem Öffnen einer Shell ausgeführt wird.

Nathan Long
quelle
1
Welches Limit gilt für Prozesse, die durch Klicken auf Symbole im Startbereich gestartet werden? Und wie kann man diese Grenze ändern? Wenn Sie "Shell" sagen, gehe ich davon aus, dass Sie eine interaktive Terminal-Shell meinen.
Cheeso
@Cheeso - Ich denke, dass das Gesamtsystemlimit (sysctl) oder das Launchd-Limit, je nachdem, welches niedriger ist, dies steuert.
Nathan Long
1
das erstellen einer /etc/launchd.conf mit inhaltslimit maxfiles 1000000 1000000 hat bei mir super funktioniert! (OSX 10.8.2 hier)
Zugwalt
1
Ich habe kern.maxfiles=65000 kern.maxfilesperproc=65000/etc/sysctl.conf eingegeben und neu gestartet. kern.maxfiles wurde ignoriert und blieb die Standardeinstellung, aber kern.maxfilesperproc wurde auf 65000 gesetzt. Ich habe keine /etc/launchd.conf, also was ist damit los?
Pferrel
2
Wenn jemand Probleme damit hat, dass max-Dateien nicht hängen bleiben, muss ein Leerzeichen nach der Zeile maxfiles gelöscht werden.
Jjathman
62

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. Erstellen Sie eine Datei unter /Library/LaunchDaemons/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
hat einwandfrei funktioniert, danke! In meinem Fall manifestierte sich der Fehler in einem Java-Prozess mit der MeldungIO Error: Bad file descriptor (Write failed)
agradl
1
Funktioniert auch auf El Capitan 10.11.6
Troy Daniels
kann das ulimit für shell immer noch nicht ändern. Das Maximum bleibt 1024, was auch immer ich tue
DataGreed
Führen Sie in Schritt 2 Folgendes aus: sudo chmod 600 /Library/LaunchDaemons/limit.maxfiles.plist sudo chown root /Library/LaunchDaemons/limit.maxfiles.plist
Hai Nguyen
32

Sie müssen Ihre ulimit-Einstellungen erhöhen - es ist heutzutage ziemlich niedrig unter OS X - standardmäßig 256. Fügen Sie ulimit -n 4096Ihr ~ / .profile oder ein gleichwertiges Element hinzu, um es in Ihrer lokalen Umgebung zu lösen. Führen Sie aus ulimit -a, um Ihre aktuellen Ebenen zu überprüfen

Führen Sie Folgendes aus, um die Systemeinstellungen anzuzeigen:

launchctl limit maxfiles

In Lion (10240) liegt sie pro Prozess deutlich höher als früher. Wenn Sie es dort jedoch immer noch treffen, können Sie es mit demselben Befehl mit den gewünschten Pegeln höher einstellen. Um die Änderungen dauerhaft zu machen, müssen Sie in /etc/launchd.conf die entsprechenden Zeilen hinzufügen.

Adam C
quelle
1
256? Es sind 2560 Dateideskriptoren für mich und ich habe sie nie geändert. Die Grenze liegt bei 266 Prozessen (vgl. ulimit -a).
Slhck
2
Das gleiche gilt für mich, 256 Dateien auf MacOS X Maverick
Climbatize
4
256 auch unter OS X Yosemite
Alexander
2
256 auch auf El Capitan.
TMN
1
256 in Yosemite.
Jaec
31

Eine andere Möglichkeit könnte sein, den Täter zu finden:

sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail

Beim letzten konnte man sehen, welche Dateien geöffnet sind:

sudo lsof -n | grep socketfil

Und beenden Sie den Vorgang, wenn Sie dies wünschen

kill $pid

Aus den Kommentaren:

Sie können auch eine Liste der Prozess-IDs mit den am häufigsten geöffneten Dateien abrufen

lsof -n | sed -E 's/^[^ ]+[ ]+([^ ]+).*$/\1/' | uniq -c | sort | tail
sanmai
quelle
Hilfreich! Aber unter OS X (10.11) funktioniert -h nicht. (Vielleicht -g?)
Robert Calhoun
Für mich funktionierte gut, nur ohne -h(OS X 10.12.3):sudo lsof -n | cut -f1 -d' ' | uniq -c | sort | tail
vearutop
Also sei es ohne-h
sanmai
Dies ist die einzige Antwort, die mir geholfen hat, mein Problem zu
lösen
1
Verwenden Sie lsof -n +c 0diese Option, um das Abschneiden des Prozessnamens zu verhindern.
Vaughan
9

Leute, auf Mavericks 10.9.4

ulimit -n 2048funktioniert gut. Möglicherweise müssen Sie eine neue Anmeldesitzung starten.

Clustermagnet
quelle
2

Für das neueste MacOS (zum Zeitpunkt des Schreibens: 10.14.1) können Sie verwenden sudo launchctl limit maxfiles 64000 524288(standardmäßig waren es 256), dies funktioniert jedoch nur innerhalb der aktuellen Sitzung. Verwenden Sie den launchctlJob von @ninjaPixel ( https://superuser.com/a/1171028/760235 ) für eine dauerhafte Lösung.

Dzmitry Hubin
quelle
Wie sind Sie auf die Nummer 524288 gekommen? Meine vorherigen Werte waren 256 und unbegrenzt.
Chip Roberson
1

Du kannst rennen

lsof -n

welcher Prozess zu viele Dateien öffnen.

dann töte es.

oder

sysctl -w kern.maxfiles=20480

ändere es in ein größeres.

Heilige Nacht
quelle
3
Bitte erläutern Sie, inwiefern sich diese Antwort von den bereits gegebenen unterscheidet.
Stephen Rauch
1

Nach allen Änderungen über meinem Java hat nicht mehr als 10000 Dateien gemacht. Lösung war dieses jvm-Flag -XX: -MaxFDLimit

Uros Velickovic
quelle
0

Ich bin darauf gestoßen, als ich ein chmod -R gemacht habe

# for each directory
find . -type d -exec chmod 755 {} \;
Michael
quelle
1
Dies mag zwar ein Workaround sein, scheint jedoch die Frage nicht wirklich zu beantworten. Vielleicht würde es Ihre Antwort verbessern, wenn Sie erklären, dass Sie die Nachricht nicht loswerden können, und dies dann als eine Möglichkeit vorschlagen, um sie weniger problematisch zu machen.
music2myear
0

Ähnlich wie https://superuser.com/a/1171028/367819

Führen Sie Folgendes aus, um die aktuellen Grenzwerte auf Ihrem Mac OS X-System zu überprüfen:

launchctl limit maxfiles

Die letzten beiden Spalten sind die weichen bzw. harten Grenzen.

Zum systemweiten Anpassen der Grenzwerte für geöffnete Dateien in Mac OS X Yosemite müssen Sie zwei Konfigurationsdateien erstellen. Die erste ist eine Eigenschaftslistendatei (auch bekannt als plist) in /Library/LaunchDaemons/limit.maxfiles.plist, die die folgende XML-Konfiguration enthält:

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

Dadurch wird das Limit für geöffnete Dateien auf 200000 festgelegt. Die zweite Plist-Konfigurationsdatei sollte in /Library/LaunchDaemons/limit.maxproc.plist mit folgendem Inhalt gespeichert werden:

<?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.maxproc</string>
      <key>ProgramArguments</key>
        <array>
          <string>launchctl</string>
          <string>limit</string>
          <string>maxproc</string>
          <string>2048</string>
          <string>2048</string>
        </array>
      <key>RunAtLoad</key>
        <true />
      <key>ServiceIPC</key>
        <false />
    </dict>
  </plist>

Beide plist-Dateien müssen im Besitz von root: wheel sein und über die Berechtigungen -rw-r - r-- verfügen. Diese Berechtigungen sollten standardmäßig vorhanden sein. Sie können jedoch sicherstellen, dass sie vorhanden sind, indem Sie sudo chmod 644 ausführen. Während die oben erläuterten Schritte dazu führen, dass systemweite Beschränkungen für geöffnete Dateien beim Neustart korrekt festgelegt werden, können Sie diese manuell anwenden, indem Sie launchctl limit ausführen.

Zusätzlich zum Festlegen dieser Grenzwerte auf Systemebene empfehlen wir, diese auch auf Sitzungsebene festzulegen, indem Sie die folgenden Zeilen an Ihre bashrc-, bashprofile- oder analoge Datei anhängen:

ulimit -n 200000
ulimit -u 2048

Wie die plist-Dateien sollte auch Ihre bashrc-Datei oder eine ähnliche Datei -rw-r - r-- Berechtigungen haben. Jetzt können Sie Ihren Computer neu starten und ulimit -n in Ihr Terminal eingeben. Wenn Ihr System richtig konfiguriert ist, sollten Sie sehen, dass maxfiles auf 200000 gesetzt wurde.


Sie können diesem Artikel für weitere Details folgen.

https://gist.github.com/tombigel/d503800a282fcadbee14b537735d202c


Denken Sie daran, Ihren Mac neu zu starten, damit die Werte wirksam werden.

angelokh
quelle
Entweder sollte der Beitrag als Duplikat markiert werden, wenn bereits eine Antwort vorliegt. Anderenfalls senden Sie die relevanten Informationen über einen Link, da der Link möglicherweise nicht für immer gültig ist.
zymhan