web-dev-qa-db-fra.com

Erreur NodeJS "EMFILE, trop de fichiers ouverts" sous Mac OS

Pendant quelque temps, j'ai l'erreur suivante:

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 ligne de code appelant ce fichier (mvc.node.js: 79) est

    this.currentRoute.class = require( controllerFile )[dispatchClass].bind( this );

(c'est un cadre que je crée)

Comme vous pouvez le constater, le fichier auth.node.js est appelé par une requête REQUIRE. Par conséquent, les solutions fournies avec gracefullFS et similaires ne s’intègrent pas. En outre, ce problème concerne uniquement MacOS. Dans un Ubuntu semble bien fonctionner.

Des pensées?

47
blagus

Cela a fonctionné pour moi:

ulimit -n 10480

trouvé ici

51
awongh

Vous pouvez résoudre ce problème en augmentant la limite maxfiles:

launchctl limit maxfiles 16384 16384 && ulimit -n 16384
43
K M Rakibul Islam

j'ai eu cette erreur et l'ulimit et le launchclt n'ont pas fonctionné pour moi,

cette solution de http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit a fonctionné pour moi

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

puis en mettant le 

ulimit -n 65536 65536

dans ~/.bashrc

à votre santé

Fourmi

18
aqm

Votre code ouvre trop de fichiers. Par défaut, OS X a une limite de 256 fichiers ouverts simultanément. Lorsque votre code nécessite un nouveau module, le noeud doit ouvrir le fichier pour le lire. Si vous êtes déjà à cette limite, la demande du noeud ne peut pas continuer et génère une erreur. Vous devez vérifier les emplacements de votre application où vous appelez fs.open et vous assurer que vous fermez correctement tous ces fichiers. Vous pouvez également rencontrer ce problème si vous essayez d'effectuer trop de lectures simultanées du système de fichiers, car chaque lecture en attente sera un fichier ouvert. J'ai également rencontré ce problème lors de l'utilisation de fs.watchFile, qui nécessite également l'ouverture d'un descripteur sur le fichier.

8
Ryan Patterson

Vérifiez votre ulimit. Par exemple, initialement, mon ulimit sous OSX était 256 

  • Exécutez ulimit -n pour voir la limite. 
  • Ensuite, vous pouvez ulimit -n 1024 pour définir une limite supérieure.
5
Koray Güclü

Aucune des autres réponses n'a fonctionné pour moi. Cela a fait le tour:

launchctl limit maxfiles 16384 16384 

Notez également que ceci n'enregistre pas toutes les sessions. Par conséquent, à moins que vous ne vouliez l'exécuter pour chaque session de terminal bash, je suggère de placer la ligne ci-dessus dans votre ~/.bashrc (ou ~/.zshrc si vous utilisez zsh) en ligne de commande:

vi ~/.bashrc
4
John Culviner

ulimit est idéal si vous utilisez le terminal, mais cela ne fonctionne que si vous exécutez votre application à partir du même onglet de terminal (ou instance de shell). Launchctl est génial mais concerne tout le système. Si vous laissez la limite maxfile Launchctl seule, la limite souple est 256 et la limite stricte est illimitée. 

Dans un environnement de production, vous devrez probablement lancer au démarrage et redémarrer en cas de plantage, ce qui signifie que la meilleure solution pour Mac OSX consiste à utiliser un fichier .plist pour chacune de vos applications. Je lance mon application de noeud en utilisant ledit fichier plist (qui s'exécute au démarrage et redémarre après une panne) ... dans ce fichier, vous pouvez définir le nombre de fichiers par application à l'aide de la clé SoftResourcesLimit

<key>KeepAlive</key>
<true/>

<key>RunAtLoad</key>
<true/>

<key>SoftResourceLimits</key>
<dict>
<key>NumberOfFiles</key>
  <integer>16384</integer>
</dict>
2
Squivo

Le nombre maximum de fichiers a été réinitialisé à 256 sous OS X 10.10.3 Yosemite. Cela peut entraîner des problèmes avec les installations npm. Vous pouvez vérifier cette limite depuis le terminal avec la commande ulimit -n. Pour changer cela au-delà de 256, vous devez créer deux fichiers de configuration. 

Le premier fichier de liste de propriétés /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>

Le deuxième fichier de liste de propriétés /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>

Définissez la propriété et les droits appropriés:

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

Définissez les limites souhaitées sur le fichier de profil bash (.bashrc ou .bashprofile ou similaire):

ulimit -n 65536
ulimit -u 2048

Assurez-vous que les droits sont les mêmes pour le profil bash:

chmod 644 .your_bash_profile_file

Redémarrez l'ordinateur et vérifiez avec les fichiers ulimit -n max. Ce devrait être 65536 et vous devriez pouvoir le changer en-dessous.

Source: http://docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X

1
Pekka

J'utilise watchman. Ce qui corrige ces erreurs pour moi. Ça vaut le coup d'essayer!!!

brew update
brew install watchman
1
bh4r4th

la réponse de awongh a fonctionné pour moi

ulimit -n 10480

Mais seulement après avoir démarré un shell interactif

Sudo -i

En dehors de Shell, je continuais à avoir une erreur d'autorisation sur OSX Yosemite

0
withchuck

Pour ce qui est des autres questions sur l'erreur EMFILE, vous devez gérer une file d'attente afin de limiter le nombre de fichiers ouverts en même temps. L'augmentation de la limite ne fera que retarder votre problème.

Il y a quelques réponses ici: node et Error: EMFILE, trop de fichiers ouverts

0
Plaute