MongoDB报Too many open files解决方法

切记更改完成后要重启服务才能生效。linux

最近用户使用量不断扩大,忽然手机app提示网络错误,通过排查发现是MongoDB数据挂了,先启动服务,而后查看日志
发现了vim

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 filesbash

而后发现设置的默认打开文件数是1024服务器

[bjjh@database]$ 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

如今就设置成65535session

  • 1)修改当前交互终端的limit值
    查询当前终端的文件句柄数: ulimit -n 回车,通常的系统默认的1024.
    修改文件句柄数为65535,ulimit -n 65535.此时系统的文件句柄数为65535. app

  • 2)将ulimit 值添加到/etc/profile文件中(适用于有root权限登陆的系统)
    为了每次系统从新启动时,均可以获取更大的ulimit值,将ulimit 加入到/etc/profile 文件底部。
    echo ulimit -n 65535 >>/etc/profile
    source /etc/profile #加载修改后的profile
    ulimit -n #显示65535,修改完毕!ssh

  • 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。 ide

解决办法:
修改linux的软硬件限制文件/etc/security/limits.conf. ui

在文件尾部添加以下代码:
* 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检查
在登录普通用户进行检查
若是查看更改是否生效
[root@Oracle11G 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

[root@Oracle11G 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

查看这个值是否更改为你设置的值,若是没有的话能够重启服务。

如何查看如今打开的文件数
[root@Oracle11G 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

[root@Oracle11G bjjh]# cd /proc/1752/fd
[root@Oracle11G fd]# ls |wc -l
102查看打开文件数

相关文章
相关标签/搜索