在 CentOS 上排查 MongoDB 慢查询,一般从以下几个步骤入手:
mongo
db.getProfilingStatus()
常见输出:
{ "was" : 0, "slowms" : 100 }
was: 0 表示未开启 profilingslowms: 100 表示超过 100ms 的操作为慢查询db.setProfilingLevel(1, 100)
1:记录慢查询100:超过 100ms 的语句全局开启(所有库):
db.setProfilingLevel(1, 100)
use admin
db.runCommand({ profile: 1, slowms: 100 })
关闭:
db.setProfilingLevel(0)
db.system.profile.find().sort({ ts: -1 }).limit(10).pretty()
常用过滤:
db.system.profile.find({ millis: { $gt: 500 } }).pretty()
cat /etc/mongod.conf | grep -i log
一般路径:
/var/log/mongodb/mongod.log
tail -f /var/log/mongodb/mongod.log | grep "COMMAND"
db.collection.find({ ... }).explain("executionStats")
关注重点:
executionTimeMillistotalKeysExaminedtotalDocsExaminedIXSCAN vs COLLSCAN)db.currentOp({ "active" : true, "secs_running" : { "$gt" : 5 } })
杀掉慢查询(谨慎):
db.killOp(opid)
db.collection.getIndexes()
创建索引示例:
db.collection.createIndex({ field: 1 })
top
iostat -x 1
free -h
df -h
iotop
slowms 设为 100~200msprofile=2如果你愿意,可以贴一下:
explain 结果我可以帮你直接分析优化方案。