我们使用这个监控我们的 mongoDB 连接数:
http://godoc.org/labix.org/v2/mgo#GetStats
但是,我们一直面临着一个奇怪的连接泄漏问题,即 connectionCount 每 10 秒持续增加 1 个打开的连接。 (这与是否有任何请求无关)。我可以在 localhost 中启动服务器,将其留在那里,什么也不做,连接计数仍会逐渐增加。连接数最终会增加到几千,然后它会杀死应用程序/数据库,我们必须重新启动应用程序。
这可能不足以让您进行调试。有没有人有任何想法,您过去处理过的连接泄漏。你是怎么调试的?我可以通过哪些方式对此进行调试。
我们已经尝试了一些东西,我们扫描了我们的代码库,寻找任何可以打开连接并将计数器/调试语句放在那里的代码,到目前为止我们没有发现任何泄漏。这几乎就像图书馆某处发生泄漏。
这是我们一直在研究的分支中的一个错误,并且已经有数百次提交。我们已经在 this 和 master 之间进行了比较,但找不到此分支中存在连接泄漏的原因。
例如,我正在引用的数据集:
Clusters: 1
MasterConns: 9936 <-- creeps up 1 per second
SlaveConns: -7359 <-- why is this negative?
SentOps: 42091780
ReceivedOps: 38684525
ReceivedDocs: 39466143
SocketsAlive: 78 <-- what is the difference between the socket count and the master conns count?
SocketsInUse: 1231
SocketRefs: 1231
MasterConns 是每 10 秒爬升一个的数字。我不完全确定其他数字的含义。
最佳答案
MasterConns
无法告诉您是否存在泄漏,因为它不会减少。该字段指示自上次统计信息重置以来建立的连接数,而不是当前正在使用的套接字数。后者由 SocketsAlive
字段指示。
为了让您对这个主题有更多的了解,mgo 套件中的每个测试都围绕逻辑进行包装,以确保统计数据在测试完成后显示合理的值,这样潜在的泄漏就不会被忽视。这就是引入这种统计收集系统的主要原因。
然后,您看到此数字每 10 秒左右增加一次的原因是由于恰好了解集群状态的内部事件。也就是说,此行为最近已更改,因此它不会建立新连接,而是从池中选择现有套接字,因此我相信您使用的不是最新版本。
让 SlaveConns
为负值看起来像是一个错误。关于所建立连接的统计信息收集有一个小的边缘案例,因为在我们与它交谈之前我们无法判断给定服务器是主服务器还是从服务器,因此可能存在未发现的路径。如果您在升级后仍然看到该行为,请报告该问题,我们很乐意查看。
SocketsInUse
是仍然被一个或多个 session 引用的套接字数量,无论它们是否处于事件状态(连接已建立)。 SocketsAlive
是实时 TCP 连接的实际数量。两者之间的增量表明许多 session 未关闭。这可能没问题,如果它们仍由应用程序保留在内存中并最终将被关闭,或者如果应用程序错过了 session.Close
操作,则可能是泄漏。
关于mongodb - 使用 mgo 驱动程序,Mongodb 连接计数每 10 秒增加一个,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19455787/