Mongo Connection Count набирает обороты один раз в 10 секунд с драйвером mgo
Мы отслеживаем количество подключений к mongoDB, используя это:
http://godoc.org/labix.org/v2/mgo
Тем не менее, мы столкнулись со странной проблемой утечки соединения, когда connectionCount постоянно набирает обороты еще на 1 открытое соединение за 10 секунд. (Это независимо от того, есть ли какие-либо запросы). Я могу раскрутить сервер в localhost, оставить его там, ничего не делать, conectionCount все равно подскочит. Число подключений в конечном итоге возрастает до нескольких тысяч, и это убивает app /db, и мы должны перезапустить приложение.
Это может быть недостаточно информации для отладки. Есть ли у кого-нибудь идеи, утечки связи, с которыми вы сталкивались в прошлом. Как вы это отладили? Как я могу отладить это?
Мы попробовали несколько вещей, мы отсканировали нашу кодовую базу для любого кода, который мог бы открыть соединение и поместить туда счетчики / операторы отладки, и пока мы не обнаружили утечки. Это почти как утечка в библиотеке где-то.
Это ошибка в ветке, над которой мы работали, и в ней было несколько сотен коммитов. Мы провели различие между этим и мастером и не смогли найти причину утечки соединения в этой ветке.
Например, есть набор данных, на который я ссылаюсь:
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 секунд. Я не совсем уверен, что могут означать другие цифры.
1 ответ
MasterConns
не могу сказать вам, есть ли утечка или нет, потому что она не уменьшается. В этом поле указывается количество подключений, выполненных с момента последнего сброса статистики, а не количество используемых в данный момент сокетов. Последнее обозначено SocketsAlive
поле.
Чтобы дать вам дополнительное облегчение по этому вопросу, каждый отдельный тест в наборе mgo основан на логике, которая гарантирует, что статистика показывает нормальные значения после завершения теста, так что потенциальные утечки не остаются незамеченными. Это основная причина, по которой была введена такая система сбора статистики.
Тогда причина, по которой вы видите, что это число увеличивается каждые 10 секунд или около того, связана с внутренней активностью, которая случается, чтобы узнать состояние кластера. Тем не менее, это поведение было недавно изменено, так что оно не устанавливает новые соединения и вместо этого выбирает существующие пулы из пула, так что я считаю, что вы не используете последний выпуск.
имеющий SlaveConns
негатив выглядит как ошибка. Существует небольшой крайний случай сбора статистики для выполненных соединений, потому что мы не можем сказать, является ли данный сервер главным или подчиненным, прежде чем мы поговорим с ним, поэтому может быть открытый путь. Если вы все еще видите такое поведение после обновления, сообщите о проблеме, и я буду рад ее рассмотреть.
SocketsInUse
это число сокетов, на которые все еще ссылаются один или несколько сеансов, независимо от того, являются ли они живыми (соединение установлено) или нет. SocketsAlive
Опять же, реальное количество активных соединений TCP. Дельта между ними указывает на то, что ряд сеансов не был закрыт. Это может быть хорошо, если они все еще хранятся в памяти приложением и в конечном итоге будут закрыты, или это может быть утечка, если session.Close
операция была пропущена приложением.