2014-01-20 31 views
4

我试图将一个大型数据库的转储导入到我本地的mongodb实例中。Mongorestore - 打开的文件太多 - mac os x

不幸的是,我发现一个问题,对于一个导入的集合,mongo引发异常,太多的文件被打开。

我使用谷歌浏览了互联网的强大知识,并且发现了ulimit和launchctl的一些解决方案,但他们没有奏效。

最后我决定以下列方式问题:

  1. 我创建/etc/launchd.conf文件,并添加有这些行:

 
    limit maxproc 512 1024 
    limit maxfiles 16384 32768 
  • 接下来我在终端执行如下行:
  •  
        sudo sysctl -w kern.maxfilesperproc=16384 
        sudo sysctl -w kern.maxfiles=32768 
    
  • 最后我重新启动操作系统。
  • 问题不再发生,但我有问题。如果有一些解决方案来限制从mongorestore级别打开文件的数量?我不认为为最大打开的文件增加全局值是一个好方法。

    回答

    0

    没有一个MongoDB特定的命令行选项来限制打开的文件数mongorestoremongod。由于MongoDB使用内存映射文件,如果您有大量数据文件或连接,则可能会超出默认的操作系统限制。

    OS X特别为每个进程设置了256个打开文件的默认限制,而在大多数Linux发行版上,OS X的默认限制为1024或更高。有关资源利用率和限制的更多信息,请参阅MongoDB手册中的Resource Limits

    如果您需要打开大量文件,增加操作系统限制是解决问题的正确方法。如果您拥有大型数据库,则还应该避免使用MongoDB配置选项,因为此选项会增加给定数据集所需的打开文件数(通过减少每个数据文件允许的最大大小)。

    +0

    也有这个问题,有太多的命名空间,以增加内核的限制到那个水平只是为了能够为一个命令设置ulimit。这看起来像一个bug:mongorestore应该在完成导入时关闭文件,这应该只是删除问题。 对该票证的建议是使用--numParallelCollection 1,它可以解决问题(默认值为4)。 – FGM

    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

    +0

    这对我没有任何帮助。我仍然得到太多打开的文件。 –

    1

    我用这个别名来启动mongod的不同ENV设置要求,并解决任何问题至今:

    ulimit -n 1024 && mongod

    相关问题