2016-07-26 3 views
1

안녕하세요, 먼저 모든 안내를 제공해 주신 것에 대해 감사드립니다.PHP MongoDB 성능 저하

최근 나는 피크 시간 동안 503 개의 오류를주는 실행중인 서비스에 문제가 발생하기 시작했습니다. PHP (5.4)/MongoDB (2.4) 지원 API로 서비스를 실행합니다. 피크 타임 대기 시간 동안 몽고 스탯과 몽고 탑을 첨부했습니다.

enter image description here

enter image description here

enter image description here

mongostat 및 mongotop의 타임 스탬프는 꽤 같은 기간에하지만 그들은 같은 가동 중지 기간 동안 발생 않았고, 나는 그것을 가정하는 것이 안전 고려할 것 유효한 표현입니다.

플랫폼은 Openshift (웹 서버와 데이터베이스 모두)에서 호스팅됩니다.

내가 알고있는 것은 연결의 양과 (qr | ar) 대 수행되는 쿼리의 양입니다. 이 경우 색인 생성을 사용하는 것이 가장 좋습니다 (idx miss %는 0입니까?).

출력이 잘못되었을 수도 있지만 문제가 될 수있는 부분은 무엇입니까? PHP는 mongodb 드라이버와 연결 금액을 열었습니다?. PHP 응용 프로그램의 소스 코드에 결함이 있습니까?

누구와 비슷한 문제가 발생 했습니까? 무엇이 최선의 행동 방침이 될까요?

허용되는 최대 연결 수를 늘리려고했지만 MongoDB 기본값이 높아 보이고 도움이 될 것이라고 생각하지 않습니다. 나는 또한 수행 된 쿼리의 양이 훨씬 적을 때 독서 대기열에있는 많은 양의 클라이언트와 높은 액티브 읽기의 피크를 처리하는 방법을 알지 못합니다.

다시 한 번 감사드립니다.

+0

Oplog를 사용하고 있습니까? – Dude

+0

아니요, 우리는 oplog를 사용하지 않습니다. 데이터베이스는 분할되거나 복제되지 않습니다. –

답변

1

잘못된 색인 문제였습니다. 위에서 mongostat를 확인하면 초당 1-100 개의 쿼리에 대해 400 개 이상의 연결이 열렸으며 엄청난 qr 요청이 있다는 것을 알 수 있습니다. 가장 많이 사용 된 콜렉션 (mongotop 확인)과 관련된 쿼리를 확인하여 push_notifications 컬렉션에서 잘못된 값으로 인덱싱 된 쿼리가 있다는 것을 알았습니다. PHP mongo 드라이버는 (아직 알려지지 않은) 몇 가지 이유 때문에 연결을 생성하기 시작했으며 쿼리가 대기하고 메모리가 최고조에 이르렀고 전반적으로 시스템이 느려졌습니다.

코드를 수정하고 코드 필드의 순서를 재정렬하고 데이터베이스에 적절한 색인을 삽입 한 후에 성능이 향상되고 연결이 오버 플로우되지 않습니다.

결론 : PHP에서 mongostat 및 mongotop을 사용하여 가장 많이 사용되는 콜렉션을 분석하는 동안 코드를 확인하고 색인 및 색인 필드의 순서를 최적화하려고 시도합니다.