2013-10-18 2 views
1

우리는 우리의 MongoDB를 연결 수가이 사용하는 모니터 다음 connectionCount 일관 최대 섬뜩한 곳, 우리가 이상한 연결 누수 문제에 직면하고있다 그러나몽고 연결 산화 마그네슘 드라이버 10 초당 한 들어온다 카운트

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

을 10 초당 1 개의 열린 연결로. (요청 여부에 관계없이). 나는 localhost에서 서버를 회전시키고, 거기에두고, 아무것도하지 않으며, conectionCount는 여전히 크립프 (creep) 할 것이다. 결국 접속 수는 최대 수천까지 늘어나서 app/db를 죽이면 앱을 다시 시작해야합니다.

디버깅하기에 충분하지 않을 수 있습니다. 누구든지 과거에 다룬 아이디어, 연결 누수가 있습니까? 어떻게 디버그 했습니까? 내가 이것을 디버깅 할 수있는 방법은 무엇입니까?

우리는 몇 가지 시도를했는데, 연결을 열고 카운터/디버깅 문을 넣을 수있는 코드에 대한 코드베이스를 검사했습니다. 지금까지 누출이 발견되지 않았습니다. 어딘가에 도서관에 누출이있는 것과 거의 같습니다.

이것은 우리가 작업 해 왔던 지점의 버그이며, 거기에는 몇 백 개의 커밋이 있습니다. 우리는 이것과 master 사이에 diff를 수행 했으므로이 브랜치에 연결 누수가있는 이유를 찾을 수 없습니다.

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 초당을 섬뜩한 수 있습니다 : 예를 들어

, 나는이 참조하고있는 데이터 세트가있다. 나는 다른 숫자가 의미 할 수있는 것을 완전히 확신하지 못한다.

답변

13

MasterConns은 누수가 있는지 여부를 알려주지 않습니다. 감소하지 않기 때문입니다. 이 필드는 마지막 통계 재설정 이후 만들어진 연결 수를 나타내며 현재 사용중인 소켓 수가 아닙니다. 후자는 SocketsAlive 필드로 표시됩니다.

mgo 제품군의 모든 단일 테스트는 테스트가 끝난 후에도 통계가 정상적인 값을 표시하도록 로직을 감싸기 때문에 잠재적 누설이 눈에 띄지 않습니다. 그것이 통계 수집 시스템이 도입 된 주된 이유입니다.

그런 다음이 숫자가 10 초마다 증가하는 이유는 클러스터의 상태를 알게되는 내부 활동 때문입니다. 즉,이 동작은 최근에 변경되어 새로운 연결을 설정하지 않고 풀에서 기존 소켓을 선택하므로 최신 릴리스를 사용하지 않는다고 생각합니다.

SlaveConns 네거티브는 버그처럼 보입니다. 연결에 대한 통계 수집에 관한 작은 경우가 있습니다. 대화 전에 서버가 마스터인지 슬레이브인지 알 수 없기 때문에 경로가 노출 될 수 있습니다. 업그레이드 한 후에도 문제가 계속 표시되면 문제를 신고 해 주시면 기꺼이 검토해 드리겠습니다.

SocketsInUse은 활성 상태 (연결이 설정 됨)인지 여부에 관계없이 하나 이상의 세션에서 계속 참조되는 소켓 수입니다. SocketsAlive은 다시 실제 TCP 연결 수입니다. 둘 사이의 델타는 여러 세션이 닫히지 않았 음을 나타냅니다. 응용 프로그램에서 여전히 메모리에 보유 중이며 결국 닫히거나 응용 프로그램에서 session.Close 작업을 놓친 경우 누수가 발생할 수 있습니다.

+0

감사합니다. Gustavo! socketsAlive와 SocketsInUse 및 SocketRefs의 차이점을 자세히 설명해 주시겠습니까? socketAlive가 SocketsInUse보다 작은 이유는 무엇입니까? – samol

+1

물론 답장을 완료했습니다. –

관련 문제