Mongorestore - Mac OS X - 打开文件过多

15

我试图将一个大型数据库的转储导入到我的本地mongodb实例中。

不幸的是,我发现在导入的其中一个集合中,mongo抛出了一个异常,提示打开的文件太多了。

我搜索了互联网强大的知识库,使用谷歌找到了一些使用ulimit和launchctl的解决方案,但它们并没有起作用。

最后我通过以下方式解决了这个问题:

  1. 我创建了/etc/launchd.conf文件,并添加了以下内容:

    limit maxproc 512 1024
    limit maxfiles 16384 32768
  1. 接下来,我在终端中执行以下命令行:

    sudo sysctl -w kern.maxfilesperproc=16384
    sudo sysctl -w kern.maxfiles=32768
  1. 最后,我重新启动了操作系统。

问题不再出现了,但我有一个问题。是否有一种方法可以从mongorestore级别限制打开的文件数?我认为增加全局的最大打开文件值并不是一个好方法。

5个回答

18

我使用这个别名来使用不同的环境设置启动mongod,并且目前为止它解决了所有问题:

ulimit -n 1024 && mongod


这帮助我在 macOS 11 上运行 mongod --repair,之前它会因“文件打开过多”而失败。 - jorisw

9

只在当前shell会话中更改限制要安全得多。如果您需要在每个bash控制台会话中都有它,则将其添加到您的bash配置文件也是一个选项。

ulimit -S -n 2048
your_whatever_greedy_command...

您可以使用其他值修改2048。 如果您的贪婪命令正在启动mongo,则为:

ulimit -S -n 2048 && mongod

(说明:此命令用于设置系统资源限制,以便mongodb进程在启动时能够使用更多的文件描述符。)


2

事实上,在OS-X上使用--numParallelCollections=1参数解决了我的问题,而无需修改系统设置。我能够完成之前不能完成的完整DB恢复。然而,它似乎会使连接池达到最大值,因为当尝试继续时,仍会出现以下错误: 2017-06-01T16:55:19.386+0800 E NETWORK [initandlisten] Out of file descriptors. Waiting one second before trying to accept more connections. 需要重新启动mongod


1
这对我没有任何作用。我仍然有太多打开的文件。 - Wylliam Judd

0

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

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

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


我也遇到了这个问题,只是有太多的命名空间,增加内核限制到那个级别只是为了能够为一个命令设置ulimit。在我看来,这似乎是一个bug:mongorestore在导入完成后应该关闭文件,这样应该就可以解决问题了。针对这个问题的建议是使用--numParallelCollection 1来解决(默认值为4)。 - FGM

0

你可以尝试重新启动机器,而非终端 shell,然后

ulimit -n 1024

我对此没有一个好的解释,但除非我重新启动操作系统,否则提供的解决方案将不起作用。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接