我将辅助副本集成员升级为wiredTiger。我已将它从MongoDB 2.6.3升级到3.0.4并将存储引擎更改为wiredTiger。现在它正在重新同步主数据库中的所有数据。 在某些时候收到以下错误,并且该过程重新开始:
2015-07-22T13:18:55.658 + 0000使用批量方法构建索引[rsSync]
2015-07-22T13:18:55.664 + 0000我完成了INDEX [rsSync]构建索引。共扫描了1591条记录。 0秒
2015-07-22T13:18:56.397 + 0000 E STORAGE [rsSync] WiredTiger(24)[1437571136:397083] [20413:0x7f3d9ed29700],file:WiredTiger.wt,session.create:WiredTiger.turtle:fopen: 打开的文件太多
2015-07-22T13:18:56.463 + 0000 E REPL [rsSync] 8 24:打开的文件太多
2015-07-22T13:18:56.463 + 0000 E REPL [rsSync]初始同步尝试失败,剩余9次尝试
同一台机器之前运行的是2.6.3版本,没有任何打开文件限制问题。我知道wiredTiger可能会创建更多的文件,所以它必须是它,但它是否会同时打开它们?
供参考:
cat / proc / sys / fs / file-max
10747371
在/etc/init.d/mongod中配置为:
ulimit -n 64000
根据文档,似乎mongo为每个数据文件保存文件描述符。与wiredTiger一样,这会导致每个集合的文件+每个索引的文件,根据我们的用例计算,可以加起来超过700K。
所以我可以将ulimit更改为700000或更高,但我想知道这是否是最正确的解决方案,以及存在哪些替代方案。
答案 0 :(得分:4)
WiredTiger将clean up open file descriptors根据他们闲置的时间长短,但是在大量集合和索引的繁重活动期间,您最终会受到打开文件的ulimit的限制。
所以,是的,基本上你需要增加限制,直到你不再遇到问题,坚持使用MMAPv1,或整合一些集合。我还建议提交一个功能请求,用您的样本编号概述您的用例,以防止出现这种类型的模式(例如,每个文件不止一个集合)。