2012-04-27 10 views
40

Ich habe vor kurzem eine Menge Verkehr auf meiner Website, die Node.js läuft erhalten. Mit dem zunehmenden Verkehr hat es viel angefangen zu stürzen, was vorher nicht passiert ist. Ich erhalte den folgenden Fehler in meinem Protokoll:"connect EMFILE" Fehler in Node.js

{ [Error: connect EMFILE] code: 'EMFILE', errno: 'EMFILE', syscall: 'connect' } 
Error: connect EMFILE 
    at errnoException (net.js:670:11) 
    at connect (net.js:548:19) 
    at net.js:607:9 
    at Array.0 (dns.js:88:18) 
    at EventEmitter._tickCallback (node.js:192:40) 

Wer hat eine Idee, warum es abstürzt? Und Ideen, wie man es löst?

Ich verwende Express.js und Socket.io. Es läuft auf Ubuntu.

+2

"EMFILE" Fehler bedeutet, dass das Betriebssystem Ihr Programm zu öffnen, weitere Dateien/Sockets zu verweigern, sehen Sie sich an: http://StackOverflow.com/q/34588/511300 – stewe

+0

Vielen Dank Stewe! Das Ändern von ulimit hat es gelöst. – codekick

+0

Gern geschehen! Habe es als Antwort hinzugefügt, damit du es akzeptieren kannst (http://meta.stackexchange.com/a/5235/184785). – stewe

Antwort

40

EMFILE Fehler bedeutet, dass das Betriebssystem Ihrem Programm den Start weiterer Dateien/Sockets verweigert.

Werfen Sie einen Blick auf: How do I change the number of open files limit in Linux?

+9

Wenn Sie Ihr Socket-Limit erhöhen, wird das zwar nicht behoben, aber Ihre App wird nur noch ein wenig länger abstürzen. – jpillora

+0

@jpillora Was schlagen Sie vor, Leck zu verhindern? Ich habe genau das gleiche Problem und ich möchte es nicht durch Erhöhung von ulimit beheben, weil es, wie du geschrieben hast, temporär repariert wird. – Rob

+3

@Robert Manchmal Erhöhung der ulimit ist eigentlich die Lösung, als ob es bei 256 war und Sie hatten viel Verkehr, obwohl ich in meinem Fall war ich wiederholt Dateidämpfe öffnen und nie schließen, fing ich dieses Leck mit lsof -p . Wenn das scheitert, können Sie izaacs graceful-fs-Modul verwenden – jpillora

4

In meinem Fall hatten wir bereits die ulimit gesetzt und kern.maxfiles Konfiguration höchste es auf einem Mac gehen könnte.

Was behoben wurde, war die Begrenzung der Anzahl der maximalen Sockets global. In späteren Versionen von Node ist das Limit Infinity.

versuchen, diese Zeilen Code hinzufügen:

var https = require('https'); 
var http = require('http'); 

https.globalAgent.maxSockets = 5; 
http.globalAgent.maxSockets = 5; 

Im Falle der Anforderung Bibliothek verwenden, können Sie diese Einstellungen konfigurieren.

See: https://github.com/request/request#request---simplified-http-client

ist hier mehr auf maxSockets: https://nodejs.org/api/http.html#http_agent_maxsockets

2

EMFILE bedeutet error maximum files was darauf hindeutet, dass das Betriebssystem das Programm verweigert mehr Dateideskriptoren zu öffnen.

Beachten Sie, dass geöffnete Dateien im System Disk-Dateien, Named Pipes, Netzwerk-Sockets und von allen Prozessen geöffnete Geräte enthalten.

Ihr Betriebssystem gibt den Grenzwert für geöffnete Dateien pro Prozess an.

Um das Limit für offene Dateien Ihres Systems zu prüfen, verwenden Sie den Befehl ulimit -a. Im Allgemeinen auf Unix-artiges System ist es standardmäßig 1024.

Wenn die Einschränkung war 1024, bedeutet, dass Sie/Prozess kann maximal 1024 Dateien öffnen. Wenn Sie diesen Grenzwert überschreiten, bedeutet dies, dass open, pipe und dup Systemaufrufe fehlschlagen und EMFILE-Fehler verursachen.

Wenn Sie EMFILE erhalten, zeigt es meistens das Leck in Ihrem Code an. Das Erhöhen des ulimit auf einen höheren Wert ist keine gute Lösung für den Fall, dass ein Leck in Ihrem Programm vorhanden ist.

Sie sollten versuchen, die Ursache für ein Leck zu finden. Im Anschluss kann in Unix verwendet werden, wie Betriebssystem zu debuggen:

  1. lsof Bedeutung list open files Befehl gibt eine Liste der geöffneten Dateien.Gehen Sie davon aus, dass Ihr nodeJS-Programm undicht ist, um die Gesamtzahl der von Ihrem Programm geöffneten Dateideskriptoren zu ermitteln:

    lsof | grep Knoten | wc -l

  2. Um die Datei-Deskriptoren für Steckdosen herausfinden, zu verwenden:

    lsof -n -i -P | grep Knoten

diese verwenden wir herausfinden können, wo das Leck ist und dann können wir es korrigieren.