【问题标题】:Mongodb Logs shows too many connections openMongodb 日志显示打开的连接过多
【发布时间】:2015-10-13 03:02:25
【问题描述】:

为什么 mongodb 日志显示打开的连接太多?它向我显示了超过最大连接限制和 db 中当前操作的数量。

在达到 819 限制后,我的主节点也拒绝创建更多连接。那个时候db当前的操作数少于819。提高ulimit暂时解决了我的问题,但是为什么没有利用空闲连接来服务请求呢?

【问题讨论】:

  • 你使用的是什么 mongodb 库?这听起来像是未能正确汇集连接。
  • 您能描述一下您的 MongoDB 设置(# 副本、分片?)以及正在运行的客户端数吗?另外,您的客户端上设置的连接池大小是多少?这将全部考虑在内。关于 ulimit,我建议阅读 MongoDB 生产说明页面以帮助正确设置您的环境(请参阅 docs.mongodb.org/manual/administration/production-notes
  • 我正在使用 1 个主要设置和一个副本辅助设置。四个 Web 应用程序正在使用 java 驱动程序 2.11.2 访问主应用程序。每个网络应用程序都有connectionsPerHost=100 和threadAllowedToBlockForConnectionMultiplier=20

标签: mongodb mongo-java


【解决方案1】:

我遇到了同样的问题。我的连接数一直在增长,直到达到 819,然后不​​再允许连接。

我正在使用 mongo-java-driver 版本 2.11.3。似乎可以解决该问题的是显式设置 MongoClient 的 connectionsPerHost 和 threadsAllowedToBlockForConnectionMultiplier 属性。在我没有自己设置这些值并接受默认值之前。

MongoClientOptions mco = new MongoClientOptions.Builder()
    .connectionsPerHost(100)
    .threadsAllowedToBlockForConnectionMultiplier(10)
    .build();
MongoClient client = new MongoClient(addresses, mco); //addresses is a pre-populated List of ServerAddress objects

在我的应用程序中,MongoClient 被定义为静态单例。

我正在查看 mongodb 日志,一旦应用程序达到 100 个打开的连接,我就没有看到客户端应用程序建立的任何连接。我正在运行一个副本集,所以你仍然可以看到内部连接正确关闭。

【讨论】:

  • 这对我有帮助。显然,如果您使用(我理解为通常建议的)静态单例模式为一个应用程序共享一个 Mongo 客户端,则这指定了池的最大连接数。
【解决方案2】:

来自 MongoDB 文档:

"如果您在 MongoDB 日志中看到大量的连接和重新连接消息,则表明客户端频繁地连接和断开与 MongoDB 服务器的连接。对于不使用请求池的应用程序(例如 CGI),这是正常行为. 考虑使用 FastCGI、Apache 模块或其他类型的持久应用服务器来减少连接开销。

如果这些连接不影响您的性能,您可以使用运行时 quiet 选项或命令行选项 --quiet 从日志中抑制这些消息。"

http://docs.mongodb.org/manual/faq/developers/#why-does-mongodb-log-so-many-connection-accepted-events

【讨论】:

  • 为什么我的主节点在 819 打开连接后拒绝连接,即使当前操作没有小于 819?为什么它不使用池中的连接?
【解决方案3】:

确保您使用的是最新的 mongodb 驱动程序。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-06-10
    • 1970-01-01
    • 2015-02-15
    • 2013-01-16
    相关资源
    最近更新 更多