2014-03-12 3 views
0

1M 행의 파일을 처리하고 mongodb에 삽입하는 C++ 클라이언트를 작성했습니다. 데이터는 다른 축적 기준을 따르는 6 개의 다른 테이블에 삽입됩니다. 나는 C++ 맵에 5000 행 (구성 가능)의 데이터를 누적 한 다음 mongodb에 삽입 (upsert)하고 파일 끝까지 반복하여 반복합니다.mongo upsert performance (C++)

upserts 중 하나에 대한 코드는 다음과 같습니다

void Upsert(mongo::DBClientConnection & cmon) 
    { 
     map<KEY, VALUE>::const_iterator it; 
     cmon.ensureIndex("test.WebNavigationUri", BSON("ClientId" << 1 << "Uri" << 1 << "Date" << 1), true); 

     for (it=detail.begin(); it!=detail.end(); ++it) 
     { 
      cmon.update("test.WebNavigationUri", 
       BSON("ClientId" << it->first.clientid << "Uri" << it->first.uri << "Date" << it->second.dHora), 
       BSON("$inc" << BSON("Time" << it->second.time)), 
       true); 
     } 
    } 

다른 upsert가 저장되어있는 정보를 제외하고는 동일합니다. 제 문제는 제가 테이블을 2 개만 사용하면 시간이 합리적으로 빠릅니다 (My8보다 4 ~ 8 배 빠름).하지만 모두 6을 사용하면 성능이 저하됩니다.

WebAccumulationCategory : 2 개 테이블

6877ms 261,749 상품; 1465ms (1465 + 0 + 0 + 0).

WebAccumulationClientId : 5005ms 0 항목; 0ms (0 + 0 + 0 + 0).

WebAccumulation 정책 : 5115ms 0 항목; 0ms (0 + 0 + 0 + 0).

WebAccumulationVirusName : 0ms 0 항목; 0ms (0 + 0 + 0 + 0).

WebNavigationCategory : 5442ms 0 품목; 0ms (0 + 0 + 0 + 0).

WebNavigationUri : 9493ms 항목; 3666ms (3666 + 0 + 0 + 0). 261,749 항목 6605ms; 6 개 테이블

(동일한 파일, 테이블 삭제)

WebAccumulationCategory 1421ms (1421 + 0 + 0 + 0)

WebAccumulationClientId : 5367ms 172873 항목; 1753ms (1753 + 0 + 0 + 0)

WebAccumulation 정책 : 6187ms 174941 항목; 2086ms (2086 + 0 + 0 + 0)

WebAccumulationVirusName : 12ms 52 항목; 0ms (0 + 0 + 0 + 0)

WebNavigationCategory : 18745ms 258072 항목; 14510ms (14510 + 0 + 0 + 0)

WebNavigationUri : 33046ms 항목; 27317ms (27317 + 0 + 0 + 0)

시간이

boost::posix_time::microsec_clock::local_time(); 

와 프로그램에 측정

나는 오라클 서버 6.5 컴퓨터에서 MongoDB를 2.4.9 사용합니다. 이 프로그램은 C++ 드라이버를 사용하며 동일한 컴퓨터에서 실행됩니다.

WebNavigationUri는 다른 4 개 테이블에서 업 샘플링 할 때 3666ms에서 27317ms로 이동하지만 WebAccumulationCategory의 시간은 동일하게 유지됩니다. 테이블 사이 및/또는 내가 업서 트를하는 순서 사이에 어떤 종류의 상호 작용이있는 것 같습니다. 성능 저하가 발생하는 이유는 무엇입니까? 데이터베이스에서 무엇을 찾고/모니터 할 수 있습니까?

insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0  *0  *0  0  1|0  0 544m 1.42g 247m  0 test:0.0%   0  0|0  0|0 62b  3k  6 12:09:59 
    3  *0 2696  *0  0  1|0  0 544m 1.42g 254m  4 test:23.5%   0  0|0  0|0 583k  3k  6 12:10:00 
    3  *0 10635  *0  0  2|0  0 544m 1.42g 248m  3 test:80.3%   0  0|0  0|1  2m  3k  6 12:10:01 
    *0  *0 13151  *0  0  1|0  0 544m 1.42g 252m  0 test:80.9%   0  0|0  0|1  2m  3k  6 12:10:02 
    *0  *0 13089  *0  0  1|0  0 544m 1.42g 253m  0 test:81.7%   0  0|0  0|1  2m  3k  6 12:10:03 
    *0  *0 13567  *0  0  1|0  0 544m 1.42g 250m  0 test:81.5%   0  0|0  0|1  2m  3k  6 12:10:04 
    *0  *0 13636  *0  0  1|0  0 544m 1.42g 248m  0 test:81.2%   0  0|0  0|1  2m  3k  6 12:10:05 
    *0  *0 13417  *0  0  2|0  0 544m 1.42g 255m  0 test:78.9%   0  0|0  0|1  2m  3k  6 12:10:06 
    *0  *0 13759  *0  0  1|0  0 544m 1.42g 256m  0 test:81.0%   0  0|0  0|1  2m  3k  6 12:10:07 
    *0  *0 13556  *0  0  1|0  0 544m 1.42g 257m  0 test:80.9%   0  0|0  0|1  2m  3k  6 12:10:08 
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0 13821  *0  0  1|0  0 544m 1.42g 257m  0 test:81.0%   0  0|0  0|1  2m  3k  6 12:10:09 
    *0  *0 13932  *0  0  1|0  0 544m 1.42g 258m  0 test:81.0%   0  0|0  0|1  2m  3k  6 12:10:10 
    *0  *0 13460  *0  0  2|0  0 544m 1.42g 258m  0 test:81.0%   0  0|0  0|1  2m  3k  6 12:10:11 
    *0  *0 13823  *0  0  1|0  0 544m 1.42g 256m  0 test:80.8%   0  0|0  0|1  2m  3k  6 12:10:12 
    *0  *0 13811  *0  0  1|0  0 544m 1.42g 253m  0 test:80.3%   0  0|0  0|1  2m  3k  6 12:10:13 
    *0  *0 13794  *0  0  1|0  0 544m 1.42g 251m  0 test:81.2%   0  0|0  0|1  2m  3k  6 12:10:14 
    *0  *0 13605  *0  0  1|0  0 544m 1.42g 247m  0 test:79.6%   0  0|1  0|1  2m  3k  6 12:10:15 
    *0  *0 13403  *0  0  2|0  0 544m 1.42g 261m  0 test:79.0%   0  0|0  0|1  2m  3k  6 12:10:16 
    *0  *0 13781  *0  0  1|0  0 544m 1.42g 261m  0 test:81.2%   0  0|0  0|0  2m  3k  6 12:10:17 
    *0  *0 13824  *0  0  1|0  0 544m 1.42g 262m  0 test:80.6%   0  0|0  0|1  2m  3k  6 12:10:18 
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0 13954  *0  0  1|0  0 544m 1.42g 262m  0 test:81.0%   0  0|0  0|1  2m  3k  6 12:10:19 
    *0  *0 13873  *0  0  2|0  0 544m 1.42g 262m  0 test:81.3%   0  0|0  0|1  2m  3k  6 12:10:20 
    *0  *0 13416  *0  0  2|0  0 544m 1.42g 261m  0 test:79.4%   0  0|0  0|1  2m  3k  6 12:10:21 
    *0  *0 13840  *0  0  1|0  0 544m 1.42g 261m  0 test:81.2%   0  0|0  0|1  2m  3k  6 12:10:22 
    *0  1 13657  *0  0 13|0  0 544m 1.42g 259m  0 test:80.4%   0  0|0  0|1  2m 11k  6 12:10:23 
    *0  *0 12566  *0  0  1|0  0 544m 1.42g 259m  0 test:75.5%   0  0|0  0|1  2m  3k  6 12:10:24 
    *0  *0 13777  *0  0  1|0  0 544m 1.42g 251m  0 test:80.4%   0  0|0  0|1  2m  3k  6 12:10:25 
    *0  *0 13148  *0  0  2|0  0 544m 1.42g 265m  0 test:77.6%   0  0|0  0|1  2m  3k  6 12:10:26 
    *0  *0 13691  *0  0  1|0  0 544m 1.42g 265m  0 test:80.7%   0  0|0  0|1  2m  3k  6 12:10:27 
    *0  *0 13633  *0  0  1|0  0 544m 1.42g 265m  0 test:80.2%   0  0|0  0|0  2m  3k  6 12:10:28 
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0 13538  *0  0  1|0  0 544m 1.42g 265m  0 test:80.7%   0  0|0  0|1  2m  3k  6 12:10:29 
    *0  *0 13773  *0  0  1|0  0 544m 1.42g 265m  0 test:80.4%   0  0|0  0|1  2m  3k  6 12:10:30 
    *0  *0 9118  *0  0  2|0  0 544m 1.42g 263m  0 test:52.9%   0  0|0  0|1  1m  3k  6 12:10:31 
    *0  *0 11894  *0  0  1|0  0 544m 1.42g 268m  0 test:68.6%   0  0|0  0|1  2m  3k  6 12:10:32 
    *0  *0 13742  *0  0  1|0  0 544m 1.42g 266m  0 test:80.6%   0  0|0  0|1  2m  3k  6 12:10:33 
    *0  *0 13583  *0  0  1|0  0 544m 1.42g 266m  0 test:80.8%   0  0|0  0|1  2m  3k  6 12:10:34 
    *0  *0 13769  *0  0  1|0  0 544m 1.42g 266m  0 test:81.4%   0  0|0  0|1  2m  3k  6 12:10:35 
    *0  *0 13921  *0  0  2|0  0 544m 1.42g 268m  0 test:81.1%   0  0|0  0|1  2m  3k  6 12:10:36 
    *0  *0 13414  *0  0  1|0  0 544m 1.42g 265m  0 test:78.4%   0  0|0  0|1  2m  3k  6 12:10:37 
    *0  *0 13489  *0  0  1|0  0 544m 1.42g 263m  0 test:80.7%   0  0|0  0|1  2m  3k  6 12:10:38 
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0 13847  *0  0  1|0  0 544m 1.42g 262m  0 test:81.3%   0  0|0  0|1  2m  3k  6 12:10:39 
    *0  3 13776  *0  0  1|0  0 544m 1.42g 266m  0 test:80.6%   0  0|0  0|1  2m  3k  6 12:10:40 
    *0  *0 14000  *0  0  2|0  0 544m 1.42g 251m  0 test:81.1%   0  0|0  0|1  2m  3k  6 12:10:41 
    *0  *0 13416  *0  0  1|0  0 544m 1.42g 270m  0 test:77.8%   0  0|0  0|1  2m  3k  6 12:10:42 
    *0  *0 13583  *0  0  1|0  0 544m 1.42g 270m  0 test:80.8%   0  0|0  0|1  2m  3k  6 12:10:43 
    *0  *0 13854  *0  0  1|0  0 544m 1.42g 272m  0 test:80.9%   0  0|0  0|1  2m  3k  6 12:10:44 
    *0  *0 13742  *0  0  1|0  0 544m 1.42g 270m  0 test:80.6%   0  0|0  0|1  2m  3k  6 12:10:45 
    *0  *0 13708  *0  0  2|0  0 544m 1.42g 269m  0 test:80.7%   0  0|0  0|1  2m  3k  6 12:10:46 
    *0  *0 13675  *0  0  1|0  0 544m 1.42g 269m  0 test:80.8%   0  0|0  0|1  2m  3k  6 12:10:47 
    *0  *0 11748  *0  0  1|0  0 544m 1.42g 271m  0 test:68.9%   0  0|0  0|1  2m  3k  6 12:10:48 
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0 9845  *0  0  1|0  1 544m 1.42g 274m  0 test:56.4%   0  0|0  0|1  1m  3k  6 12:10:49 
    *0  *0 13623  *0  0  2|0  0 544m 1.42g 271m  0 test:81.0%   0  0|0  0|1  2m  3k  6 12:10:50 
    *0  *0 13530  *0  0  2|0  0 544m 1.42g 271m  0 test:80.4%   0  0|0  0|1  2m  3k  6 12:10:51 
    *0  *0 14127  *0  0  1|0  0 544m 1.42g 274m  0 test:81.2%   0  0|0  0|1  2m  3k  6 12:10:52 
    *0  *0 13734  *0  0  1|0  0 544m 1.42g 270m  0 test:80.8%   0  0|0  0|1  2m  3k  6 12:10:53 
    *0  *0 13305  *0  0  1|0  0 544m 1.42g 268m  0 test:81.3%   0  0|0  0|1  2m  3k  6 12:10:54 
    *0  *0 13575  *0  0  1|0  0 544m 1.42g 269m  0 test:80.9%   0  0|0  0|1  2m  3k  6 12:10:55 
    *0  *0 13735  *0  0  2|0  0 544m 1.42g 272m  0 test:80.2%   0  0|0  0|1  2m  3k  6 12:10:56 
    *0  *0 13809  *0  0  1|0  0 544m 1.42g 257m  0 test:80.5%   0  0|0  0|1  2m  3k  6 12:10:57 
    *0  *0 13896  *0  0  1|0  0 544m 1.42g 252m  0 test:81.3%   0  0|0  0|1  2m  3k  6 12:10:58 
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0 13207  *0  0  1|0  0 544m 1.42g 274m  0 test:78.0%   0  0|0  0|0  2m  3k  6 12:10:59 
    *0  *0 14075  *0  0  1|0  0 544m 1.42g 276m  0 test:81.1%   0  0|0  0|1  2m  3k  6 12:11:00 
    *0  *0 11833  *0  0  2|0  0 544m 1.42g 273m  0 test:70.9%   0  0|0  0|1  2m  3k  6 12:11:01 
    *0  *0 13540  *0  0  1|0  0 544m 1.42g 271m  0 test:81.0%   0  0|0  0|1  2m  3k  6 12:11:02 
    *0  *0 13762  *0  0  1|0  0 544m 1.42g 272m  0 test:80.8%   0  0|0  0|1  2m  3k  6 12:11:03 
    *0  *0 13535  *0  0  1|0  0 544m 1.42g 275m  0 test:79.3%   0  0|0  0|1  2m  3k  6 12:11:04 
    *0  *0 13584  *0  0  1|0  0 544m 1.42g 265m  0 test:80.1%   0  0|0  0|1  2m  3k  6 12:11:05 
    *0  *0 9272  *0  0  2|0  0 544m 1.42g 275m  0 test:54.3%   0  0|0  0|1  1m  3k  6 12:11:06 
    *0  *0 8524  *0  0  1|0  0 544m 1.42g 271m  0 test:52.8%   0  0|0  0|1  1m  3k  6 12:11:07 
    *0  *0 13772  *0  0  1|0  0 544m 1.42g 272m  0 test:81.6%   0  0|0  0|1  2m  3k  6 12:11:08 
insert query update delete getmore command flushes mapped vsize res faults locked db idx miss %  qr|qw ar|aw netIn netOut conn  time 
    *0  *0 11479  *0  0  1|0  0 544m 1.42g 271m  0 test:65.8%   0  1|0  0|1  2m  3k  6 12:11:09 
    *0  *0 13835  *0  0  1|0  0 544m 1.42g 252m  0 test:80.8%   0  0|0  0|1  2m  3k  6 12:11:10 
    *0  *0 13597  *0  0  2|0  0 544m 1.42g 276m  0 test:80.2%   0  0|0  0|1  2m  3k  6 12:11:11 
    *0  *0 13704  *0  0  1|0  0 544m 1.42g 275m  0 test:80.9%   0  0|0  0|1  2m  3k  6 12:11:12 
    *0  *0 14127  *0  0  1|0  0 544m 1.42g 279m  0 test:81.2%   0  0|0  0|1  2m  3k  6 12:11:13 
    *0  *0 13144  *0  0  1|0  0 544m 1.42g 275m  0 test:78.1%   0  0|0  0|1  2m  3k  6 12:11:14 
    *0  *0 13680  *0  0  1|0  0 544m 1.42g 273m  0 test:80.9%   0  0|0  0|1  2m  3k  6 12:11:15 
    *0  *0 13491  *0  0  2|0  0 544m 1.42g 273m  0 test:78.9%   0  0|0  0|0  2m  3k  6 12:11:16 
    *0  *0  *0  *0  0  1|0  0 544m 1.42g 265m  0  .:0.1%   0  0|0  0|0 62b  3k  5 12:11:17 
    *0  1  *0  *0  0 13|0  0 544m 1.42g 258m  0 config:0.1%   0  0|0  0|0 892b 11k  5 12:11:18 

차단 80 %에서하지만 나는 내가 초당 13K 기록을 upserting하고 주어진 정상 같아요

mongostat는 말한다.

+0

좋은 통계이지만, 무언가가 내 머리 위로 * 길을 날아 왔습니다. 그게 뭔지 확실하지 않습니다. 정확히 무엇을 요구하고 있습니까? 그리고 ** 우리는 이것을 어떻게 분석해야합니까? 그것에 대해 생각해보십시오. 이 질문은 편집해야합니다. –

답변

1

차단 인용문이 성능 저하가 발생하는 이유는 무엇입니까? 데이터베이스에서 무엇을 찾고/모니터 할 수 있습니까?

mongostat --username <user> --password <pass> 

을 메모리에 맞지 않는 작업 집합을 제로 따라서 데이터 액세스가 매우 느린됩니다하지 않을 경우, 결함의 수에주의 :

당신은 mongostat (http://docs.mongodb.org/manual/reference/program/mongostat/)을 실행 할 수 있습니다. 해결 방법은 인덱스로 작업하고 더 많은 RAM을 제공하고 데이터베이스를 샤딩하는 것입니다.

+0

감사합니다. mongostat 정보로 질문을 업데이트했습니다. 나는 쓰기 대기열을 많이 보길 원했지만 아니오. – smp

+0

여기에 잠금 장치가 80 %를 초과하는 것처럼 보입니다. 즉, 잠금이 해제 될 때까지 읽기/쓰기 액세스가 지연된다는 의미입니다 (http://docs.mongodb.org/manual/faq/concurrency/). 업데이트는 집중적으로 수행되며 동일한 문서에 여러 번 액세스하려고하면 잠금이 해제 될 때까지 기다릴 수 있습니다. – mcorbe

+0

해결책은 문서 형식으로 작업 할 수 있으며 mongo에서는 문서 당 하나의 업데이트 쿼리 만 필요합니다. – mcorbe

1

다른 데이터베이스를 사용하십시오. MongoDB의 현재 버전은 ... 그래서 대신 test1, test2, testN을 사용하여 그들 모두를위한 test을 사용하는 데이터베이스 수준 잠금이

또한 향후 출시 될 예정 레거시 드라이버에서 대량 API를 (사용하여 시도 할 수 있습니다

) 네트워크 왕복을 피하십시오.