我尝试将大型数据库的转储导入我的本地mongodb实例。
不幸的是,我发现一个问题是,对于其中一个导入的集合,mongo抛出异常,打开了太多文件。
我使用谷歌了解了互联网的强大知识,我找到了一些ulimit和launchctl的解决方案,但它们没有用。
最后,我通过以下方式解决了问题:
limit maxproc 512 1024 limit maxfiles 16384 32768
sudo sysctl -w kern.maxfilesperproc=16384 sudo sysctl -w kern.maxfiles=32768
问题不再发生,但我有疑问。如果有一些解决方案来限制mongorestore级别打开的文件数量?我不认为增加max打开文件的全局值是一个好方法。
答案 0 :(得分:5)
我使用这个别名启动mongod使用不同的env设置,它解决了迄今为止遇到的任何问题:
ulimit -n 1024 && mongod
答案 1 :(得分:1)
确实--numParallelCollections=1
在OS-X上为我修复了这个问题,而没有修改系统设置。我能够完成以前没有完成的完整数据库恢复。
然而,它似乎最大化了连接池,因为我仍然得到
2017-06-01T16:55:19.386+0800 E NETWORK [initandlisten] Out of file descriptors. Waiting one second before trying to accept more connections.
当试图继续。需要重新启动mongod
答案 2 :(得分:1)
仅在当前Shell会话上更改限制更为安全。如果需要在每个bash控制台会话中都将它添加到bash配置文件中,也是一种选择。
ulimit -S -n 2048
your_whatever_greedy_command...
您可以用另一个值修改2048。
答案 3 :(得分:0)
没有特定于MongoDB的命令行选项来限制mongorestore
或mongod
打开的文件数。由于MongoDB使用内存映射文件,如果您有大量数据文件或连接,则可能超出默认的O / S限制。
OS X特别为每个进程设置了256个打开文件的默认限制,而在大多数Linux发行版中为1024或更高。有关资源利用率和限制的详细信息,请参阅MongoDB手册中的Resource Limits。
如果需要打开大量文件,增加O / S限制是解决问题的正确方法。如果您有一个大型数据库,也应该避免使用MongoDB smallFiles
配置选项,因为此选项会增加给定数据集所需的打开文件数(通过减少每个数据文件允许的最大大小)。 / p>