MongoDB分析工具:db.currentOp()

1,810 阅读2分钟

在mongodb中可以查看当前数据库上此刻的操作语句信息,包括insert/query/update/remove/getmore/command等多种操作。直接执行

db.currentOp()一般返回一个空的数组,我们可以指定一个参数true,这样就返回用户connections与系统cmmand相关的操作。db.currentOp(true) 会返回很多信息:

root:PRIMARY> db.currentOp()
{
    "inprog" : [
        {
            "opid" : 6222,   #进程号
            "active" : true, #是否活动状态
            "secs_running" : 3,#操作运行了多少秒
            "microsecs_running" : NumberLong(3662328),#操作持续时间(以微秒为单位)。MongoDB通过从操作开始时减去当前时间来计算这个值。
            "op" : "getmore",#操作类型,包括(insert/query/update/remove/getmore/command)
            "ns" : "local.oplog.rs",#命名空间
            "query" : {#如果op是查询操作,这里将显示查询内容;也有说这里显示具体的操作语句的
                 
            },
            "client" : "192.168.91.132:45745",#连接的客户端信息
            "desc" : "conn5",#数据库的连接信息
            "threadId" : "0x7f1370cb4700",#线程ID
            "connectionId" : 5,#数据库的连接ID
            "waitingForLock" : false,#是否等待获取锁
            "numYields" : 0,#numyield是一个计数器,它报告操作已经让步多少次,以允许其他操作完成。
            通常,当需要访问MongoDB尚未完全读入内存的数据时,操作会产生收益。这允许其他在内存中有数据的操作在MongoDB为生成操作读入数据时快速完成。
            "lockStats" : {
               "Global": {#表示全局锁
                    "acquireCount": {#操作以指定模式获取锁的次数。
                       "r": <NumberLong>,#表示共享的意图(IS)锁。
                       "w": <NumberLong>,#表示意图独占(IX)锁。
                       "R": <NumberLong>,#表示共享锁
                       "W": <NumberLong>#表示排他(X)锁。
                    },
                    "acquireWaitCount": {#由于锁处于冲突模式下,操作必须 await acquireCount锁获取的次数。 acquireWaitCount小于或等于acquireCount。
                       "r": <NumberLong>
                    },
                    "timeAcquiringMicros" : {#操作必须await以获取锁的累积时间(以微秒为单位)
                    timeAcquiringMicros除以acquireWaitCount得出特定锁定模式的平均 await 时间。
                       "r" : NumberLong(0)
                    },
                    "deadlockCount" : {#在等待锁获取时,操作遇到死锁的次数。
                       "r" : NumberLong(0)
                    }
                 }               
            }
        }
    ]
}

重点关注以下几个字段:

字段说明
active指定操作是否已启动的布尔值。
opid操作的opid,有需要的话,可以通过db.killOp(opid) 直接终止该操作。
secs_running/microsecs_running这个值重点关注,代表请求运行的时间,如果这个值特别大,请看看请求是否合理。
op操作类型,包括(insert/query/update/remove/getmore/command),其中command操作包括大多数命令,如createIndexes和findandmodify。
query/ns这个字段能看出是对哪个集合正在执行什么操作。
lock*- 还有一些跟锁相关的参数,需要了解可以看官网文档,本文不做详细介

Kill 慢操作

慢操作会严重影响Mongo的性能,跟踪慢操作的方式,如:

  1. 查询运行5s以上的请求
db.currentOp({"secs_running":{$gt:5}}) 
  1. 结果中会显示出opid,使用db.killOp(opid)干掉慢请求;
db.currentOp({"ns" : "tms3.task.devmapping","secs_running":{$gt:5}})
db.killOp(665906581)
  1. 查看当前有多少个连接?
db.serverStatus().connections