错误场景
最近在开发React的前端微应用,启动时模块构建报错Module build failed, Error: EMFILE: too many open files,
如下图所示:
Error: EMFILE: too many open files的错误,经排查是因为单个微应用项目较大,发布过程中已经超过了mac默认的文件监听上限。通常这类错误的原因是因为linux或MacOS的文件句柄数不够导致。
解决方法
解决方式也比较简单,只要修改文件最大上限即可,注意这是临时修改,过了一段时间后,又会恢复到默认的大小。永久修改需要在配置文件中修改,我的临时修改也能满足需求了,就不改配置文件了。
修改 ulimit 命令默认的程序是 launchd.
首先打开终端,输入launchctl limit并回车,可以看到下图:
launchctl limit
我们再次输入sudo launchctl limit maxfiles 5000000 5000000并回车,这里会提示输入密码
sudo launchctl limit maxfiles 5000000 5000000
上限值改大点,输入密码即可
再次查看时,值已被更改
再次启动正常
扩展知识:
1、为什么会出现EMFILE,too many open files?
对文件系统进行大量并发调用,操作系统的文件描述符数量会被瞬间用光,抛出EMFILE,too many open files。
异步I/O和同步I/O的显著差距:同步I/O因为每个I/O都是彼此阻塞的,在循环体中,总是一个接着一个调用,不会出现耗用文件描述符太多的情况,同时性能也是低下的;
对于异步I/O,虽然并发容易实现,但是还是需要给予一定的过载保护,防止过分压榨底层系统的性能。
2、Too many open files是Linux、MacOS系统中常见的错误,从字面意思上看就是说程序打开的文件数过多,不过这里的files不单是文件的意思,也包括打开的通讯链接(比如socket),正在监听的端口等等,所以有时候也可以叫做句柄(handle),这个错误通常也可以叫做句柄数超出系统限制。引起的原因就是进程在某个时刻打开了超过系统限制的文件数量以及通讯链接数。
这里的file更准确的意思文件句柄(file handle),出现这个报错的大多数情况都是文件句柄(file handle)泄露,通俗的说就是文件句柄在不断的被打开,但是在使用完成之后却没有正常的关闭导致文件打开数不断的增加。
文件句柄泄露有多种原因,而不仅仅是打开文件,常见的来源有:套接字,管道,数据库连接,文件。正常情况下服务器本身是不会突然报这个错误的,一定是我们部署到云服务器上面的业务程序打开了太多文件没有关闭导致同时打开的文件数超出了系统的限制:
一种情况是程序本身就需要打开很多的文件句柄,这种情况就是打开的文件数大于系统本身的打开文件数限制,这时需要我们将系统的限制调高,就像上面给出的具体方法。
另外一种情况就是我们的程序存在文件句柄使用完成之后没有正常的关闭的情况,通常是网络连接没关闭,文件打开没关闭等等,这时就需要我们修复程序中的bug,确保打开的文件最后都会关闭,网络连接也会关闭。
参考文献
1、Nodejs中Error:EMFILE,too many open files的解决方案_keepupblw的博客-CSDN博客
2、linux 文件句柄数不够 Error: EMFILE: too many open files_Viogs的博客-CSDN博客
3、“too many open files”的原理和解决方案_富士康质检员张全蛋的博客-CSDN博客
4、mac OSX 下修改 ulimit 参数_mac limits.conf_江畔独步的博客-CSDN博客