web-dev-qa-db-ja.com

制限を設定した後でも、MongoDBが「開いているファイルが多すぎます」

MongoDBを起動すると、/etc/security/limits.confを編集して制限をunlimitedに設定した後でも、「too many files」エラーが表示されます。

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で実行されています。

5
inventor02

Ubuntu 16.04はsystemdを使用しているため、サービスごとにulimit設定を調整する必要があります。そのためには、ファイルを作成します/etc/systemd/system/mongodb.service.d/override.confとデフォルトを上書きします。

root@xenial:~# Sudo systemctl edit mongodb.service

それらを貼り付けます:

[Service]
LimitNOFILE=infinity
LimitNPROC=infinity

Ctrl + O、次にCtrl + Xで終了し、ファイル/etc/systemd/system/mongodb.service.d/override.confが作成されます

root@xenial:~# cat /etc/systemd/system/mongodb.service.d/override.conf
[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
4
Thomas

ユーザーの制限とは別に、カーネルで設定されている開かれたファイルの制限(正確には最大の開かれたファイル記述子の制限)があるかもしれません:

# sysctl -a |grep -i fs.file-max

で調整

# sysctl -w fs.file-max=<opened_file_new_limit>

カーネル設定が再起動後も存続するようにするには、ファイルを/etc/sysctl.dディレクトリに追加します。ファイルには.conf拡張子が必要で、内容は次のようになります。

fs.file-max=<opened_file_new_limit>

/etc/sysctl.dディレクトリに、これらの設定を上書きする可能性のある他のファイルがないかどうかも確認します。これを設定できる別のファイルがあります。/etc/sysctl.conf(/etc/systcl.dのファイルが読み取られない場合)次に/etc/sysctl.confを使用します)

これで問題は解決しました。

sysctl構成ドキュメント: https://www.freedesktop.org/software/systemd/man/sysctl.d.html

0
valdek