SpiderMonkey to V8 for MongoDB and mongometer
With 10gen switching the default JavaScript engine for MongoDB 2.3/2.4 from SpiderMonkey to V8 I thought I’d take the opportunity to compare the relative performances of the releases using mongometer. Being a Security bod, I really should have looked at the Additional Authentication Features first… Hey ho.
I’ll document the steps taken during the comparison, including the set up, so this can be repeated and validated – just in case anyone is interested – but mainly so I can remind myself of what I did; memory, sieve.
The set up
I’m going to install 2.2.2 and 2.3.2 side-by-side on a dedicated machine. I’ll then use the latest version of the Java driver with mongometer.
$ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.3.2.tgz $ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.3.2.tgz.md5
I got a 403 response for this request…
$ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.2.2.tgz $ wget http://fastdl.mongodb.org/linux/mongodb-linux-x86_64-2.2.2.tgz.md5 $ md5sum -c mongodb-linux-x86_64-2.2.2.tgz.md5 md5sum: mongodb-linux-x86_64-2.2.2.tgz.md5: no properly formatted MD5 checksum lines found
Grrr. An md5 file is supposed to be the checksum (then x2 spaces) and then the filename of the file being checksummed. I’ll have to eyeball them instead, well, eyeball the one that I could actually download…
$ md5sum mongodb-linux-x86_64-2.2.2.tgz be0f5969b0ca23a0a383e4ca2ce50a39 mongodb-linux-x86_64-2.2.2.tgz $ cat mongodb-linux-x86_64-2.2.2.tgz.md5 be0f5969b0ca23a0a383e4ca2ce50a39
Configure
$ tar -zxvf ~/mongodb-linux-x86_64-2.2.2.tgz $ sudo mkdir -p /usr/lib/mongodb/2.2.2 $ sudo mv mongodb-linux-x86_64-2.2.2/* /usr/lib/mongodb/2.2.2/ $ rm -r mongodb-linux-x86_64-2.2.2 $ sudo mkdir -p /data/db/2.2.2 $ sudo chown `id -un` /data/db/2.2.2 $ /usr/lib/mongodb/2.2.2/bin/mongod --port 27000 --dbpath /data/db/2.2.2 --logpath /data/db/2.2.2/mongod.log $ tar -zxvf ~/mongodb-linux-x86_64-2.3.2.tgz $ sudo mkdir -p /usr/lib/mongodb/2.3.2 $ sudo mv mongodb-linux-x86_64-2.3.2/* /usr/lib/mongodb/2.3.2/ $ rm -r mongodb-linux-x86_64-2.3.2 $ sudo mkdir -p /data/db/2.3.2 $ sudo chown `id -un` /data/db/2.3.2 $ /usr/lib/mongodb/2.3.2/bin/mongod --port 27001 --dbpath /data/db/2.3.2 --logpath /data/db/2.3.2/mongod.log
Let’s check they are running.
$ ps -ef | grep mongod 1795 /usr/lib/mongodb/2.2.2/bin/mongod --port 27000 --dbpath /data/db/2.2.2 --logpath /data/db/2.2.2/mongod.log 2059 /usr/lib/mongodb/2.3.2/bin/mongod --port 27001 --dbpath /data/db/2.3.2 --logpath /data/db/2.3.2/mongod.log
Now, let’s kill one (gracefully) and move on to the interesting stuff.
$ sudo kill -15 2059 $ ps -ef | grep mongod 1795 /usr/lib/mongodb/2.2.2/bin/mongod --port 27000 --dbpath /data/db/2.2.2 --logpath /data/db/2.2.2/mongod.log
Now I’m jumping on to another box.
$ wget https://github.com/downloads/mongodb/mongo-java-driver/mongo-2.10.1.jar $ cp mongo-2.10.1.jar /usr/lib/jmeter/2.8/lib/ext $ cp ~/IdeaProjects/mongometer/out/artifacts/mongometer_jar/mongometer.jar /usr/lib/jmeter/2.8/lib/ext $ /usr/lib/jmeter/2.8/bin/jmeter.sh
The tests
The tests are really rather basic; I’ll perform an insert into two different databases, and perform finds against those databases.
Version 2.2.2
show dbs local 0.078125GB
> show dbs jmeter 0.203125GB jmeter2 0.203125GB local 0.078125GB > use jmeter > db.jmeter.find().count() 1000 > db.dropDatabase() > use jmeter2 > db.jmeter.find().count() 1000 > db.dropDatabase() $ ps -ef | grep mongo 2690 /usr/lib/mongodb/2.2.2/bin/mongod --port 27000 --dbpath /data/db/2.2.2 --logpath /data/db/2.2.2/mongod.log $ sudo kill -15 2690 $ ps -ef | grep mongo
Nothing. Let’s get the 2.3.2 instance up and running.
$ /usr/lib/mongodb/2.3.2/bin/mongod --port 27001 --dbpath /data/db/2.3.2 --logpath /data/db/2.3.2/mongod.log $ ps -ef | grep mongo 2947 /usr/lib/mongodb/2.3.2/bin/mongod --port 27001 --dbpath /data/db/2.3.2 --logpath /data/db/2.3.2/mongod.log
Version 2.3.2
> show dbs local 0.078125GB
> show dbs jmeter 0.203125GB jmeter2 0.203125GB local 0.078125GB > use jmeter > db.jmeter.find().count() 1000 > db.dropDatabase() > use jmeter2 > db.jmeter.find().count() 1000 > db.dropDatabase()
Conclusions
I guess you should draw your own. I ran this a couple of times and am considering scripting it so the environments are cleaned down prior to each run, I could probably add more complex queries too. Perhaps if I find some time next weekend then I will.
Reference: SpiderMonkey to V8 for MongoDB and mongometer from our JCG partner Jan Ettles at the Exceptionally exceptional exceptions blog.