2012-04-27 18 views
40

Recentemente ho ricevuto molto traffico sul mio sito che esegue Node.js. Con l'aumento del traffico ha iniziato a bloccarsi molto, cosa che non è mai accaduta prima. Ricevo il seguente errore nel mio registro:errore "connect EMFILE" 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) 

Chiunque abbia un'idea del perché si blocca? E idee su come risolverlo?

Sto usando Express.js e Socket.io. Funziona su Ubuntu.

+2

errore 'EMFILE' significa che il sistema operativo sta negando il programma per aprire più file/socket, dare un'occhiata a: http://stackoverflow.com/q/34588/511300 – stewe

+0

Grazie stewe! Cambiando ulimit l'ha risolto. – codekick

+0

Prego! È stato aggiunto come risposta, quindi puoi [accettare] (http://meta.stackexchange.com/a/5235/184785). – stewe

risposta

40

EMFILE errore significa che il sistema operativo sta negando il programma per aprire più file/socket.

Dai un'occhiata alla: How do I change the number of open files limit in Linux?

+9

L'aumento del limite del socket non risolverà comunque una perdita, ma manterrà la tua app in crash per un po 'di tempo. – jpillora

+0

@jpillora cosa suggerisci di prevenire la perdita? Ho esattamente lo stesso problema e non voglio sistemarlo aumentando ulimit perché, come hai scritto, è una soluzione temporanea. – Rob

+3

@Robert A volte aumentare l'ulimit è in realtà la soluzione, come se fosse a 256 e avevi traffico elevato, sebbene io sia il mio caso stavo ripetutamente aprendo file di vapori e mai chiudendoli, ho colto questa perdita con lsof -p . Se fallisce, puoi usare il modulo izaacs graceful-fs – jpillora

4

Nel mio caso, abbiamo già avuto ulimit impostato e kern.maxfiles configurazione più alto si potrebbe andare su un Mac.

Che cosa è stato risolto limitando il numero di socket max a livello globale. Nelle versioni successive del nodo il limite è Infinity.

Prova ad aggiungere queste righe di codice:

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

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

Nel caso di utilizzare la libreria richiesta, è possibile configurare queste impostazioni.

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

Qui è più sul maxSockets: https://nodejs.org/api/http.html#http_agent_maxsockets

2

EMFILE significa error maximum files che indica che il sistema operativo sta negando il vostro programma di aprire più descrittori di file.

Si noti che i file aperti nel sistema includono file su disco, named pipe, socket di rete e dispositivi aperti da tutti i processi.

Il sistema operativo specifica il limite di file aperti per processo.

Per controllare il limite di file aperti del sistema, utilizzare il comando ulimit -a. Generalmente su unix come sistema è impostato su 1024.

Se la limitazione era 1024, significa che è possibile aprire un massimo di 1024 file. se superi questo limite significa open, pipe e dup le chiamate di sistema non riusciranno e daranno errore EMFILE.

Quando si ottiene EMFILE indica principalmente la perdita nel codice. Aumentare l'ulimit a un valore più alto non è una buona soluzione in caso di perdite nel programma.

Si dovrebbe cercare di scoprire la causa della perdita. In seguito può essere utilizzato per eseguire il debug in UNIX come sistema operativo:

  1. lsof significa list open files comando dà la lista dei file aperti.Supponiamo che il tuo programma nodeJS stia avendo perdite per scoprire il numero totale di descrittori di file aperti dal tuo programma:

    lsof | nodo grep | wc -l

  2. per scoprire i descrittori di file per prese, uso:

    lsof -i -n -P | grep nodo

Usando questo siamo in grado di scoprire dove la perdita è e allora possiamo correggerlo.

Problemi correlati