如何解决MongoDB中Toomanyopenfiles问题,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。
在Linux下有时会遇到cannot open /dev/urandom Too many open files的问题。其实Linux是有文件句柄限制的,而且Linux默认一般都是1024(阿里云主机默认是65535)。在生产环境中很容易到达这个值,因此这里就会成为系统的瓶颈,对于MongoDB来说,默认的文件打开数一般是不够的,需要使用ulimit去进行设置,以下是常见的MongoDB的最大打开文件数不足的报错。
-server: log pre-alloc server error: Too many open files 2019-01-31T22:18:26.744+0800 E STORAGE [thread1] WiredTiger (24) [1548944306:744242][5485:0x7f03b00ea700], log-server: log server error: Too many open files 2019-01-31T22:18:27.518+0800 E - [conn51828] cannot open /dev/urandom Too many open files
1. ulimt命令用途
1. 利用ulimit命令可以对资源的可用性进行控,Linux系统打开文件最大数量限制(进程打开的最大文件句柄数设置)。
2. -H选项和-S选项分别表示对给定资源的硬限制(hard limit)和软限制(soft limit)进行设置。
3. 硬限制(hard limit)一旦被设置以后就不能被非root用户修改,软限制(soft limit)可以增长达到硬限制(hard limit)。
4. 如果既没有指定-H选项也没有指定-S选项,那么硬限制(hard limit)和软限制(soft limit)都会被设置。
5. limit的值可以是一个数值,也可以是一些特定的值,比如:hard,soft,unlimited,分别代表当前硬件限制、当前软件限制、不限制。
6. 如果limit参数被省略,除非指定-H选项,否则资源当前的软限制(soft limit)将会被打印出来。
2. 查看文件最大打开数量限制
1 [root@redis-mysql ~]# cat /proc/sys/fs/file-max file-max(系统级别)是设置系统所有进程一共可以打开的最大文件数量。同时一些程序可以通过setrlimit调用,设置每个进程的限制。如果得到大量使用完文件句柄的错误信息,应该增加这个值 2 184337 3 [root@redis-mysql ~]# ulimit -n 查看用户级的限制,阿里云服务器一般是65535 4 65535 5 [root@redis-mysql ~]# ulimit -a 查看当前的各种用户进程限制 6 core file size (blocks, -c) 0 7 data seg size (kbytes, -d) unlimited 8 scheduling priority (-e) 0 9 file size (blocks, -f) unlimited 10 pending signals (-i) 7282 11 max locked memory (kbytes, -l) 64 12 max memory size (kbytes, -m) unlimited 13 open files (-n) 65535 linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量),只是对用户级别的限制 14 pipe size (512 bytes, -p) 8 15 POSIX message queues (bytes, -q) 819200 16 real-time priority (-r) 0 17 stack size (kbytes, -s) 8192 18 cpu time (seconds, -t) unlimited 19 max user processes (-u) 7282 20 virtual memory (kbytes, -v) unlimited 21 file locks (-x) unlimited
3. 查看某个进程已经打开的文件数
[root@hotcoin-mongodb-primary ~]# ps -ef|grep -i "[m]ongod"> 4. 临时修改ulimit的文件限制ulimit -SHn 10000 其实ulimit 命令身是分软限制和硬限制,加-H就是硬限制,加-S就是软限制。默认显示的是软限制,如果运行ulimit 命令修改时没有加上-H或-S,就是两个参数一起改变。软限制和硬限制的区别?硬限制就是实际的限制,而软限制是警告限制,它只会给出警告。 5. 永久生效要想ulimits 的数值永久生效,必须修改配置文件/etc/security/limits.conf,在该配置文件中添加以下内容 1 * soft nofile 65535 2 * hard nofile 65535 3 echo "* soft nofile 65535"> 6. 修改系统的总的限制其实上面的修改都是对一个进程打开的文件句柄数量的限制,我们还需要设置系统的总限制才可以。假如,我们设置进程打开的文件句柄数是1024 ,但是系统总线制才500,所以所有进程最多能打开文件句柄数量500。从这里我们可以看出只设置进程的打开文件句柄的数量是不行的。所以需要修改系统的总限制才可以。echo 6553560 > /proc/sys/fs/file-max上面是临时生效方法,重启机器后会失效;永久生效方法:修改 /etc/sysctl.conf, 加入fs.file-max = 6553560 重启生效 7. MongoDB中的设置-生产(nproc和nofile需要同时设置,不然登录会出现警告) 1 [root@hotcoin-mongodb-primary ~]# tail -10 /etc/security/limits.conf 2 3 # End of file 4 root soft nofile 655350 5 root hard nofile 655350 6 * soft nofile 655350 7 * hard nofile 655350 8 * soft nproc 655350 9 * hard nproc 655350 10 mongod soft nofile 655350 11 mongod soft nproc 655350 12 [root@hotcoin-mongodb-primary ~]# cat /proc/sys/fs/file-max 13 1610694 说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数,"mongod soft nofile 655350"简单点理解就是mongod用户能打开的最大文件数量是655350。 8. MongoDB需要的最大文件打开数量计算-WiredTiger引擎MongoDB的WiredTiger的工作原理跟MMAPv1不太一样,一个集合一个文件,一个索引一个文件。所以一共有多少集合,至少就会有集合数量x2个打开文件(以1集合文件+1索引文件计算)被占用。再考虑到网络连接数量,要保证足够大的open files值。 参考资料 Too many open files的四种解决办法linux中ulimit作用Linux-ulimit使用
看完上述内容,你们掌握如何解决MongoDB中Toomanyopenfiles问题的方法了吗?如果还想学到更多技能或想了解更多相关内容,欢迎关注亿速云行业资讯频道,感谢各位的阅读!
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。