在工作中,我们可能会遇到 MongoDB 响应慢的情况,这一节内容,来聊聊当出现这种情况时,应该怎样去排查?
MongoDB 响应慢,可能大部分原因是慢查询导致的,这里通过一个实验来聊聊 MongoDB 慢查询。
开启慢查询:
db.setProfilingLevel(1,100)
表示记录执行时间超过 100ms 的语句。
导入数据并制造慢查询(这里是为了我们这次实验能看到慢查询,如果是线上环境排查问题,这一步忽略):
for (var i=1; i<=300000; i++ ) db.userinfo.save({userid:i,username:'a'});
db.userinfo.find({"userid" : 29998}).explain()
可以在日志文件中查看到执行时间超过 100ms 的慢查询日志:
2022-04-15T13:44:13.418+0800 I COMMAND [conn4] command martin.userinfo appName: "MongoDB Shell" command: find { find: "userinfo", filter: { userid: 29998.0 }, lsid: { id: UUID("7529eb75-cffa-4164-a8d4-e4730d735c2b") }, $db: "martin" } planSummary: COLLSCAN keysExamined:0 docsExamined:300000 cursorExhausted:1 numYields:2343 nreturned:1 queryHash:37A12FC3 planCacheKey:37A12FC3 reslen:161 locks:{ ReplicationStateTransition: { acquireCount: { w: 2344 } }, Global: { acquireCount: { r: 2344 } }, Database: { acquireCount: { r: 2344 } }, Collection: { acquireCount: { r: 2344 } }, Mutex: { acquireCount: { r: 1 } } } storage:{} protocol:op_msg 142ms
其中:
有时,我们要统计某一类慢查询执行的总数,这时,可以采用 mtools 中的 mloginfo 来分析 MongoDB 慢查询。
开源工具 mtools 可用来解析、过滤和可视化 MongoDB 日志。Github地址:https://github.com/rueckstiess/mtools。
安装 mtools:
pip3 install mtools
使用 mloginfo 来分析慢查询日志:
/usr/local/python3/bin/mloginfo --queries /data/mongo4/logs/mongod.log
可以看到不同类型的慢查询总体的统计结果。
另外可以考虑使用 mongostat 进行排查,它的输出结果如下:
mongostat --host 192.168.150.232:27001
其中:
mongotop 可以查看每个操作上所花费的时间。
mongotop --host 192.168.150.232:27001
其中:
今天的内容就到这里,在后面的内容,我们会聊一下从 0 到 1 搭建 MongoDB 监控系统。欢迎关注。