Mongo Benchmarking 1
by Mike
These aren’t perfect benchmarks - far from it in fact - but I just wanted to get a rough idea of the relative tradeoffs between fsync and safe over normal unsafe writes…
Time taken for 10,000 inserts - (no indexes, journalling on MongoDB 2.0.1 on Debian (Rackspace CloudServer 256Meg))
default - time taken: 0.2401921749115 seconds fsync - time taken: 358.55523014069 seconds safe=true - time taken: 1.1818060874939 seconds
Edit: and for journalling disabled and smallfiles=true in mongo.conf
default - time taken: 0.15036606788635 seconds fsync - time taken: 34.175970077515 seconds safe=true - time taken: 1.0593159198761 seconds
The results aren’t perfect, but do show how big the difference is…
Source:
<?php $mongo = new Mongo(); $db = $mongo->selectDB('bench'); $collection = new MongoCollection($db,'bench'); $start = microtime(TRUE); for ($i=0;$i<10000;$i++) { $collection->insert(array('data' => sha1(rand()) )); } $end = microtime(TRUE); echo 'default - time taken: '.($end-$start)." seconds \n"; $start = microtime(TRUE); for ($i=0;$i<10000;$i++) { $collection->insert(array('data' => sha1(rand()) ),array('fsync' => true)); } $end = microtime(TRUE); echo 'fsync - time taken: '.($end-$start)." seconds \n"; $start = microtime(TRUE); for ($i=0;$i<10000;$i++) { $collection->insert(array('data' => sha1(rand()) ),array('safe' => true)); } $end = microtime(TRUE); echo 'safe=true - time taken: '.($end-$start)." seconds \n"; ?>
I’m not sure that the existing number of records will make a massive amount of difference besides through the pre-allocation of files which we have little control of anyway - but it doesn’t look like there is an increase between runs even when there are a lot of entries… (perhaps we’d see more with indexes enabled)
Each run will add an extra 20,000 entries into the collection with little perceptable slowdown.
root@test:/var/www/test# php bench1.php default - time taken: 0.53534507751465 seconds safe=true - time taken: 1.2793118953705 seconds root@test:/var/www/test# php bench1.php default - time taken: 0.203537940979 seconds safe=true - time taken: 1.2887620925903 seconds root@test:/var/www/test# php bench1.php default - time taken: 0.22933197021484 seconds safe=true - time taken: 1.6565799713135 seconds root@test:/var/www/test# php bench1.php default - time taken: 0.19606184959412 seconds safe=true - time taken: 1.5315411090851 seconds root@test:/var/www/test# php bench1.php default - time taken: 0.2510199546814 seconds safe=true - time taken: 1.2419080734253 seconds
It is hard testing on a cloud server as you are at the mercy of other users impacting the available bandwidth and processor utilisation, but you can at least see trends. I hope this has been enlightening and I hope to expand on this in future…
Edit: for the one person that asked me about storage efficiency… here goes…
> db.bench.stats() { "ns" : "bench.bench", "count" : 140001, "size" : 10640108, "avgObjSize" : 76.00022856979594, "storageSize" : 21250048, "numExtents" : 7, "nindexes" : 1, "lastExtentSize" : 10067968, "paddingFactor" : 1, "flags" : 1, "totalIndexSize" : 4562208, "indexSizes" : { "_id_" : 4562208 }, "ok" : 1 }
So based on this… we can work out that size/storageSize = approx 50% efficiency… so MongoDB on this dataset is using about the same again for the data storage.
If we add in indexes size/(storageSize+totalIndexSize) then the result is only about 41% efficient. I think this is a reasonable tradeoff for the raw speed it gives personally…
tags: