Mongodb

由於打開的文件過多,mongo 崩潰

  • January 7, 2020

我最近將執行 mongo 3.4.11 的 Ubuntu 14 伺服器升級到 Ubuntu 16。我從他們的 PPA 重新安裝了相同版本的 mongodb-org,但是現在當我啟動 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

我見過一些類似的問題,例如this onethis one,但沒有一個解決方案對我有任何影響。

我嘗試創建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在兩台伺服器上甚至都一樣,但我的開發機器上從來沒有出現過這個錯誤。我對 mongo 管理還有些陌生。像這樣的次要 mongo 版本之間存在如此嚴重的不兼容性是否很常見?

我已經檢查了您的錯誤,並發現在您的情況下Open file limit990000. 這足以打開mongosmongod處理。根據MongoDB BOL Here預設net.maxIncomingConnections應該是Default: 65536並且預設情況下LimitNOFILE應該是Here LimitNOFILE=64000

mongos將接受或mongod將接受的最大同時連接數。如果此設置高於作業系統配置的最大連接跟踪門檻值,則此設置無效。

不要給這個選項分配太低的值,否則你會在正常的應用程序操作過程中遇到錯誤。

mongos如果您有一個創建多個連接並允許它們超時而不是關閉它們的客戶端,這對於 a 特別有用。

在這種情況下,設置maxIncomingConnections為略高於客戶端創建的最大連接數或連接池的最大大小的值。

根據MongoDB jira 部落格的Ramon Fernandez的說法,這里 WiredTiger至少需要two files每個collection(一個用於 the collection data,一個用於_id index),加上集合中每個附加索引的一個文件。如果集合和索引的總數很大,則需要相應地調整打開文件限制。

根據MongoDB 推薦的 ulimit設置Linux 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,,對於大多數部署來說這應該足夠了。請確保在系統級別為此限制設置一個較高的值。

為了進一步了解您的 ref HereHere以及Resource limit 指令,它們的等效 ulimit shell 命令和使用的單位

Linux 系統將任何一個程序可以打開的文件描述符的數量限制為每個程序 1024 個。(這種情況在 Solaris 機器、x86、x64 或 SPARC 上不是問題)。 了解更多。

鍵入以下命令以更改它:

ulimit -n 1000000

或者進去

/etc/security/limits.conf

永久更改它。

引用自:https://dba.stackexchange.com/questions/197328