macos - Error de NodeJS "EMFILE, demasiados archivos abiertos" en Mac OS
node.js (9)
Tu código está abriendo demasiados archivos. Por defecto, OS X tiene un límite de 256 archivos abiertos simultáneamente. Cuando su código requiere un nuevo módulo, el nodo tiene que abrir el archivo para leerlo. Si ya se encuentra en este límite, los requisitos del nodo no pueden continuar y arrojarán un error. Debe auditar los lugares de su aplicación donde está llamando a fs.open y asegurarse de que está cerrando correctamente todos esos archivos. También puede encontrar este problema si intenta hacer demasiadas lecturas simultáneas del sistema de archivos, ya que cada lectura pendiente será un archivo abierto. También he encontrado este problema al usar fs.watchFile, que también requiere abrir un identificador para el archivo.
Por algún tiempo estoy teniendo el siguiente error:
Error: EMFILE, too many open files ''/Users/blagus/Gallery/Websites/Nicsware/Pills/resources/core/auth.node.js''
at Object.fs.openSync (fs.js:427:18)
at Object.fs.readFileSync (fs.js:284:15)
at Object.Module._extensions..js (module.js:473:44)
at Module.load (module.js:356:32)
at Function.Module._load (module.js:312:12)
at Module.require (module.js:364:17)
at require (module.js:380:17)
at instController (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:79:31)
at init (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/mvc.node.js:57:8)
at route (/Users/blagus/Gallery/Websites/Nicsware/Pills/engine/dispatcher.node.js:268:36)
La línea de código que realiza la llamada a este archivo (mvc.node.js: 79) es
this.currentRoute.class = require( controllerFile )[dispatchClass].bind( this );
(es un marco que estoy creando)
Como puede ver, el archivo auth.node.js es llamado por REQUERIDO, por lo que las soluciones dadas con gracefullFS y similares no caben. Además, este problema solo ocurre en MacOS. En un Ubuntu parece funcionar bien.
¿Alguna idea?
tuve este error y el ulimit y launchclt no funcionó para mí,
esta solución de http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit funcionó para mí
echo kern.maxfiles=65536 | sudo tee -a /etc/sysctl.conf
echo kern.maxfilesperproc=65536 | sudo tee -a /etc/sysctl.conf
sudo sysctl -w kern.maxfiles=65536
sudo sysctl -w kern.maxfilesperproc=65536
ulimit -n 65536 65536
y luego poniendo el
ulimit -n 65536 65536
en ~ / .bashrc
aclamaciones
Hormiga
Ninguna de las otras respuestas funcionó para mí. Esto hizo el truco:
launchctl limit maxfiles 16384 16384
Además, esto no guarda en todas las sesiones, así que a menos que quieras ejecutarlo para cada sesión de terminal de bash, sugiero poner la línea anterior en tu ~ / .bashrc (o ~ / .zshrc si estás usando zsh) haciendo esto en la línea de comando:
vi ~/.bashrc
ulimit es genial si está usando el terminal, pero solo funciona si está ejecutando su aplicación desde la misma pestaña del terminal (o instancia de shell). Launchctl es genial, pero es para todo el sistema. Si deja Launchctl limit maxfile solo, el límite suave es 256 y el límite duro es ilimitado.
En un entorno de producción, es probable que deba iniciarse en el inicio y reiniciar en modo bloqueado, lo que significa que la mejor respuesta para Mac OSX es utilizar un archivo .plist para cada una de sus aplicaciones. Inicié mi aplicación de nodo utilizando dicho archivo plist (que se ejecuta al iniciar y reinicia después de bloquearse) ... dentro de este archivo puede establecer la cantidad de archivos por aplicación utilizando la tecla SoftResourcesLimit
.
<key>KeepAlive</key>
<true/>
<key>RunAtLoad</key>
<true/>
<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
<integer>16384</integer>
</dict>
Los archivos máximos se restablecieron a 256
en OS X 10.10.3 Yosemite. Esto puede ocasionar problemas con las instalaciones de npm. Puede verificar este límite desde la terminal con el comando ulimit -n
. Para cambiar esto más allá de 256
, necesita crear dos archivos de configuración.
El primer archivo de lista de propiedades /Library/LaunchDaemons/limit.maxfiles.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxfiles</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxfiles</string>
<string>65536</string>
<string>65536</string>
</array>
<key>RunAtLoad</key>
<true/>
<key>ServiceIPC</key>
<false/>
</dict>
</plist>
El segundo archivo de lista de propiedades /Library/LaunchDaemons/limit.maxproc.plist
:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple/DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>limit.maxproc</string>
<key>ProgramArguments</key>
<array>
<string>launchctl</string>
<string>limit</string>
<string>maxproc</string>
<string>2048</string>
<string>2048</string>
</array>
<key>RunAtLoad</key>
<true />
<key>ServiceIPC</key>
<false />
</dict>
</plist>
Establezca la propiedad y los derechos adecuados:
sudo chown root:wheel /Library/LaunchDaemons/limit.maxfiles.plist
sudo chown root:wheel /Library/LaunchDaemons/limit.maxproc.plist
sudo chmod 644 /Library/LaunchDaemons/limit.maxfiles.plist
sudo chmod 644 /Library/LaunchDaemons/limit.maxproc.plist
Establezca los límites deseados para el archivo de perfil bash ( .bashrc
o .bashprofile
o similar):
ulimit -n 65536
ulimit -u 2048
Asegúrate de que los derechos sean los mismos para el perfil de bash:
chmod 644 .your_bash_profile_file
Reinicie la computadora y verifique con ulimit -n
max files. Debería ser 65536
y debería poder cambiarlo debajo de eso.
Fuente: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X
Verifica tu ulimit. Por ejemplo, inicialmente mi ulimit en OSX era 256.
- Ejecute
ulimit -n
para ver el límite. - Luego puede
ulimit -n 1024
para establecer un límite superior.
La respuesta de awongh funcionó para mí
ulimit -n 10480
Pero solo después de iniciar un shell interactivo
sudo -i
Fuera del caparazón seguí recibiendo un error de permiso en OSX Yosemite
Puede resolver este problema aumentando el límite de maxfiles
:
launchctl limit maxfiles 16384 16384 && ulimit -n 16384