在Mac OS上NodeJS错误“EMFILE,太多打开的文件”

时间:2013-11-14 15:03:02

标签: macos node.js

有时我遇到以下错误:

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)

调用此文件的代码行(mvc.node.js:79)是

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

(这是我正在创建的框架)

如您所见,文件auth.node.js由REQUIRE调用,因此具有gracefullFS和类似的给定解决方案不适合。此外,这个问题仅限于MacOS。在Ubuntu似乎工作正常。

有什么想法吗?

11 个答案:

答案 0 :(得分:53)

这对我有用:

ulimit -n 10480

found here

答案 1 :(得分:43)

您可以通过增加maxfiles限制来解决此问题:

launchctl limit maxfiles 16384 16384 && ulimit -n 16384

答案 2 :(得分:19)

我有这个错误,ulimit和launchclt对我没用,

来自http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit的此解决方案为我工作

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

然后把

ulimit -n 65536 65536

进入〜/ .bashrc

欢呼声

蚂蚁

答案 3 :(得分:8)

您的代码打开的文件太多了。默认情况下,OS X限制为256个同时打开的文件。当您的代码需要一个新模块时,节点必须打开该文件才能读取它。如果您已经处于此限制,则节点的要求无法继续并将引发错误。您应该在应用程序中审核调用fs.open的位置,并确保正确关闭所有这些文件。如果您尝试同时执行太多文件系统读取,则可能还会遇到此问题,因为每个挂起的读取都将是一个打开的文件。我在使用fs.watchFile时也遇到了这个问题,这也需要打开文件的句柄。

答案 4 :(得分:5)

Check your ulimit. For example initialy my ulimit on OSX was 256.

  • Run ulimit -n to see the limit.
  • Afterwards You can ulimit -n 1024 to set a higher limit.

答案 5 :(得分:4)

其他答案都不适合我。这就是诀窍:

launchctl limit maxfiles 16384 16384 

另外需要注意的是,这并不会在会话中保存,所以除非你想为每个bash终端会话运行它,否则我建议将上面的行放在〜/ .bashrc中(如果你使用的话,还是〜/ .zshrc) zsh)在命令行执行此操作:

vi ~/.bashrc

答案 6 :(得分:2)

如果您正在使用终端,ulimit非常棒,但只有在您从同一终端选项卡(或shell实例)运行应用程序时,它才有效。 Launchctl很棒但是系统范围很广。如果单独保留Launchctl limit maxfile,则软限制为256,硬限制为无限制。

在生产环境中,您可能需要在启动时启动并在崩溃时重新启动,这意味着Mac OSX的最佳答案是为每个应用程序使用.plist文件。我使用所述plist文件(在启动时运行并在崩溃后重新启动)启动我的节点应用程序...在此文件中,您可以使用SoftResourcesLimit键设置每个应用程序的文件数量。

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

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

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

答案 7 :(得分:1)

在OS X 10.10.3 Yosemite中,最大文件重置为256。这可能导致npm安装出现问题。您可以使用命令ulimit -n从终端检查此限制。要将此更改超出256,您需要创建两个配置文件。

第一个属性列表文件/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>

第二个属性列表文件/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>

设置适当的所有权和权利:

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

为bash配置文件(.bashrc.bashprofile或类似文件)设置所需的限制:

ulimit -n 65536
ulimit -u 2048

确保bash配置文件的权限相同:

chmod 644 .your_bash_profile_file

重新启动计算机并检查ulimit -n个最大文件。它应该是65536,你应该能够在它之下改变它。

  

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

答案 8 :(得分:1)

我正在使用watchman。这为我解决了这个错误。值得尝试!!!

brew update
brew install watchman

答案 9 :(得分:0)

awongh的回答对我有用

ulimit -n 10480

但仅在启动交互式shell之后

sudo -i

在shell之外,我一直在OSX Yosemite上获得权限错误

答案 10 :(得分:0)

对于有关EMFILE错误的其他问题,您必须管理一个队列以限制同时打开的文件数。增加限制只会延迟您的问题。

那里有一些回应:node and Error: EMFILE, too many open files