Knoten und Fehler: EMFILE, zu viele offene Dateien
Für einige Tage suchte ich nach einer funktionierenden Lösung um einen Fehler
Error: EMFILE, too many open files
Es scheint, dass viele Leute das gleiche problem haben. Die übliche Antwort umfasst die Erhöhung der Anzahl der Datei-Deskriptoren. So, ich hab das versucht:
sysctl -w kern.maxfiles=20480
Der Standardwert ist 10.240. Dies ist ein wenig seltsam, in meinen Augen, weil die Anzahl der Dateien, die ich bin-handling in das Verzeichnis ist unter 10240. Noch seltsamer, ich habe immer noch die gleiche Fehlermeldung erhalten, nachdem ich erhöht habe sich die Anzahl von Datei-Deskriptoren.
Zweite Frage:
Nach einigen Recherchen fand ich eine Arbeit, um für die "too many open files" problem:
var requestBatches = {};
function batchingReadFile(filename, callback) {
//First check to see if there is already a batch
if (requestBatches.hasOwnProperty(filename)) {
requestBatches[filename].push(callback);
return;
}
//Otherwise start a new one and make a real request
var batch = requestBatches[filename] = [callback];
FS.readFile(filename, onRealRead);
//Flush out the batch on complete
function onRealRead() {
delete requestBatches[filename];
for (var i = 0, l = batch.length; i < l; i++) {
batch[i].apply(null, arguments);
}
}
}
function printFile(file){
console.log(file);
}
dir = "/Users/xaver/Downloads/xaver/xxx/xxx/"
var files = fs.readdirSync(dir);
for (i in files){
filename = dir + files[i];
console.log(filename);
batchingReadFile(filename, printFile);
Leider habe ich noch immer erhalten die gleichen Fehler.
Was ist falsch an diesem code?
Eine Letzte Frage (ich bin neu in der javascript-und node), ich bin in den Prozess der Erstellung einer web -
Anwendung mit einer Menge von Anforderungen für über 5000 Benutzer pro Tag. Ich habe viele Jahre Erfahrung in der
Programmierung mit anderen Sprachen wie python und java. also ursprünglich dachte ich developp diese Anwendung mit django oder play framework. Dann entdeckte ich Knoten und ich muss sagen, dass die Idee der nicht blockierenden I/O Modell ist wirklich schön, verführerisch und vor allem sehr schnell!
Aber welche Probleme sollte ich erwarten, mit Knoten? Ist es eine Produktion bewährten web-server? Was sind Eure Erfahrungen?
InformationsquelleAutor der Frage xaverras | 2012-01-22
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn anmutig-fs funktioniert nicht... oder Sie wollen einfach nur, um zu verstehen, wo das Leck herkommt. Diesen Prozess zu Folgen.
(z.B. anmutig-fs ist nicht gonna reparieren Ihren Wagen, wenn Sie Ihr Problem mit sockets.)
Aus Meinem Blog-Artikel: http://www.blakerobertson.com/devlog/2014/1/11/how-to-determine-whats-causing-error-connect-emfile-nodejs.html
Wie Zu Isolieren
Dieser Befehl gibt die Anzahl der offenen handles für nodejs Prozesse:
lsof -i -n -P | grep nodejs
Bemerken: 1023u (Letzte Zeile) - das ist die 1024th handle der Datei, die die standardmäßige maximale.
Nun, Schauen Sie in die Letzte Spalte. Gibt an, welche Ressource geöffnet ist. Sie werden wahrscheinlich sehen, eine Reihe von Linien, alle mit demselben Ressourcen-Namen. Bleibt zu hoffen, dass jetzt erzählt Sie, wo in Ihrem code nach dem Leck.
Wenn Sie nicht wissen, mehrere Knoten Verfahren, zuerst die lookup-Prozess hat die pid-12211. Das wird Ihnen sagen, die verarbeiten.
In meinem Fall oben, ich bemerkte, dass es gab eine Reihe von sehr ähnlichen IP-Adressen. Sie waren alle
54.236.3.###
By doing ip-Adresse lookups, war in der Lage, um zu bestimmen, in meinem Fall war es pubnub Verwandte.Command Reference
Verwenden Sie die folgende syntax, um zu bestimmen, wie viele offene handles ein Prozess öffnet...
Um die Anzahl der geöffneten Dateien für eine bestimmte pid
Nutzte ich das Befehl zum testen der Anzahl der Dateien, die geöffnet wurden, nachdem Sie verschiedene Ereignisse in meinem app.
lsof -i -n -P | grep "8465" | wc -l
Was ist Ihr Prozess-limit?
ulimit -a
Die Zeile, die Sie wollen wird wie folgt Aussehen:
open files (-n) 1024
Dauerhaft ändern Sie den Grenzwert:
Im Falle dass, wenn Sie erwarten, es zu öffnen viele verbindungen (websockets ist ein gutes Beispiel), können Sie dauerhaft den Grenzwert erhöhen:
Datei: /etc/pam.d/common-session (an das Ende)
Datei: /etc/security/limits.conf (fügen Sie an das Ende, oder Bearbeiten, wenn bereits vorhanden)
starten Sie Ihren nodejs und logout/login aus ssh.
InformationsquelleAutor der Antwort blak3r
Mithilfe der
graceful-fs
Modul von Isaac Schlüter (node.js Betreuer) ist wahrscheinlich die am besten geeignete Lösung. Es macht inkrementelle back-off, wenn EMFILE ist aufgetreten. Es kann verwendet werden, als ein drop-in-Ersatz für den integriertenfs
Modul.InformationsquelleAutor der Antwort Myrne Stol
Ich lief in dieses problem heute, und finden keine gute Lösung für Sie, ich habe ein Modul, um es anzugehen. Ich war inspiriert von @fbartho das snippet, wollte aber vermeiden, das überschreiben der fs-Modul.
Modul ich geschrieben habe, ist Filequeueund Sie verwenden es genau wie fs:
InformationsquelleAutor der Antwort Trey Griffith
Du liest zu viele Dateien. Knoten liest Dateien asynchron, werde es Lesen, und alle Dateien auf einmal. Also bist du wahrscheinlich Lesen die 10240 begrenzen.
Sehen, ob das funktioniert:
InformationsquelleAutor der Antwort Tim P.
Ich gerade fertig mit schreiben, ein kleines code-snippet, dieses problem zu lösen mich, alle anderen Lösungen erscheinen übrigens auch im Schwergewicht und verlangen, dass Sie ändern Ihre Programmstruktur.
Diese Lösung nur Stände, alle fs.readFile oder fs.writeFile aufruft, so dass es nicht mehr als eine bestimmte Anzahl im Flug zu einem bestimmten Zeitpunkt.
InformationsquelleAutor der Antwort fbartho
Mit Dudelsack, müssen Sie nur ändern
=>
Den Dudelsack helfen, begrenzen Sie die parallele. mehr details: https://github.com/JacksonTian/bagpipe
InformationsquelleAutor der Antwort user1837639
Hatte das gleiche problem beim ausführen der nodemon - Befehl ein, so reduzierte ich die Namen der Dateien öffnen in sublime text und der Fehler verschwand.
InformationsquelleAutor der Antwort Buhiire Keneth
Wie alle von uns, Sie sind ein weiteres Opfer der asynchrone I/O. Mit asynchronen aufrufen, wenn Sie die Schleife, um eine Menge von Dateien, Node.js starten Sie zum öffnen einer Datei-Deskriptor für jede Datei zu Lesen und dann warten, bis Sie es schließen.
Datei-Deskriptor bleibt geöffnet, bis die Ressource verfügbar ist auf Ihrem server, um es zu Lesen. Auch wenn die Dateien klein sind und Lesen oder aktualisieren, ist schnell, es dauert einige Zeit, aber in der gleichen Zeit, die Ihre Schleife nicht beenden, um neue Dateien Deskriptor. Also, wenn Sie zu viele Dateien, die Grenze wird bald erreicht man ein schönes EMFILE.
Gibt es eine Lösung, die Schaffung einer Warteschlange, um diesen Effekt zu vermeiden.
Dank Leute, die schrieb Asynces ist eine sehr nützliche Funktion. Es gibt eine Methode namens Async.Warteschlangeerstellen Sie eine neue Warteschlange mit einem limit und dann fügen Sie Dateinamen in der Warteschlange.
Hinweis: Wenn Sie zum öffnen von vielen Dateien, wäre es eine gute Idee, um zu speichern, welche Dateien derzeit geöffnet sind und nicht erneut Sie unendlich.
Können Sie sehen, dass jede Datei zur Warteschlange Hinzugefügt (console.log-Dateiname), aber nur, wenn die aktuelle Warteschlange ist unter der Grenze, die Sie zuvor festgelegt haben.
async.queue Holen Sie sich Informationen über die Verfügbarkeit der Warteschlange durch einen Rückruf, dieser callback wird nur aufgerufen, wenn die Daten-Datei gelesen wird und jede Aktion, die Sie tun müssen, ist erreicht. (siehe Methode fileRead)
Damit Sie nicht überfordert werden, indem Dateien Deskriptor.
InformationsquelleAutor der Antwort Plaute
cwait ist eine Allgemeine Lösung für die Begrenzung der gleichzeitigen Ausführung von Funktionen, die Rendite verspricht.
In deinem Fall der code könnte etwa so Aussehen:
InformationsquelleAutor der Antwort jjrv
Ich bin nicht sicher, ob das wird helfen, jemand, ich arbeite an einem großen Projekt mit vielen Abhängigkeiten, die warf mir der gleiche Fehler. Mein Kollege schlug mir vor, zu installieren
watchman
mit brauen und dass es dieses problem für mich.InformationsquelleAutor der Antwort OwlyMoly