MongoDB文件句柄数限制
在实际使用mongodb时, 由于分表较多, 每个表又有若干索引. 当业务量起来时, 经常出现连接池socket连接断开的错误, 排查mongodb的日志, 发现基本都是"Too many open files"错误.
排查问题
-
查看当前文件的数量限制
[root@ip-172-16-1-149 rocky]# 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) 29303 max locked memory (kbytes, -l) 64 max memory size (kbytes, -m) unlimited open files (-n) 655350 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) 655350 virtual memory (kbytes, -v) unlimited file locks (-x) unlimited
重点看
open files
的值, 此处是655350, 理论上是够用的. -
查找到mongodb的进程
[root@ip-172-16-1-149 rocky]# ps -axu | grep mongod root 647090 2.9 11.3 3419876 860280 ? Sl 05:56 2:02 /usr/bin/mongod -f /etc/mongod.conf
-
查看mongodb进行的限制
[root@ip-172-16-1-149 rocky]# cat /proc/647090/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 8388608 unlimited bytes Max core file size 0 unlimited bytes Max resident set unlimited unlimited bytes Max processes 29303 29303 processes Max open files 1024 65535 files Max locked memory 65536 65536 bytes Max address space unlimited unlimited bytes Max file locks unlimited unlimited locks Max pending signals 29303 29303 signals Max msgqueue size 819200 819200 bytes Max nice priority 0 0 Max realtime priority 0 0 Max realtime timeout unlimited unlimited us
可以看到mongodb进程
open files
数量限制中, 被Soft Limit
限制为1024了 -
临时方案修改
[root@ip-172-16-1-149 rocky]# prlimit --pid 647090--nofile=65535:65535
再次通过查看
/proc/{pid}/limits
可以看到,open files
的限制都被修改为65535了. 但是这种方式只能针对这个mongodb进程临时生效, 当mongodb重启后又会恢复为之前的状态 -
永久方案修改
在实际操作时, 修改service信息没有生效, 暂时没有继续研究了, 后续可以参考以下文档进行测试