socket - Error "connect EMFILE" en Node.js
socket.io chat rooms example (3)
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. Recibo el siguiente error en mi registro:
{ [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)
¿Alguien que tenga una idea de por qué se cuelga? ¿Y cómo resolverlo?
Estoy usando Express.js y Socket.io. Se ejecuta en Ubuntu.
En mi caso, ya teníamos el conjunto de ulimit y la configuración de kern.maxfiles más alta que podría tener una Mac.
Lo que lo solucionó fue limitar el número de enchufes máximos a nivel mundial. En versiones posteriores del nodo, el límite es Infinito.
Intente agregar 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 usar la biblioteca de solicitudes, puede configurar estas configuraciones.
Ver: https://github.com/request/request#request---simplified-http-client
Aquí hay más sobre maxSockets: https://nodejs.org/api/http.html#http_agent_maxsockets
EMFILE
error EMFILE
significa que el sistema operativo está negando su programa para abrir más archivos / sockets.
Eche un vistazo a: ¿Cómo cambio el número de archivos abiertos en Linux?
EMFILE
significa error maximum files
que indica que el sistema operativo está negando su programa para abrir más descriptores de archivos.
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 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 excede este límite, significa que open
llamadas al sistema open
, pipe
y dup
fallarán y producirán el error EMFILE.
Cuando obtienes EMFILE
en su mayoría indica la fuga en tu 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.
Deberías tratar de descubrir la causa de la fuga. A continuación se puede utilizar para depurar en Unix como el sistema operativo:
lsof
comandolsof
meaninglist open files
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
Para averiguar los descriptores de archivos para sockets, use:
lsof -n -i -P | nodo grep
Usando esto podemos averiguar dónde está la fuga y luego podemos corregirla.