签到成功

知道了

CNDBA社区CNDBA社区

MongoDB 最大连接数 配置

2022-05-06 15:39 2223 1 原创 MongoDB
作者: dave

1 相关参数说明


查看MongoDB 的最大连接数:

[dave@www.cndba.cn_3 ~]# mongo --port 27018
MongoDB shell version v4.4.13
connecting to: mongodb://127.0.0.1:27018/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("c209ee6a-747b-44e1-a6b5-d50d922aeb68") }
MongoDB server version: 4.4.13
shard1:PRIMARY> db.serverStatus().connections
shard1:PRIMARY> use admin
switched to db admin
shard1:PRIMARY> db.auth('root','root')
1
shard1:PRIMARY> db.serverStatus().connections
{
        "current" : 51,
        "available" : 768,
        "totalCreated" : 945,
        "active" : 19,
        "exhaustIsMaster" : 16,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 147
}
shard1:PRIMARY>

这里显示的current + available 就是mongodb 的最大连接数。

http://www.cndba.cn/cndba/dave/article/107977

我们这里是 51 + 768 = 819个连接。

实际上MongoDB 数据库层面最大的连接数是受net.maxIncomingConnections 参数控制,该参数的默认值是65536。 也远比这里的819 多。

在Linux 的limits.conf 参数中,也有控制每个进程最大能打开的进程数。

[dave@www.cndba.cn_3 ~]# 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) 7268
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 102400
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) 7268
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
[dave@www.cndba.cn_3 ~]#

[dave@www.cndba.cn_3 ~]# ps -ef|grep mongod
root      1208   855  1 May04 ?        00:18:46 /usr/local/mongodb/bin/mongod -f /data/mongodb/etc/shard1.conf

[dave@www.cndba.cn_3 ~]# cat /proc/1208/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             7268                 7268                 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       7268                 7268                 signals
Max msgqueue size         819200               819200               bytes
Max nice priority         0                    0
Max realtime priority     0                    0
Max realtime timeout      unlimited            unlimited            us
[dave@www.cndba.cn_3 ~]#

我们可以看到这里能打开的最大文件数是1024。

Linux 处于保护的目的,只能拿出80%的句柄可以使用:

http://www.cndba.cn/cndba/dave/article/107977
http://www.cndba.cn/cndba/dave/article/107977

1024 * 0.8 = 819.2http://www.cndba.cn/cndba/dave/article/107977

所以我们上文查看mongoDB 的最大连接数就是这里受到了限制。 http://www.cndba.cn/cndba/dave/article/107977

所以,对于生产环境,我们在安装MongoDB 之前,还需要修改linux 的资源限制策略。

2 单机环境测试


查看2个系统配置参数:http://www.cndba.cn/cndba/dave/article/107977

[dave@www.cndba.cn_4 etc]# cat /etc/security/limits.conf|grep -v '^#'

* soft nofile 102400
* hard nofile 102400
[dave@www.cndba.cn_4 etc]#

[dave@www.cndba.cn_4 etc]# cat /etc/sysctl.conf |grep -v '^#'
vm.swappiness=0
fs.file-max=1024000
[dave@www.cndba.cn_4 etc]#


[dave@www.cndba.cn_4 etc]# ulimit -a
……
open files                      (-n) 102400
……

查看mongo 参数:

[dave@www.cndba.cn_4 etc]# ll
total 8
-rw-r--r-- 1 root root  340 May  1 11:47 mongo.conf
-rw------- 1 root root 1020 May  1 11:47 mongo.keyfile
[dave@www.cndba.cn_4 etc]# cat mongo.conf
systemLog:
  destination: file
  path: "/data/mongodb/logs/mongodb.log"
  logAppend: true
storage:
  journal:
    enabled: true
  dbPath: "/data/mongodb/data"
net:
  bindIp: 0.0.0.0
  port: 27017
security:
  keyFile: /data/mongodb/etc/mongo.keyfile
  authorization: "enabled"
processManagement:
  fork: true
replication:
  replSetName: rs0

我们这里并没有配置连接数限制。 默认也是65535.

[dave@www.cndba.cn_4 etc]# cat /proc/2344/limits
Limit                     Soft Limit           Hard Limit           Units
……
Max open files            102400               102400               files
……

实际上这里已经生效了:

http://www.cndba.cn/cndba/dave/article/107977

[dave@www.cndba.cn_4 etc]# mongo --port 27017
MongoDB shell version v4.4.13
> use admin
switched to db admin
> db.serverStatus().connections
> db.auth(
... 'root','root')
1
> db.serverStatus().connections
{
        "current" : 1,
        "available" : 81919,
        "totalCreated" : 15,
        "active" : 1,
        "exhaustIsMaster" : 0,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 0
}
> exit
bye
[dave@www.cndba.cn_4 etc]#

这里并没有问题:102400 * 0.8 = 81920。 所以可以看出,即使单机环境下DB上没有配置,也是可以生效的,以操作系统上的参数限制为准。

3 副本集环境测试


2个系统级别配置参数一样:

[dave@www.cndba.cn_1 etc]# cat /etc/security/limits.conf|grep -v '^#'

* soft nofile 102400
* hard nofile 102400
[dave@www.cndba.cn_1 etc]#

[dave@www.cndba.cn_1 etc]# cat /etc/sysctl.conf |grep -v '^#'
vm.swappiness=0
fs.file-max=1024000
[dave@www.cndba.cn_1 etc]#

参数也生效了:

[dave@www.cndba.cn_1 etc]# ulimit -a
……
open files                      (-n) 102400
……

但是DB 级别就是没有生效:

[dave@www.cndba.cn_1 ~]# mongo --port 27019
shard2:SECONDARY> use admin
switched to db admin
shard2:SECONDARY> db.auth('root','root')
1
shard2:SECONDARY> db.serverStatus().connections
{
        "current" : 42,
        "available" : 777,
        "totalCreated" : 187,
        "active" : 17,
        "exhaustIsMaster" : 15,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 29
}
shard2:SECONDARY>

查看进程限制,确实还是原来的默认值:

http://www.cndba.cn/cndba/dave/article/107977

[dave@www.cndba.cn_1 etc]# ps -ef|grep mongod
……
root      1218   859  0 May05 ?        00:06:11 /usr/local/mongodb/bin/mongod -f /data/mongodb/etc/shard2.conf
……
[dave@www.cndba.cn_1 etc]# cat /proc/1218/limits
Limit                     Soft Limit           Hard Limit           Units
……
Max open files            1024                 4096                 files
……

这里没有生效的原因还是Centos7系统中,使用Systemd替代了之前的SysV。/etc/security/limits.conf文件的配置作用域缩小了。/etc/security/limits.conf的配置,只适用于通过PAM认证登录用户的资源限制,它对systemd的service的资源限制不生效。

我们之前单机环境测试正常,是因为我们没有使用supervisor 进行管理。 Shard cluster 环境我们配置了supervisor管理进程。

Linux 进程管理工具 supervisor
https://www.cndba.cn/dave/article/107973

所以我们修改systemd的配置,修改/etc/systemd/system.conf 文件中的配置:

[dave@www.cndba.cn_2 ~]# cat /etc/systemd/system.conf|grep -v '^#'

[Manager]
DefaultLimitNOFILE=102400
[dave@www.cndba.cn_2 ~]#

参数生效的两种方法:http://www.cndba.cn/cndba/dave/article/107977

  1. 重启主机
  2. 执行 systemctl daemon-reexec

daemon-reexec 会重新执行systemd管理器,重新读取系统配置文件,而daemon-reload只会去读service部分的配置,不包含全局配置/systemd/system.conf,相当于重量级的daemon-reload.

然后重启supervisor 进程:

http://www.cndba.cn/cndba/dave/article/107977

[dave@www.cndba.cn_2 ~]# service supervisor stop
Redirecting to /bin/systemctl stop supervisor.service
[dave@www.cndba.cn_2 ~]# service supervisor start
Redirecting to /bin/systemctl start supervisor.service

修改生效:

[dave@www.cndba.cn_2 ~]# cat /proc/1211/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             7268                 7268                 processes
Max open files            102400               102400               files
Max locked memory         65536                65536                bytes
Max address space         unlimited            unlimited            bytes
Max file locks            unlimited            unlimited            locks




shard1:SECONDARY> db.auth('root','root')
1
shard1:SECONDARY> db.serverStatus().connections
{
        "current" : 43,
        "available" : 81877,
        "totalCreated" : 43,
        "active" : 17,
        "exhaustIsMaster" : 16,
        "exhaustHello" : 0,
        "awaitingTopologyChanges" : 16
}
shard1:SECONDARY>

版权声明:本文为博主原创文章,未经博主允许不得转载。

用户评论
* 以下用户言论只代表其个人观点,不代表CNDBA社区的观点或立场
dave

dave

关注

人的一生应该是这样度过的:当他回首往事的时候,他不会因为虚度年华而悔恨,也不会因为碌碌无为而羞耻;这样,在临死的时候,他就能够说:“我的整个生命和全部精力,都已经献给世界上最壮丽的事业....."

  • 2283
    原创
  • 3
    翻译
  • 579
    转载
  • 196
    评论
  • 访问:8169162次
  • 积分:4428
  • 等级:核心会员
  • 排名:第1名
精华文章
    最新问题
    查看更多+
    热门文章
      热门用户
      推荐用户
        Copyright © 2016 All Rights Reserved. Powered by CNDBA · 皖ICP备2022006297号-1·

        QQ交流群

        注册联系QQ