由於打開的文件過多,mongo 崩潰
我最近將執行 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 one和this 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 limit
是990000
. 這足以打開mongos
和mongod
處理。根據MongoDB BOL Here預設net.maxIncomingConnections
應該是Default
: 65536並且預設情況下LimitNOFILE應該是Here LimitNOFILE=64000。
mongos
將接受或mongod
將接受的最大同時連接數。如果此設置高於作業系統配置的最大連接跟踪門檻值,則此設置無效。不要給這個選項分配太低的值,否則你會在正常的應用程序操作過程中遇到錯誤。
mongos
如果您有一個創建多個連接並允許它們超時而不是關閉它們的客戶端,這對於 a 特別有用。在這種情況下,設置
maxIncomingConnections
為略高於客戶端創建的最大連接數或連接池的最大大小的值。根據MongoDB jira 部落格的Ramon Fernandez的說法,這里
WiredTiger
至少需要two files
每個collection
(一個用於 thecollection 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 Here和Here以及Resource limit 指令,它們的等效 ulimit shell 命令和使用的單位
Linux 系統將任何一個程序可以打開的文件描述符的數量限制為每個程序 1024 個。(這種情況在 Solaris 機器、x86、x64 或 SPARC 上不是問題)。 了解更多。
鍵入以下命令以更改它:
ulimit -n 1000000
或者進去
/etc/security/limits.conf
永久更改它。