在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的性能,跟踪慢操作的方式,如:
- 查询运行5s以上的请求
db.currentOp({"secs_running":{$gt:5}})
- 结果中会显示出opid,使用db.killOp(opid)干掉慢请求;
db.currentOp({"ns" : "tms3.task.devmapping","secs_running":{$gt:5}})
db.killOp(665906581)
- 查看当前有多少个连接?
db.serverStatus().connections