Benchmarking MongoDB in a container
The database layer for an application is one of the most crucial part because believe it or not it effects the performance of your application, now with micro-services getting the attention I was just wondering if having a database container will make a difference.
As we have popularly seen most of the containers used are stateless containers that means that they don’t retain the data they generate but there is a way to have stateful containers and that is by mounting a host volume in the container. Having said this there could be an issue with the latency in the database request, I wanted to measure how much will this latency be and what difference will it make if the installation is done natively verses if the installation is done in a container.
I am going to run a simple benchmarking scheme I will make 200 insert request that is write request keeping all other factors constant and will plot the time taken for these request and see what comes out of it.
I borrowed a quick script to do the same from this blog. The script is simple it just uses pymongo
the python MongoDB
driver to connect to the database and make 200 entries in a random database.
import time import pymongo m = pymongo.MongoClient()
doc = {'a': 1, 'b': 'hat'}
i = 0
while (i < 200):
start = time.time() m.tests.insertTest.insert(doc, manipulate=False, w=1) end = time.time()
executionTime = (end - start) * 1000 # Convert to ms
print executionTime
i = i + 1
So I went to install MongoDB
natively first I ran the above script twice and took the second result into consideration. Once I did that I plotted the graph with value against the number of request. The first request takes time because it requires to make connection and all the over head and the plot I got looked like this.
MongoDb Native Time taken in ms v/s Number of request
The graph shows that the first request took about 6 ms but the consecutive requests took way lesser time.
Now it was time I try the same to do it in a container so I did a docker pull mongo
and then I mounted a local volume in the container and started the container by
docker run --name some-mongo -v /Users/farhaanbukhsh/mongo-bench/db:/data/db -d mongo
This mounts the volume I specified to /data/db
in the container then I did a docker cp
of the script and installed the dependencies and ran the script again twice so that file creation doesn’t manipulate the time.
To my surprise the first request took about 4ms but subsequent requests took a lot of time.
MongoDB running in a container(Time in ms v/s Number of Requests)
And when I compared them the time time difference for each write or the latency for each write operation was considerable
.
Comparison between Native and Containered MongoDB
I had this thought that there will be difference in time and performance but never thought that it would be this huge, now I am wondering what is the solution to this performance issue, can we reach a point where the containered performance will be as good as native.
Let me know what do you think about it.
Happy Hacking!