macos node.js

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