Mac OS中使用数据库时,并发太多时,经常会出现“open too many files”错误,该怎么办呢?
jerkzhang
通过提高操作系统对打开文件的最大限制,是可行的。
不过,最根本的是改变自己的代码方式,超过最大限制则意味着没有及时释放资源,或者本身这个库或模块就有这种缺陷;试着使用其他的方式来实现这个功能,比较从而得出最优的使用方式。
经验是:用某个数据库最基础、最健壮的API,而不要用相对看起来功能复杂的API,一般来说,作者会把八成精力放在最基础的API上,复杂的API功能虽然强大,使用起来也很方便,但无法保证该作者对该数据库的这个复杂的API做了足够的优化。(仅仅是经验而已,尤其偏僻的一些小众数据库会出现类似问题)
若能通过直接提高操作系统的上限来快速解决问题,其实这确实是最好的一种方式。从根源上解决问题,有时也不如从表面上解决问题。
东方不败
专否用户“冯纪忠雄”说的“sudo launchctl limit maxfiles 10240 10240”这种方法,我试了,有些时候是可以的,后来有一次遇到这类问题死活也解决不了,遂换了一种方式修改最大限制,如下所示使用ulimit命令即可,524288是随便写的,换成一个尽量大的整数即可。
ulimit -n 524288
冯纪忠雄
“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这个数字吧;不是经验之谈,只是直觉。