猿问

使用 mgo 驱动程序,Mongo 连接数每 10 秒增加一个

我们使用以下方法监控我们的 mongoDB 连接数:


http://godoc.org/labix.org/v2/mgo#GetStats


但是,我们一直面临一个奇怪的连接泄漏问题,其中 connectionCount 每 10 秒持续增加 1 个打开的连接。(这与是否有任何请求无关)。我可以在 localhost 中启动一个服务器,把它留在那里,什么都不做,conectionCount 仍然会增加。连接数最终会上升到几千,然后它会杀死应用程序/数据库,我们必须重新启动应用程序。


这可能不足以让您进行调试。有没有人有任何想法,您过去处理过的连接泄漏。你是怎么调试的?我可以通过哪些方式调试它。


我们已经尝试了一些事情,我们扫描了我们的代码库以查找任何可以打开连接并将计数器/调试语句放在那里的代码,到目前为止我们没有发现任何泄漏。这几乎就像某个地方的图书馆发生了泄漏。


这是我们一直在研究的分支中的一个错误,并且已经有数百次提交。我们已经在 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 秒增加一个的数字。我不完全确定其他数字可能意味着什么。


牧羊人nacy
浏览 247回答 1
1回答

红糖糍粑

MasterConns不能告诉你是否有泄漏,因为它不会减少。该字段表示自上次重置统计信息后建立的连接数,而不是当前正在使用的套接字数。后者由SocketsAlive字段指示。为了让您对这个问题有一些额外的缓解,mgo 套件中的每一个测试都围绕着逻辑进行,以确保在测试完成后统计数据显示合理的值,这样潜在的泄漏就不会被忽视。这就是引入这种统计收集系统的主要原因。然后,您看到这个数字每 10 秒左右增加一次的原因是内部活动恰好了解集群的状态。也就是说,这种行为最近发生了变化,因此它不会建立新的连接,而是从池中选择现有的套接字,所以我相信您没有使用最新版本。有SlaveConns负看起来像一个bug。对于已建立的连接的统计收集有一个小的边缘情况,因为在与它交谈之前我们无法判断给定的服务器是主服务器还是从服务器,因此可能存在未覆盖的路径。如果您在升级后仍然看到该行为,请报告该问题,我会很乐意查看它。SocketsInUse是仍然被一个或多个会话引用的套接字的数量,无论它们是否处于活动状态(连接已建立)。SocketsAlive再次是实时 TCP 连接的实际数量。两者之间的差值表示许多会话未关闭。这可能没问题,如果它们仍然被应用程序保存在内存中并且最终将被关闭,或者如果session.Close应用程序错过了一个操作,它可能是一个泄漏。
随时随地看视频慕课网APP

相关分类

Go
我要回答