MongoDB 响应慢如何排查?
1 MongoDB 慢查询
db.setProfilingLevel(1,100)
for (var i=1; i<=300000; i++ ) db.userinfo.save({userid:i,username:'a'});
db.userinfo.find({"userid" : 29998}).explain()
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: 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
command 表示使用的命令; planSummary 表示执行计划; COLLSCAN 表示全表扫描; COLLSCAN 中的 keysExamined 表示是否走索引; COLLSCAN 中的 docsExamined 表示扫描文档数(类似MySQL的扫描行数); locks 锁相关信息; locks 中的 Database 表示库级别的锁情况; locks 中的 Collection 表示表级别的锁情况; protocol:op_msg 142ms 表示执行时间 142 毫秒。
pip3 install mtools
/usr/local/python3/bin/mloginfo --queries /data/mongo4/logs/mongod.log
2 mongostat 排查
另外可以考虑使用 mongostat 进行排查,它的输出结果如下:
mongostat --host 192.168.150.232:27001
insert、query、update、delete、getmore、command 表示近1秒这类操作的次数,观察这几个字段的值是否比平时高很多; dirty 表示脏数据(未刷盘的数据)占总内存数据的比例,仅针对 WiredTiger 存储引擎,如果该值过高,可能会阻塞新请求; used WiredTiger 存储引擎内存使用率,如果内存使用率过高,需要判断是否需要增加内存; flushes 表示近1秒数据刷新到磁盘的次数,仅针对 WiredTiger 存储引擎; vsize 表示使用了多少虚拟内存; res 表示实际使用的内存大小,如果内存使用的比较大,需要确定是否需要增加内存; qrw 表示读写等待的队列长度; arw 执行读写操作的活跃客户端数,看是否是短时间活跃连接数突增导致的响应变慢; net_in、net_out 进出流量,通过进出流量同样可以判断是否有访问量突增的情况; conn 连接数; set 副本集的名称; repl 复制的状态; time 当前时间。
3 mongotop 排查
mongotop --host 192.168.150.232:27001
其中:
ns 表示数据库命名空间; total、read、write 具体操作花费的时间。
来自:公众号-悦专栏
相关文章