博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
MongoDB之Too many open files
阅读量:5916 次
发布时间:2019-06-19

本文共 4802 字,大约阅读时间需要 16 分钟。

在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 files2019-01-31T22:18:26.744+0800 E STORAGE  [thread1] WiredTiger (24) [1548944306:744242][5485:0x7f03b00ea700], log-server: log server error: Too many open files2019-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) unlimited10 pending signals                 (-i) 728211 max locked memory       (kbytes, -l) 6412 max memory size         (kbytes, -m) unlimited13 open files                      (-n) 65535 linux操作系统对一个进程打开的文件句柄数量的限制(也包含打开的套接字数量),只是对用户级别的限制14 pipe size            (512 bytes, -p) 815 POSIX message queues     (bytes, -q) 81920016 real-time priority              (-r) 017 stack size              (kbytes, -s) 819218 cpu time               (seconds, -t) unlimited19 max user processes              (-u) 728220 virtual memory          (kbytes, -v) unlimited21 file locks                      (-x) unlimited

 

3. 查看某个进程已经打开的文件数

 

[root@hotcoin-mongodb-primary ~]# ps -ef|grep -i "[m]ongod" 查看进程ID,目前MongoDB的pid进程号是4842root 791 1 0 Jan31 ? 00:00:00 /sbin/dhclient -1 -q -lf /var/lib/dhclient/dhclient--eth0.lease -pf /var/run/dhclient-eth0.pid -H hotcoin-mongodb-primary eth0root 961 1 0 Jan31 ? 00:00:00 /sbin/dhclient -q -lf /var/lib/dhclient/dhclient--eth1.lease -pf /var/run/dhclient-eth1.pid -H hotcoin-mongodb-primary eth1mongod 4842 1 99 Jan31 ? 1-10:26:55 mongod -f /mongodb/27017/conf/mongo.conf[root@hotcoin-mongodb-primary ~]# cat /proc/4842/limits 查看4842进程号的相关的ulimit的信息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 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 655350 655350 processes Max open files 655350 655350 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 63471 63471 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us [root@hotcoin-mongodb-primary ~]# cat /proc/4842/limits |grep filesMax open files 655350 655350 files [root@hotcoin-mongodb-primary ~]# ll /proc/4842/fd | wc -l 查看4842进程打开了多少文件76977

 

4. 临时修改ulimit的文件限制

ulimit -SHn 10000

其实ulimit 命令身是分软限制和硬限制,加-H就是硬限制,加-S就是软限制。默认显示的是软限制,如果运行ulimit 命令修改时没有加上-H或-S,就是两个参数一起改变。

软限制和硬限制的区别?

硬限制就是实际的限制,而软限制是警告限制,它只会给出警告。

 

5. 永久生效

要想ulimits 的数值永久生效,必须修改配置文件/etc/security/limits.conf,在该配置文件中添加以下内容

 

1 * soft nofile 655352 * hard nofile 655353 echo "* soft nofile 65535"  >> /etc/security/limits.conf4 echo "* hard nofile 65535"  >> /etc/security/limits.conf5 * 表示所用的用户

 

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 65535010 mongod soft nofile 65535011 mongod soft nproc 65535012 [root@hotcoin-mongodb-primary ~]# cat /proc/sys/fs/file-max13 1610694

 说明:* 代表针对所有用户,noproc 是代表最大进程数,nofile 是代表最大文件打开数,"mongod soft nofile 655350"简单点理解就是mongod用户能打开的最大文件数量是655350。

 

8. MongoDB需要的最大文件打开数量计算-WiredTiger引擎

MongoDB的WiredTiger的工作原理跟MMAPv1不太一样,一个集合一个文件,一个索引一个文件。

所以一共有多少集合,至少就会有集合数量x2个打开文件(以1集合文件+1索引文件计算)被占用。

再考虑到网络连接数量,要保证足够大的open files值。

 

参考资料

 

 

 

转载于:https://www.cnblogs.com/ybyqjzl/p/10345828.html

你可能感兴趣的文章
Sublime Text 格式化代码快捷键
查看>>
C#百度关键字指数查询Socket实现
查看>>
JVM系列五:JVM监测&工具[整理中]
查看>>
疯狂的 Web 应用开源项目
查看>>
实用CSS3属性之 :target伪类实现Tab切换效果
查看>>
开涛spring3(6.9) - AOP 之 6.9 代理机制
查看>>
hdu 4775 Infinite Go(暴力)
查看>>
查看 SELinux状态及关闭SELinux
查看>>
程序员辞职申请 [职业生涯的第一份辞职书]
查看>>
程序员全国不同地区,微信(面试 招聘)群。
查看>>
HADOOP集群MAPREDUCE原理篇
查看>>
聊聊host中ip/域名映射记录的解析规则
查看>>
180620-mysql之数据库导入导出
查看>>
【干货】界面控件DevExtreme视频教程大汇总!
查看>>
在Fedora 15上使用Vmware Server 2.0.2
查看>>
oracle 按每天,每周,每月,每季度,每年查询统计数据
查看>>
正则表达式
查看>>
批处理文件bat清除.snv
查看>>
linux大于2t的硬盘分区gpt
查看>>
李飞飞团队提出视频事件描述新模型,附849小时数据集
查看>>