web-dev-qa-db-ja.com

開いているファイルが多すぎるためにmongoがクラッシュする

私は最近、mongo 3.4.11を実行しているUbuntu 14サーバーをUbuntu 16にアップグレードしました。同じバージョンのmongodb-orgをPPAから再インストールしましたが、mongoを起動すると、接続に応答しません。 /var/log/mongodb/mongodb.logにこのエラーが表示されます:

2018-02-06T18:40:15.680+0000 I CONTROL  [main] ***** SERVER RESTARTED *****
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] MongoDB starting : pid=15925 port=27017 dbpath=/var/lib/mongodb 64-bit Host=proddb1
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] db version v3.4.11
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] git version: 34f5bec2c9d827d71828fe858167f89a28b29a2a
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] OpenSSL version: OpenSSL 1.0.2g  1 Mar 2016
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] allocator: tcmalloc
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] modules: none
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] build environment:
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten]     distmod: ubuntu1604
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten]     distarch: x86_64
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten]     target_Arch: x86_64
2018-02-06T18:40:15.684+0000 I CONTROL  [initandlisten] options: { config: "/etc/mongodb.conf", net: { bindIp: "127.0.0.1" }, storage: { dbPath: "/var/lib/mongodb", engine: "wiredTiger", journal: { enabled: true } }, systemLog: { destination: "file", logAppend: true, path: "/var/log/mongodb/mongodb.log" } }
2018-02-06T18:40:15.684+0000 W -        [initandlisten] Detected unclean shutdown - /var/lib/mongodb/mongod.lock is not empty.
2018-02-06T18:40:15.709+0000 W STORAGE  [initandlisten] Recovering data from the last clean checkpoint.
2018-02-06T18:40:15.709+0000 I STORAGE  [initandlisten] 
2018-02-06T18:40:15.709+0000 I STORAGE  [initandlisten] ** WARNING: Using the XFS filesystem is strongly recommended with the WiredTiger storage engine
2018-02-06T18:40:15.709+0000 I STORAGE  [initandlisten] **          See http://dochub.mongodb.org/core/prodnotes-filesystem
2018-02-06T18:40:15.709+0000 I STORAGE  [initandlisten] wiredtiger_open config: create,cache_size=15574M,session_max=20000,eviction=(threads_min=4,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),verbose=(recovery_progress),
2018-02-06T18:40:16.468+0000 I STORAGE  [initandlisten] WiredTiger message [1517942416:468088][15925:0x7f4d31632d00], txn-recover: Main recovery loop: starting at 12168/128
2018-02-06T18:40:16.468+0000 I STORAGE  [initandlisten] WiredTiger message [1517942416:468689][15925:0x7f4d31632d00], txn-recover: Recovering log 12168 through 12169
2018-02-06T18:40:16.528+0000 I STORAGE  [initandlisten] WiredTiger message [1517942416:528271][15925:0x7f4d31632d00], txn-recover: Recovering log 12169 through 12169
2018-02-06T18:40:17.875+0000 E STORAGE  [initandlisten] WiredTiger error (24) [1517942417:875171][15925:0x7f4d31632d00], file:collection-43442-4253276309270751377.wt, WT_SESSION.open_cursor: /var/lib/mongodb/collection-43442-4253276309270751377.wt: handle-open: open: Too many open files
2018-02-06T18:40:17.875+0000 I -        [initandlisten] Invariant failure: ret resulted in status UnknownError: 24: Too many open files at src/mongo/db/storage/wiredtiger/wiredtiger_session_cache.cpp 95
2018-02-06T18:40:17.875+0000 I -        [initandlisten] 

***aborting after invariant() failure

これこれ のようないくつかの同様の質問を見てきましたが、どの解決策も私に影響を与えません。

Sudo nano /lib/systemd/system/mongodb.serviceを作成して追加してみました:

[Service]
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (open files)
LimitNOFILE=990000
# (processes/threads)
LimitNPROC=495000

しかし、再起動後、同じエラーが発生しました。

どうすれば修正できますか?

本当に奇妙なのは、mongo 3.4.10を搭載した別のUbuntu 16サーバーでこのデータベースのミラーを使用して開発してきたことです。この問題に遭遇したことはありません。私の/etc/mongod.confは両方のサーバーで同じですが、開発マシンでこのエラーが発生したことはありません。私はまだモンゴ政権に少し新しいです。このようなマイナーモンゴリリース間で、このような大きな非互換性があることは一般的ですか?

1
Cerin

エラーを確認しましたところ、Open file limit990000であることがわかりました。これは、mongosおよびmongodプロセスを開くのに十分です。 MongoDB BOLに従って ここ デフォルトのnet.maxIncomingConnectionsDefaultである必要があります:65536およびデフォルトではLimitNOFILEはbe ここLimitNOFILE = 64000

mongosまたはmongodが受け入れる同時接続の最大数。この設定は、オペレーティングシステムで構成されている最大接続追跡しきい値よりも高い場合は効果がありません。

このオプションには低すぎる値を割り当てないでください。通常のアプリケーション操作中にエラーが発生します。

これは、複数の接続を作成し、それらを閉じるのではなくタイムアウトさせるクライアントがある場合、mongosに特に役立ちます。

この場合、maxIncomingConnectionsを、クライアントが作成する接続の最大数または接続プールの最大サイズよりわずかに高い値に設定します。

Ramon Fernandezに従って、MongoDB jiraブログ ここWiredTigerには、少なくともtwo filesが必要ですcollection(1つはcollection data用、もう1つは_id index用)、およびコレクション内の追加のインデックスごとに1つのファイル。コレクションとインデックスの総数が多い場合は、それに応じて開いているファイルの制限を調整する必要があります。

MongoDBに従って推奨されるulimitLinux distributions using systemdの設定は

[Service]
# Other directives omitted
# (file size)
LimitFSIZE=infinity
# (cpu time)
LimitCPU=infinity
# (virtual memory size)
LimitAS=infinity
# (open files)
LimitNOFILE=64000
# (processes/threads)
LimitNPROC=64000

あなたの場合のように、それは990000,であり、ほとんどの展開に十分です。この制限には、システムレベルで高い値を設定してください。

さらにあなたの参照 ここここリソース制限ディレクティブ、同等のulimitシェルコマンドと使用される単位

2

Linuxシステムでは、1つのプロセスが開くことができるファイル記述子の数を、プロセスごとに1024に制限しています。 (この状態は、Solarisマシン、x86、x64、またはSPARCでは問題になりません)。 詳細

以下のコマンドを入力して変更します。

ulimit -n 1000000

または中に入る

/etc/security/limits.conf

永久に変更します。

0