Sometimes you may notice that everything in MongoDB is running fine, then you suddenly have performance issues that come up out of nowhere. There can be several reasons why this happens but I am going to cover a few of the common ones here.
- Long-running queries
- Index Builds
- Write contention
MongoDB Slow Queries
Some large queries can take awhile to run but there are some reasons why a query is running long when it shouldn’t be.
Some tools you can use to identify long running queries:
- Server Logs
- egrep “[0-9]{3,}ms” mongod.log | awk ‘{ print $NF, $0}’ | grep query | sort -n | tail -n 5
- egrep “[0-9]{3,}ms” mongod.log | awk ‘{ print $NF, $0}’ | grep orderby | sort -n | tail -n 5
- db.currentOp()
- Turning on the profiler
- db.setProfilingLevel(
, ) - ms is the threshold for logging a query based on the time it took to complete
Once you have identified the query, you can determine if it’s doing a collection scan, if it has a poorly anchored regex or your index is just inefficient.
Index Builds
Index builds can block write operations on your database, so you don’t want to build indexes in the foreground on large tables during peak usage. You can use the background creation of indexes by specifying background: true when creating.
db.collection.createIndex({ a:1 }, { background: true })
This will ultimately take longer to complete, but it will not block operations and will have less of an impact on performance.
Write Contention
If several writers are attempting to update a document, you can run into an issue where writers are competing for locks on the database. You can check the lock status to see if there is an issue by using these commands:
These commands can be used inside the MongoDB Shell:
- db.serverStatus()
- db.currentOp()
These commands can be run straight from the command line:
- Mongotop
- Mongostat
These will provide insight into the amount of lock contention in your MongoDB instance. You can read more about write contention and concurrency in the Mongo Docs or get help from our experts.