Mac OS中经常出现open too many files错误

Mac OS中使用数据库时,并发太多时,经常会出现“open too many files”错误,该怎么办呢?

喜欢这个问题 | 分享 | 新建回答

回答

jerkzhang

Aug 26, 2019
0 赞

通过提高操作系统对打开文件的最大限制,是可行的。

不过,最根本的是改变自己的代码方式,超过最大限制则意味着没有及时释放资源,或者本身这个库或模块就有这种缺陷;试着使用其他的方式来实现这个功能,比较从而得出最优的使用方式

经验是:用某个数据库最基础、最健壮的API,而不要用相对看起来功能复杂的API,一般来说,作者会把八成精力放在最基础的API上,复杂的API功能虽然强大,使用起来也很方便,但无法保证该作者对该数据库的这个复杂的API做了足够的优化。(仅仅是经验而已,尤其偏僻的一些小众数据库会出现类似问题)



若能通过直接提高操作系统的上限来快速解决问题,其实这确实是最好的一种方式。从根源上解决问题,有时也不如从表面上解决问题。



东方不败

Jul 18, 2019
0 赞

专否用户“冯纪忠雄”说的“sudo launchctl limit maxfiles 10240 10240”这种方法,我试了,有些时候是可以的,后来有一次遇到这类问题死活也解决不了,遂换了一种方式修改最大限制,如下所示使用ulimit命令即可,524288是随便写的,换成一个尽量大的整数即可。

ulimit -n 524288




冯纪忠雄

Jun 13, 2019
1 赞

“Open too many files”意思是超出了操作系统打开文件的上限,手动修改上限即可。首先看一下,上限是Mac OS中各类上限,如下所示,运行“launchctl limit”即可查看:

$ launchctl limit
	cpu         unlimited      unlimited      
	filesize    unlimited      unlimited      
	data        unlimited      unlimited      
	stack       8388608        67104768       
	core        0              unlimited      
	rss         unlimited      unlimited      
	memlock     unlimited      unlimited      
	maxproc     709            1064           
	maxfiles    256            unlimited

可以看见目前的最大可同时打开文件的上限是256,所以很容易超出,如下运行命令“sudo launchctl limit maxfiles 10240 10240”,将maxfiles的限制改成10240这个数字(sudo是为了使用管理员权限,记得输入密码):

$ sudo launchctl limit maxfiles 10240 10240

这样就修改成功,此刻再运行“launchctl limit”命令来查看系统上限:

$ launchctl limit
	cpu         unlimited      unlimited      
	filesize    unlimited      unlimited      
	data        unlimited      unlimited      
	stack       8388608        67104768       
	core        0              unlimited      
	rss         unlimited      unlimited      
	memlock     unlimited      unlimited      
	maxproc     709            1064           
	maxfiles    10240          10240 



一切总有一个极限,这由物理硬件决定;因此,不建议修改得太大,就用10240这个数字吧;不是经验之谈,只是直觉。