为什么 MongoDB 连接数被用满了?

使用 MongoDB 时,可能会遇到因为 mongod 连接数用满了,导致客户端无法连接的问题。mongod的最大连接数通过 net.maxIncomingConnections 指定,默认值为1000000,相当于没有限制,生产环境强烈建议根据实际需求配置,以避免客户端误用导致 mongod 负载过高。

Mongod 为什么需要限制连接数?

Mongod 的服务模型是每个网络连接由一个单独的线程来处理,每个线程配置了1MB 的栈空间,当网络连接数太多时,过多的线程会导致上下文切换开销变大,同时内存开销也会上涨。

详细的分析参考 云数据库MongoDB为什么需要限制连接数?

Driver如何使用?

MongoDB 各个语言的Driver 基本都会封装包含一个 MongoClient 的对象(不同语言的 Driver 名字可能稍有不同),通常应用在使用时通过 MongoDB connection string URI 来构造一个全局的 MongoClient,然后在后续的请求中使用该全局对象来发送请求给Mongod。

应用使用的方式大致类似于

// 通常的用法

// global MongoClient object
mongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");

// request1
db1 = mongoClient.getDatabase("db1");
coll1 = db1.getCollection("coll1");
coll1.find({...})

// request2
db2 = mongoClient.getDatabase("db2");
coll2 = db2.getCollection("coll2");
coll2.update({...})

// requestN
...

通常每个 MongoClient 会包含一个连接池,默认大小为100,也可以在构造 MongoClient 的时候通过 maxPoolSize 选项来指定。

一种典型的错误使用方式是,用户为每个请求都构造一个 MongoClient,请求结束释放 MongoClient(或根本没释放),这样做问题是请求模型从长连接变成了短连接,每次短连接
都会增加『建立 tcp 连接 + mongodb鉴权』的开销,并且并发的请求数会受限于连接数限制,极大的影响性能;另外如果 MongoClient 忘记释放,会导致MongoClient 连接池里连接一直保持着,最终耗光所有的可用连接。

// 错误的用法
// request1
mongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");
db1 = mongoClient.getDatabase("db1");
coll1 = db1.getCollection("coll1");
coll1.find({...});
mongoClient.close();

// request2
mongoClient = new MongoClient("mongodb://root:****@host1:port1,host2:port2/admin?replicaSet=repl00& maxPoolSize=100");
db2 = mongoClient.getDatabase("db2");
coll2 = db2.getCollection("coll2");
coll2.update({...});
MongoClient.close()

// requestN
...

MongoClient 连接池配置多大合适?

通常 MongoClient 使用默认100的连接池(具体默认值以 Driver 的文档为准)都没问题,当访问同一个 Mongod 的源比较多时,则需要合理的规划连接池大小。

举个例子,Mongod 的连接数限制为2000,应用业务上有40个服务进程可能同时访问 这个Mongod,这时每个进程里的 MongoClient 的连接数则应该限制在 2000 / 40 = 50 以下 (连接复制集时,MongoClient 还要跟复制集的每个成员建立一条连接,用于监控复制集后端角色的变化情况)。

原文地址:https://www.cnblogs.com/williamjie/p/9305807.html

时间: 2024-08-08 01:36:09

为什么 MongoDB 连接数被用满了?的相关文章

MongoDB 连接数高产生原因及解决

MongoDB Sharding架构下连接数很容易达到很高,这里连接数分为几个概念: tcp 连接数 netstat可以统计的,一般这个是最高.如果mongod/mongos在同一台服务器,更明显. 参考命令:netstat -ant|awk ‘{print $5}’ |awk -F: ‘{print $1}’|sort |uniq -c|sort -rn mongos/mongod 连接数 mongostat/db.serverStatus()/connPoolStats可统计. 连接数多高算

mongodb连接数爆炸

1.每个数据库都有最大连接数(mongodb一样有): 2.解决连接数爆炸问题: 2.1.通过监控及早发现. 2.2.针对慢查询用KillOpen()杀掉.

MongoDB连接数与连接优化

默认每个连接数占用10M内存 ulimit -a 查看stack size MongoDB服务器内存要满足 connection overhead + data size + index size 即连接数开销+热点数据+索引 连接数太多的问题: 如果在日志中遇到类似如下的错误信息: ? 1 "too many open files" ? 1 "too many open connections"  则说明打开的连接数太多了,有两个限制mongod/mongos连接

Zabbix MongoDB监控

去年监控mongodb设置的模板,包括mongodb连接数,内存,复制延迟,是否Master的监控,下面是一些监控图形示例 我们还有一些触发器,比如mongodb实例是否可用,mongodb副本集的角色是否切换. 附件中是mongodb的模板文件,后台的脚本改日再行上传.

MongoDB与内存

来自  http://www.ttlsa.com/mongodb/mongodb-and-memory/# 但凡初次接触MongoDB的人,无不惊讶于它对内存的贪得无厌,至于个中缘由,我先讲讲Linux是如何管理内存的,再说说MongoDB是如何使用内存的,答案自然就清楚了.据说带着问题学习更有效,那就先看一个MongoDB服务器的top命令结果: 1 2 3 4 5 shell> top -p $(pidof mongod) Mem: 32872124k total, 30065320k us

MongoDB Shell 常用操作

数组查询 数组查询 MongoDB 中有子文档的概念,一个文档中能方便的嵌入子文档,这与关系性数据库有着明显的不同,在查询时,语法有一些注意点. 例子代码,假如我们的一个集合(tests)中存在标签键,有如下模式: tags: [ObjectId] 查询含有某个标签 ID 的文档 db.tests.find({tags: tagId}); 我现在有一组标签 tagIds,即是数组,需要查询含有该数组中任一元素的文档,此时需要用到 $in 操作符 db.tests.find({tags: {$in

java使用mongoDB和freemarker的注意事项

mongoDB和关系型数据库的区别最大的好处就在于表结构的不对称.弱事务,mongoDB牺牲了事务来换取更快的访问速度,有人说mongoDB对于内存太贪婪了,其实也不见得,以windows版为例它会默认开启100万个可用连接数,抢不抢内存要经过实践才能知道,以6核cpu为例mongoDB对内存的使用基本排不上号.虽然如此在驱动的提供这块mongoDB的驱动差异很大.如2.10版本的驱动连接数据库还可以使用Mongo但是后面的驱动却没有了Mongo,取而代之的则是MongoClient.mongo

Zabbix3.4监控mongodb状态

mongodb有db.serverStatus()命令,可以查看mongodb的运行状态,那么zabbix就可以调用这个命令实现mongodb的监控. 一.db.serverStatus()命令的使用 注:只有超级管理员账号才有权限使用此命令1.查看mongodb服务状态 echo "db.serverStatus()" | mongo --port 37485 -u username -p 'password' --authenticationDatabase 'admin' 2.查

非关系型数据库性能调优

Mongodb 1.Mongodb优化: a.语句优化可能通过Profile找到执行时间长的语句.db.getProfiling.Level()来获取profile级别 db.system.profile.find()查看profile记录. b.找到语句后,通过explain来解析这条语句,可以看到有没有使用索引,使用了什么索引?db.collection.find({xx:xx}).explain(); c.通过explain的结果来优化查询语句. 2.mongodb连接数: 如果大并发下,