webentwicklung-frage-antwort-db.com.de

NodeJS-Fehler "EMFILE, zu viele offene Dateien" unter Mac OS

Irgendwann habe ich den folgenden Fehler:

Error: EMFILE, too many open files  '/Users/blagus/Gallery/Websites/Nicsware/Pills/resources/core/auth.node.js'
    at Object.fs.openSync (fs.js:427:18)
    at Object.fs.readFileSync (fs.js:284:15)
    at Object.Module._extensions..js (module.js:473:44)
    at Module.load (module.js:356:32)
    at Function.Module._load (module.js:312:12)
    at Module.require (module.js:364:17)
    at require (module.js:380:17)
    at instController  (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:79:31)
    at init (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:57:8)
    at route (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/dispatcher.node.js:268:36)

Die Codezeile, die den Aufruf dieser Datei (mvc.node.js: 79) vornimmt, lautet

    this.currentRoute.class = require( controllerFile )[dispatchClass].bind( this );

(es ist ein Rahmen, den ich schaffe)

Wie Sie sehen, wird die Datei auth.node.js von REQUIRE aufgerufen, sodass die angegebenen Lösungen mit gracefullFS und ähnlichem nicht passen. Außerdem betrifft dieses Problem nur MacOS. In einem Ubuntu scheint das ganz gut zu funktionieren.

Irgendwelche Gedanken?

47
blagus

Das hat für mich funktioniert:

ulimit -n 10480

hier gefunden

51
awongh

Sie können dieses Problem lösen, indem Sie das Limit maxfiles erhöhen:

launchctl limit maxfiles 16384 16384 && ulimit -n 16384
43

ich hatte diesen Fehler und das ulimit und launchclt funktionierte nicht für mich,

diese Lösung aus http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit arbeitete für mich

echo kern.maxfiles=65536 | Sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | Sudo tee -a /etc/sysctl.conf
Sudo sysctl -w kern.maxfiles=65536
Sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536

und dann die 

ulimit -n 65536 65536

in ~/.bashrc

prost

Ameise

18
aqm

Ihr Code öffnet zu viele Dateien. OS X hat standardmäßig eine Beschränkung von 256 gleichzeitig geöffneten Dateien. Wenn für Ihren Code ein neues Modul erforderlich ist, muss der Knoten die Datei öffnen, um sie einzulesen. Wenn Sie sich bereits an dieser Grenze befinden, kann die Anforderung des Knotens nicht fortgesetzt werden und es wird ein Fehler ausgegeben. Sie sollten Bereiche in Ihrer Anwendung überprüfen, an denen Sie fs.open aufrufen, und sicherstellen, dass Sie alle diese Dateien ordnungsgemäß schließen. Dieses Problem kann auch auftreten, wenn Sie versuchen, zu viele gleichzeitige Dateisystemlesevorgänge durchzuführen, da jeder ausstehende Lesevorgang eine offene Datei ist. Dieses Problem ist auch bei der Verwendung von fs.watchFile aufgetreten, das auch das Öffnen eines Handles für die Datei erfordert.

8
Ryan Patterson

Überprüfen Sie Ihr ulimit. Zum Beispiel war mein Ulimit unter OSX 256. 

  • Führen Sie ulimit -n aus, um das Limit zu sehen. 
  • Danach können Sie mit ulimit -n 1024 einen höheren Grenzwert festlegen.
5
Koray Güclü

Keine der anderen Antworten funktionierte für mich. Das hat den Trick:

launchctl limit maxfiles 16384 16384 

Beachten Sie auch, dass dies nicht über mehrere Sitzungen hinweg gespeichert werden kann. Wenn Sie es nicht für jede Bash-Terminalsitzung ausführen möchten, schlage ich vor, die obige Zeile in Ihren ~/.bashrc (oder ~/.zshrc, wenn Sie zsh verwenden) zu setzen in der Kommandozeile:

vi ~/.bashrc
4
John Culviner

ulimit ist großartig, wenn Sie das Terminal verwenden, aber es funktioniert nur, wenn Sie Ihre App auf derselben Terminal-Registerkarte (oder Shell-Instanz) ausführen. Launchctl ist großartig, aber systemweit. Wenn Sie Launchctl Limit Maxfile alleine lassen, ist das Soft-Limit 256 und das Hard-Limit ist unbegrenzt. 

In einer Produktionsumgebung müssen Sie wahrscheinlich beim Systemstart starten und nach einem Absturz neu starten. Dies bedeutet für Mac OSX die beste Lösung, eine .plist-Datei für jede Ihrer Anwendungen zu verwenden. Ich starte meine Knotenanwendung mit der plist-Datei (die beim Booten nach dem Absturz ausgeführt wird). In dieser Datei können Sie die Anzahl der Dateien pro Anwendung mit der Taste SoftResourcesLimit einstellen. 

<key>KeepAlive</key>
<true/>

<key>RunAtLoad</key>
<true/>

<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
  <integer>16384</integer>
</dict>
2
Squivo

Die maximale Anzahl von Dateien wurde in OS X 10.10.3 Yosemite auf 256 zurückgesetzt. Dies kann bei npm-Installationen zu Problemen führen. Sie können dieses Limit vom Terminal aus mit dem Befehl ulimit -n überprüfen. Um dies über 256 hinaus zu ändern, müssen Sie zwei Konfigurationsdateien erstellen. 

Die erste Eigenschaftslistendatei /Library/LaunchDaemons/limit.maxfiles.plist:

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

Die zweite Eigenschaftslistendatei /Library/LaunchDaemons/limit.maxproc.plist:

<?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>

Legen Sie den richtigen Besitz und die richtigen Rechte fest:

Sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
Sudo chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
Sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist
Sudo chmod 644 /Library/LaunchDaemons/limit.maxproc.plist

Legen Sie die gewünschten Grenzwerte für die Bash-Profildatei fest (.bashrc oder .bashprofile oder ähnlich):

ulimit -n 65536
ulimit -u 2048

Stellen Sie sicher, dass die Rechte für das Bash-Profil gleich sind:

chmod 644 .your_bash_profile_file

Computer neu starten und mit ulimit -n max Dateien prüfen. Es sollte 65536 sein und es sollte möglich sein, etwas darunter zu ändern.

Quelle: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X

1
Pekka

Ich verwende watchman. Welches diese Fehler für mich behoben. Einen Versuch wert!!!

brew update
brew install watchman
1
bh4r4th

die Antwort von awongh hat für mich funktioniert

ulimit -n 10480

Aber erst nach dem Start einer interaktiven Shell

Sudo -i

Außerhalb der Shell wurde bei OSX Yosemite immer ein Fehler angezeigt

0
withchuck

Bei anderen Fragen zum EMFILE-Fehler müssen Sie eine Warteschlange verwalten, um die Anzahl der gleichzeitig geöffneten Dateien zu begrenzen. Eine Erhöhung des Limits wird Ihr Problem nur verzögern.

Hier gibt es einige Antworten: node und Error: EMFILE, zu viele offene Dateien

0
Plaute