在Mac OS上NodeJS错误“EMFILE,打开的文件太多”
有一段时间我有以下错误:
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 );
(这是我创build的框架)
正如你所看到的,文件auth.node.js被REQUIRE调用,所以给定的与gracefullFS和类似的解决scheme不适合。 此外,这个问题只适用于MacOS。 在Ubuntu似乎工作得很好。
有什么想法吗?
这对我工作:
ulimit -n 10480
在这里find
你可以通过增加maxfiles
限制来解决这个问题:
launchctl limit maxfiles 16384 16384 && ulimit -n 16384
我有这个错误,ulimit和launchclt没有为我工作,
从http://yabfog.com/blog/2014/10/22/yosemite-upgrade-changes-open-file-limit这个解决scheme为我工作;
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
干杯
ant
你的代码打开了太多的文件。 默认情况下,OS X限制为256个同时打开的文件。 当你的代码需要一个新的模块时,节点必须打开这个文件才能读取它。如果你已经在这个限制中,节点的require不能继续并且会抛出一个错误。 你应该在你的应用程序中调用fs.open的位置,并确保你正确地closures了所有这些文件。 如果您尝试执行太多的同步文件系统读取操作,则可能还会遇到此问题,因为每个挂起的读取操作都是打开的文件。 我在使用fs.watchFile时也遇到了这个问题,这也需要打开文件的句柄。
检查你的ulimit。 例如,最初我在OSX上的ulimit是256。
- 运行
ulimit -n
查看限制。 - 之后你可以用
ulimit -n 1024
来设置一个更高的限制。
没有其他答案为我工作。 这个诀窍:
launchctl limit maxfiles 16384 16384
另外要注意的是,这并不会保存在会话中,所以除非你想为每个bashterminal会话运行它,否则我build议把上面这行放在你的〜/ .bashrc(或者如果你使用zsh是〜/ .zshrc)在命令行:
vi ~/.bashrc
如果你正在使用terminal,ulimit是非常棒的,但是它只有在你从同一个terminal标签(或者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>
OS X 10.10.3优胜美地的最大文件被重置为256
。 这可能会导致npm安装出现问题。 你可以用命令ulimit -n
从terminal检查这个限制。 为了改变这个超过256
,你需要创build两个configuration文件。
第一个属性列表文件/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
将所需限制设置为bashconfiguration文件( .bashrc
或.bashprofile
或类似文件):
ulimit -n 65536 ulimit -u 2048
确保bashconfiguration文件的权限相同:
chmod 644 .your_bash_profile_file
重新启动计算机并检查ulimit -n
max文件。 它应该是65536
,你应该能够改变它下面的任何东西。
资料来源: http : //docs.basho.com/riak/latest/ops/tuning/open-files-limit/#Mac-OS-X
awongh的答案为我工作
ulimit -n 10480
但是只有在启动交互式shell之后
sudo -i
在shell之外,我一直在OSX Yosemite上遇到许可错误