MongoDB最大连接数设置失效的异常分析过程与解决方法

  • A+
所属分类:MongoDB

配景先容:

查询MongoDB设置装备摆设参数,可以知道关于最年夜衔接数的参数是maxConns。然则衔接实例后,查看支撑的最年夜衔接数,照样默认的819。

阐明:最年夜衔接数是由maxConn (maxIncomingConnections)和操作体系单个过程能打开的最年夜文件描写符数总量的80%决议的,取两个之间的最小值。默认单个过程能打开的最年夜文件描写符数为1024,1024*80% = 819.2 取整数819。以是最年夜可以支撑的并发衔接数为819。

案例重现

以下为本次测试MongoDB案例设置装备摆设的参数。

启动后查看最年夜衔接数。

运行敕令:db.serverStatus().connections

Current表现当前到实例上正在运行的衔接数。

Available表现当前实例还可以支撑的并发衔接数。

也便是说此实例最年夜能支撑的并发衔接数为:Current+available=3+816=819.

以是设置的maxConns参数无效。以是设置的maxConns参数无效!以是设置的maxConns参数无效!以是设置的maxConns参数无效!

谜底求索

此时查看查看网上相关材料,年夜部门集中在 Linux体系最年夜文件描写符数。查看我们体系设置装备摆设,此时已经是65535了。不是体系最年夜文件描写符数限定的了。

转个弯,由于我们是为操作体系是 centos 7 ,以是我们的mongodb服务是透过systemctl来治理的。那假如是经由过程service 敕令来治理此服务呢?

测试1 测试用service来治理mongodb 服务 对最年夜衔接数的影响

(1) 在/etc/init.d目次下创立名为mongodbtest0903的服务;

(2) 服务的设置装备摆设如下:

(3) 赋予执行权限,然后开启服务

(4) 此时查看衔接数为2500(为maxConns参数值)

(5) 封闭 mongodb 服务

以上阐明用service 来治理服务,最年夜衔接数参数起作用了。

测试2 假如直接用Mongodb command打开呢?

(1) 直接开启

(2)此时查看衔接数为2500(为maxConns参数值)

(3)封闭此服务

以上阐明直接开启Mongodb服务,最年夜衔接数参数起作用了。

经由过程service和 mongodb敕令启动服务,最年夜衔接数都是设置的参数,而经由过程systemctl来开启此服务就酿成了默认的819.

探讨

我们来详细阐发下systemctl 开启的 mongodb 服务(此服务界说为mongodbtest0903)。

(1)查看此服务的所有设置装备摆设细节的敕令

systemctl show mongodbtest0903.service

部门细节如下

此时 LimitNOFILE=4096

(2) 查看此服务的过程,以及此过程下的资本限定

过程的资本限定

终于看到了 资本限定是1024。

问题1:为什么颠末systemctl 启动的mongodb服务酿成了默认的819.

答复:由于systemctl 启动的服务过程其最年夜文件描写符数酿成了1024. 1024*80% = 819.2 取整数819.

问题2:为什么体系设置的最年夜是65525 而 systemctl 酿成了1024.

在Centos7体系中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的设置装备摆设作用域缩小了。/etc/security/limits.conf的设置装备摆设,只实用于经由过程PAM认证登任命户的资本限定,它对systemd的service的资本限定不生效。

实在细心查看/etc/security/limits.conf文件的注释,阐明了对体系服务不生效。

办理计划

办理计划,知道了问题地点,针对此问题探求办理计划相对容易了。

办理计划1:针对单个 systemctl 治理的服务。

在/lib/systemd/system中找到详细的服务,增长

# (open files)
LimitNOFILE=64000

敕令。 改动后为:

重启服务,此时衔接查看最年夜衔接数为2500,达到设置的参数。

办理计划2 网上有种计划是对systemd全局改动此计划本作者没有验证,转述如下,意思是改动/etc/systemd/system.conf 即可:

全局的设置装备摆设,放在文件/etc/systemd/system.conf和/etc/systemd/user.conf。 同时,也会加载两个对应的目次中的所有.conf文件/etc/systemd/system.conf.d/*.conf和/etc/systemd/user.conf.d/*.conf
此中,system.conf是体系实例使用的,user.conf用户实例使用的。一样平常的sevice,使用system.conf中的设置装备摆设即可。systemd.conf.d/*.conf中设置装备摆设会笼罩system.conf。

DefaultLimitCORE=infinity

DefaultLimitNOFILE=100000

DefaultLimitNPROC=100000

注意:改动了system.conf后,必要重启体系才会生效。

由于服务器上systemctl会治理多种服务,为削减对其它服务的影响,建议在单个服务上改动,集采纳第一种计划。

其他相关常识

(1)mysql 服务也会遇到相似问题;

(2)* nofiles - soft limit on the number of file descriptors a process may have;

(3)*soft limit与hard limit的分歧:soft limit是真正生效的限定值,而hard limit仅仅是soft limit调整规模的一个上限。

衔接数优化:

经由过程serverStatus查询衔接数:

mongo> db.serverStatus().connections

每个衔接都是一个线程,必要一个Stack,Linux下缺省的Stack设置一样平常比拟年夜:

shell> ulimit -a | grep stack stack size (kbytes, -s) 10240

至于MongoDB现实使用的Stack年夜小,可以用如下敕令确认(单元:K):

shell> cat /proc/$(pidof mongod)/limits | grep stack | awk -F 'size' '{print int($NF)/1024}'

假如Stack过年夜(好比:10240K)的话没故意义,简单对比敕令成果中的Size和Rss:

shell> cat /proc/$(pidof mongod)/smaps | grep 10240 -A 10

所有衔接耗费的内存加起来会相称惊人,保举把Stack设置小一点,好比说1024:

shell> ulimit -s 1024

注:从MongoDB1.8.3开端,MongoDB会在启动时主动设置Stack。

总结

以上便是这篇文章的全体内容了,愿望本文的内容对年夜家的进修或者事情具有必定的参考进修代价,假如有疑问年夜家可以留言交流,谢谢年夜家对剧本之家的支撑。

您可能感兴致的文章:

办理启动MongoDB差错:error while loading shared libraries: libstdc++.so.6:cannot open shared object file:关于Mongodb参数阐明与常见差错处置的总结Mongodb常见差错与办理办法小结(Mongodb中常常呈现的差错)MongoDB差错32-bit servers don''t have journaling enabled by default办理办法办理mongodb在ubuntu下启动失败,提醒couldn‘t remove fs lock errno:9 Bad file descriptor的差错mongodb差错tcmalloc: large alloc out of memory, printing stack and exiting办理方法MongoDB磁盘IO问题的3种办理办法Win10 安装 MongoDB 3.6.5 失败的问题及办理办法mongodb 3.4下长途衔接认证失败的办理办法MongoDb的"大众not master and slaveok=false"大众差错及办理办法

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: