2012-04-27 27 views
40

Recientemente recibí mucho tráfico a mi sitio que ejecuta Node.js. Con el tráfico creciente, ha comenzado a colapsar mucho, lo que no ha sucedido antes. Me sale el siguiente error en mi registro:error "connect EMFILE" en 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) 

Cualquier persona que tenga una idea de por qué se cuelga? ¿Y cómo resolverlo?

Estoy usando Express.js y Socket.io. Se ejecuta en Ubuntu.

+2

El error 'EMFILE' significa que el sistema operativo está negando su programa para abrir más archivos/sockets, eche un vistazo a: http://stackoverflow.com/q/34588/511300 – stewe

+0

Gracias stewe! Cambiar ulimit lo resolvió. – codekick

+0

¡De nada! Se agregó como una respuesta, por lo que puede [aceptar] (http://meta.stackexchange.com/a/5235/184785). – stewe

Respuesta

40

EMFILE error significa que el sistema operativo está denegando su programa para abrir más archivos/sockets.

Tenga una mirada en: How do I change the number of open files limit in Linux?

+9

Sin embargo, aumentar el límite de su socket no solucionará una fuga, solo evitará que su aplicación se bloquee por un tiempo más. – jpillora

+0

@jpillora ¿qué sugieres para evitar fugas? Tengo exactamente el mismo problema y no quiero solucionarlo incrementando ulimit porque, como escribiste, se soluciona temporalmente. – Rob

+3

@Robert A veces aumentar el ulimit es en realidad la solución, como si fuera a 256 y tuvieses mucho tráfico, aunque soy mi caso, repetidamente abrí archivos al vapor y nunca los cerré, capté esta fuga con lsof -p . Si eso falla, puede usar izaacs graceful-fs module – jpillora

4

En mi caso, que ya tenía el ulimit establece y kern.maxfiles configuración más alta que podría ir en un Mac.

Lo que solucionó fue la limitación del número máximo de sockets a nivel mundial. En versiones posteriores del nodo, el límite es Infinito.

Trate de añadir estas líneas de código:

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

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

En el caso de utilizar la biblioteca solicitud, usted puede configurar estos valores.

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

Aquí es más en maxSockets: https://nodejs.org/api/http.html#http_agent_maxsockets

2

EMFILEerror maximum files significa que indica que el sistema operativo está negando su programa para abrir más descriptores de fichero.

Tenga en cuenta que los archivos abiertos en el sistema incluyen archivos de disco, canalizaciones con nombre, conectores de red y dispositivos abiertos por todos los procesos.

Su sistema operativo especifica el límite de archivo abierto por proceso.

Para verificar el límite de archivos abiertos de su sistema, use el comando ulimit -a. Por lo general, en el sistema de tipo Unix está predeterminado en 1024.

Si la limitación fue 1024, significa que usted/proceso puede abrir un máximo de 1024 archivos. Si supera este límite, significa que open, pipe y dup las llamadas al sistema fallarán y producirán el error EMFILE.

Cuando obtiene EMFILE, en su mayoría indica la fuga en su código. Aumentar el ulimit a un valor más alto no es una buena solución en caso de que haya una fuga en su programa.

Debe intentar averiguar la causa de la fuga. Siguiendo se puede utilizar para depurar en UNIX como sistema operativo:

  1. lsof significa list open files comando da la lista de archivos abiertos.Suponga que su programa nodeJS tiene una fuga, para averiguar el número total de descriptores de archivos abiertos por su programa:

    lsof | nodo grep | wc -l

  2. para averiguar los descriptores de fichero para tomas de corriente, uso:

    lsof -i -n -P | grep nodo

El uso de este podemos descubrir dónde está la fuga y luego podemos corregirlo.

Cuestiones relacionadas