1. 程式人生 > >MongoDB報Too many open files解決方法

MongoDB報Too many open files解決方法

lock 需要 byte pts ssi listen 是不是 sshd line

切記更改完成後要重啟服務才能生效。

最近用戶使用量不斷擴大,突然手機app提示網絡錯誤,經過排查發現是MongoDB數據掛了,先啟動服務,然後查看日誌
發現了

2019-05-06T09:51:36.626+0800 I NETWORK  [initandlisten] Listener: accept() returns -1 errno:24 Too many open files
2019-05-06T09:51:36.626+0800 E NETWORK  [initandlisten] Out of file descriptors. Waiting one second before trying to accept more connections.
2019-05-06T09:51:36.638+0800 F -        [conn3177] Got signal: 6 (Aborted).

具體錯誤應該是 Too many open files

然後發現設置的默認打開文件數是1024

[[email protected]]$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 31213
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited

open files (-n) 1024

pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 4096
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

現在就設置成65535

  • 1)修改當前交互終端的limit值
    查詢當前終端的文件句柄數: ulimit -n 回車,一般的系統默認的1024.
    修改文件句柄數為65535,ulimit -n 65535.此時系統的文件句柄數為65535.

  • 2)將ulimit 值添加到/etc/profile文件中(適用於有root權限登錄的系統)
    為了每次系統重新啟動時,都可以獲取更大的ulimit值,將ulimit 加入到/etc/profile 文件底部。
    echo ulimit -n 65535 >>/etc/profile
    source /etc/profile #加載修改後的profile
    ulimit -n #顯示65535,修改完畢!

  • 3)都以為大功告成了,可以突然發現自己再次登錄進來的時候,ulimit的值還是1024,這是為什麽呢?
    關鍵的原因是你登錄的用戶是什麽身份,是不是root用戶,由於服務器的root用戶權限很大,一般是不能用來登錄的,都是通過自己本人的登錄權限進行登錄,並通過sudo方式切換到root用戶下進行工作。 用戶登錄的時候執行sh腳本的順序:
    /etc/profile.d/file
    /etc/profile
    /etc/bashrc
    /mingjie/.bashrc
    /mingjie/.bash_profile

由於ulimit -n的腳本命令加載在第二部分,用戶登錄時由於權限原因在第二步還不能完成ulimit的修改,所以ulimit的值還是系統默認的1024。

解決辦法:
修改linux的軟硬件限制文件/etc/security/limits.conf.

在文件尾部添加如下代碼:
* soft nofile 10240
* hard nofile 10240

  • 4)經過以上修改,在有些系統中,用一般用戶再登陸,仍然沒有修改過來,那麽需要檢查是否有如下文件,如果沒有,則要添加如下內容:
# vim /etc/pam.d/sshd
[Add the line]
session required /lib/security/pam_limits.so
# service sshd restart

5)如果仍然不行,那麽需要修改如下文件:

# vim /etc/ssh/sshd_config
[May need to modify or add the line]
UsePrivilegeSeparation no

設置完成後登陸root用戶執行
ulimit -n檢查
在登陸普通用戶進行檢查
如果查看更改是否生效
[[email protected] bjjh]# ps -ef|grep mongo
root 1752 1 0 May05 ? 00:16:40 mongod -f /etc/mongod.conf
root 12887 11251 0 15:28 pts/1 00:00:00 grep mongo

[[email protected] bjjh]# cat /proc/1752/limits
Limit Soft Limit Hard Limit Units
Max cpu time unlimited unlimited seconds
Max file size unlimited unlimited bytes
Max data size unlimited unlimited bytes
Max stack size 10485760 unlimited bytes
Max core file size 0 unlimited bytes
Max resident set unlimited unlimited bytes
Max processes 61865 61865 processes
Max open files 1024 4096 files
Max locked memory 65536 65536 bytes
Max address space unlimited unlimited bytes
Max file locks unlimited unlimited locks
Max pending signals 61865 61865 signals
Max msgqueue size 819200 819200 bytes
Max nice priority 0 0
Max realtime priority 0 0
Max realtime timeout unlimited unlimited us

查看這個值是否更改成你設置的值,如果沒有的話可以重啟服務。

如何查看現在打開的文件數
[[email protected] bjjh]# ps -ef|grep mongo
root 1752 1 0 May05 ? 00:16:40 mongod -f /etc/mongod.conf
root 12887 11251 0 15:28 pts/1 00:00:00 grep mongo

[[email protected] bjjh]# cd /proc/1752/fd
[[email protected] fd]# ls |wc -l
102
查看打開文件數

MongoDB報Too many open files解決方法