smp
smp

Reputation: 61

mongo upsert performance (C++)

I am writing a C++ client that processes a file with 1M rows and inserts them in mongodb. The data is inserted in 6 different tables that follow different accumulation criteria. I accumulate the data of 5000 rows (configurable) in a C++ map and then insert (upsert) into mongodb, rinse and repeat until the end of file.

The code for one of the upserts is:

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);
        }
    }

The other upsert are identical except for the info stored. My problem is that if I only use 2 tables, the times are reasonably fast (4-8 times faster than MySql), but if I use all 6 the performance degrades.

With 2 tables:

WebAccumulationCategory: 6877ms 261749 items; 1465ms (1465 + 0 + 0 + 0).

WebAccumulationClientId: 5005ms 0 items; 0ms (0 + 0 + 0 + 0).

WebAccumulationPolicy: 5115ms 0 items; 0ms (0 + 0 + 0 + 0).

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

WebNavigationCategory: 5442ms 0 items; 0ms (0 + 0 + 0 + 0).

WebNavigationUri: 9493ms 414610 items; 3666ms (3666 + 0 + 0 + 0).

With 6 tables (same file, tables dropped):

WebAccumulationCategory: 6605ms 261749 items; 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 items; 0ms (0 + 0 + 0 + 0)

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

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

Times are measured in the program with

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

I use mongodb 2.4.9 in an Oracle Server 6.5 machine. The program uses the C++ driver and runs in the same machine.

As you can see WebNavigationUri goes from 3666ms to 27317ms when I upsert in the other 4 tables, but the time for WebAccumulationCategory remains the same. It would seem there is some sort of interaction between the tables and/or the order in which I make the upserts. Any ideas why is this loss of performance is happening? What can I look for / monitor in the database?

mongostat says:

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 

Blocking is at 80% but I guess it's normal given that I am upserting 13K records per second.

Upvotes: 0

Views: 1288

Answers (2)

Tyler Brock
Tyler Brock

Reputation: 30136

Use different databases. The current versions of MongoDB have database level locking so instead of using test for all of them just use test1, test2, testN...

You can also try using the bulk api in the legacy driver (slated for the next release) to avoid the network round trips.

Upvotes: 1

mcorbe
mcorbe

Reputation: 175

Blockquote Any ideas why is this loss of performance is happening? What can I look for / monitor in the database?

You might want to run mongostat (http://docs.mongodb.org/manual/reference/program/mongostat/ ):

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

and pay attention to the number of faults, if not zero your working set does not fit in memory hence data access becomes very slow. Solution would be to work with your index, provide more RAM and/or start sharding your database

Upvotes: 1

Related Questions