即使在设置限制之后,MongoDB也会“打开太多文件”

当MongoDB启动时,即使在编辑/etc/security/limits.conf并将限制设置为unlimited之后,我也会遇到“太多文件”错误。

 Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.199+0100 I CONTROL [initandlisten] distarch: x86_64 Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.199+0100 I CONTROL [initandlisten] target_arch: x86_64 Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.199+0100 I CONTROL [initandlisten] options: { net: { port: 29000 }, security: { authorization: "enabled" }, storage: { dbPath: "/home/databases/mongo" }, systemLog: { quiet: true } } Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.235+0100 I - [initandlisten] Detected data files in /home/databases/mongo created by the 'wiredTiger' storage engine, so setting the active storage engine to 'wiredTiger'. Mar 09 18:29:13 ns524052 mongod[1298]: 2017-03-09T18:29:13.236+0100 I STORAGE [initandlisten] wiredtiger_open config: create,cache_size=37G,session_max=20000,eviction=(threads_max=4),config_base=false,statistics=(fast),log=(enabled=true,archive=true,path=journal,compressor=snappy),file_manager=(close_idle_time=100000),checkpoint=(wait=60,log_size=2GB),statistics_log=(wait=0), Mar 09 18:29:15 ns524052 mongod[1298]: 2017-03-09T18:29:15.676+0100 E STORAGE [initandlisten] WiredTiger (24) [1489080555:676881][1298:0x70e199ff3c80], file:collection-160--541918095290639536.wt, WT_SESSION.open_cursor: /home/databases/mongo/collection-160--541918095290639536.wt: handle-open: open: Too many open files Mar 09 18:29:15 ns524052 mongod[1298]: 2017-03-09T18:29:15.676+0100 I - [initandlisten] Invariant failure: ret resulted in status UnknownError: 24: Too many open files at src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp 79 

我的limits.conf包含了这个

 * soft nofile unlimited * hard nofile unlimited * soft nproc unlimited * hard nproc unlimited 

我也尝试使用ulimit没有运气。 不知道发生了什么事。 在Ubuntu 16.04上运行。

由于Ubuntu 16.04使用systemd ,所以您必须根据每个服务来调整ulimit设置。 为此,创build一个文件/etc/systemd/system/mongodb.service并覆盖默认值。

 root@xenial:~# cat /etc/systemd/system/mongodb.service [Service] LimitNOFILE=infinity LimitNPROC=infinity 

要检查是否应用了这些设置,可以使用systemctl show 。 首先,让我们看看活跃的值。

 root@xenial:~# systemctl --no-pager show mongodb.service | egrep 'NOFILE|NPROC' LimitNOFILE=1024 LimitNOFILESoft=1024 LimitNPROC=7839 LimitNPROCSoft=7839 

然后应用设置。

 root@xenial:~# systemctl daemon-reload root@xenial:~# systemctl --no-pager show mongodb.service | egrep 'NOFILE|NPROC' LimitNOFILE=18446744073709551615 LimitNOFILESoft=18446744073709551615 LimitNPROC=18446744073709551615 LimitNPROCSoft=18446744073709551615