【问题标题】:NodeJS error "EMFILE, too many open files" on Mac OSMac OS 上的 NodeJS 错误“EMFILE,打开的文件太多”
【发布时间】:2013-11-14 15:03:01
【问题描述】:

有时我遇到以下错误:

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 中似乎工作得很好。

有什么想法吗?

【问题讨论】:

  • auth.node.js 是不是在做一些奇怪的事情?如果我在需要 JS 文件时生成堆栈跟踪,fs.* 不会出现。
  • 嗯,在 Linux 机器上它表现得很好。除此之外只是一个简单的要求,给我带来麻烦
  • 查看堆栈跟踪,问题不是由require 本身引起的,而是由您需要的模块引起的。再说一次,如果您不发布代码,那只是猜测...

标签: macos node.js


【解决方案1】:

这对我有用:

ulimit -n 10480

found here

【讨论】:

  • 如下 Ryan 所述。默认限制为 256。将其设置为 10480 可能是矫枉过正。逐步提高ulimit -n 360
  • 也谢谢 Lane :) 有人知道如何杀死进程或关闭打开的文件吗?
【解决方案2】:

你可以通过增加maxfiles的限制来解决这个问题:

launchctl limit maxfiles 16384 16384 && ulimit -n 16384

【讨论】:

  • 我不会投反对票,因为这个答案在技术上是正确的,但也非常危险,尤其是因为 Lion 的默认同时文件数量在 10000 个标记附近,因此在运行的机器上将限制设置得如此之低可以在一秒钟内使所有打开的程序无法使用。如果我们试图增加数量,我们建议使用 16384 而不是 2048
  • 好吧,这解决了我的问题,不再是Error: EMFILE, too many open files!谢谢你。另外,不确定我在做什么,但它有效。我很高兴知道这个问题背后的真正的问题,为什么节点会弹出这个错误消息。还是谢谢你。
  • 我同意伊戈尔;我不确定增加限制对于某些人来说是一个可以接受的答案,因为这是一个安全风险。我认为实际上在某些时候 gulp 需要“放开”文件流。一种方法是通过 shell 脚本链接您的一些 gulp 任务。是的,这看起来很奇怪,但是 gulp 的替代方法是什么?她将通过 npm run 或 npm 任务/脚本。
  • 你必须把sudo放在开头。在我添加 sudo 之前它没有用
  • 这似乎对我没有任何作用。
【解决方案3】:

我遇到了这个错误,并且 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

【讨论】:

  • 应该提到这是一个 hacky 解决方案,但是当您的本地机器运行不正常时可以提供帮助
【解决方案4】:

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

brew update
brew install watchman

【讨论】:

  • 这是唯一对我有用的,在 Catalina 10.15.1 上。
  • Catalina 10.15.3 也在这里——唯一有效的解决方案
  • 你能提供一些关于它是如何工作的上下文吗?发布两个安装命令没有帮助。
  • 嗨@Contrapak 顾名思义,它只监视文件和文档。如果有任何更改,则触发文件处理事件。请查看他们的 github repo 以获得更好的理解。 github.com/facebook/watchman
【解决方案5】:

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

【讨论】:

  • 你有任何资源来确保我正在做你提到的事情吗?我宁愿练习更好地使用 fs 而不是像其他人建议的那样只需要不断提高限制。
【解决方案6】:

检查您的 ulimit。例如,最初我在 OSX 上的 ulimit 是 256。

  • 运行ulimit -n 以查看限制。
  • 之后您可以ulimit -n 1024设置更高的限制。

【讨论】:

    【解决方案7】:

    其他答案都不适合我。这成功了:

    launchctl limit maxfiles 16384 16384 
    

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

    vi ~/.bashrc
    

    【讨论】:

      【解决方案8】:

      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>
      

      【讨论】:

        【解决方案9】:

        在 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 max files。它应该是65536,你应该可以在它下面进行任何更改。

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

        【讨论】:

          【解决方案10】:

          awongh 的回答对我有用

          ulimit -n 10480
          

          但只有在启动交互式 shell 之后

          sudo -i
          

          在 shell 之外,我在 OSX Yosemite 上不断收到权限错误

          【讨论】:

            【解决方案11】:

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

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

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 2018-04-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-16
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多