2014-03-12 36 views
0

我正在編寫一個C++客戶機,該客戶機處理具有1M行的文件並將它們插入到mongodb中。數據被插入6個不同的表格中,遵循不同的累積標準。我在C++映射中累積5000行(可配置)的數據,然後插入(插入)到mongodb中,漂洗並重復,直到文件結束。mongo upsert性能(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個表,那麼時間相當快(比MySql快4-8倍),但是如果我全部使用6,則性能會降低。

設有2個表:

WebAccumulationCategory:6877ms 物品; 1465ms(1465 + 0 + 0 + 0)。

WebAccumulationClientId:5005ms 0項; 0ms(0 + 0 + 0 + 0)。

WebAccumulationPolicy:5115ms 0項; 0ms(0 + 0 + 0 + 0)。

WebAccumulationVirusName:0ms 0 items; 0ms(0 + 0 + 0 + 0)。

WebNavigationCategory:5442ms 0項; 0ms(0 + 0 + 0 + 0)。

網頁導航烏龜:9493ms items; 3666ms(3666 + 0 + 0 + 0)。

隨着6個表(相同的文件,表格丟棄):

WebAccumulationCategory:6605ms 物品; 1421ms(1421 + 0 + 0 + 0)

WebAccumulationClientId:5367ms 172873 items; 1753ms(1753 + 0 + 0 + 0)

WebAccumulationPolicy:6187ms 174941 items; 2086ms(2086 + 0 + 0 + 0)

WebAccumulationVirusName:12ms 52項; 0ms(0 + 0 + 0 + 0)

WebNavigationCategory:18745ms 258072 items; 14510ms(14510 + 0 + 0 + 0)

WebNavigationUri:33046ms items; 27317ms(27317 + 0 + 0 + 0)

時報在程序與

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

測量我在Oracle服務器6.5機器使用的mongodb 2.4.9。該程序使用C++驅動程序並在同一臺機器上運行。

正如你可以看到WebNavigationUri從3666ms到27317ms,當我插入其他4個表中,但WebAccumulationCategory的時間保持不變。看起來表格之間有某種相互作用和/或我做出插件的順序。 任何想法爲什麼這種性能損失正在發生?我可以在數據庫中查找/監視什麼?

mongostat說:

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%,但我想這是正常的因爲我upserting 13K記錄每秒。

+0

不錯的數據,但有些東西只是在我頭上飛行。不知道那是什麼。你到底在問什麼?我們**應該如何分析這個?考慮一下。這個問題需要編輯。 –

回答

1

Blockquote任何想法爲什麼這種性能損失正在發生?我可以在數據庫中查找/監視什麼?

您可能需要運行mongostat(http://docs.mongodb.org/manual/reference/program/mongostat/):

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

,並注重故障的數量,如果不是零,你的工作組不適合在內存中,因此數據存取變得很慢。解決方案將與您的索引一起工作,提供更多RAM和/或開始分片數據庫

+0

謝謝。我已經用mongostat信息更新了這個問題。我希望看到很多寫隊列,但沒有。 – smp

+0

看起來像這裏你有很多鎖> 80%,這意味着你的讀/寫訪問被推遲直到鎖消失(http://docs.mongodb.org/manual/faq/concurrency/)。更新是鎖定密集型的,如果您嘗試多次訪問同一文檔,您可能會花大部分時間等待鎖定被釋放。 – mcorbe

+0

解決方案可能是處理您的文檔格式,並確保在mongo中每個文檔只需要一個更新查詢。 – mcorbe

1

使用不同的數據庫。 MongoDB中的當前版本有數據庫級鎖等等,而不是使用test爲所有這些只需使用test1test2testN ...

您也可以嘗試使用在傳統驅動器的大宗原料藥(內定爲下一個版本)以避免網絡往返。