MongoDB的db.currentOp()输出结果分析mongodb
db.currentOp是个好东西,顾名思义,就是当前的操做。在mongodb中能够查看当前数据库上此刻的操做语句信息,包括insert/query/update/remove/getmore/command等多种操做。直接执行数据库
db.currentOp()通常返回一个空的数组,咱们能够指定一个参数true,这样就返回用户connections与系统cmmand相关的操做。下面看个列子:json
db.currentOp(true) 会返回不少信息:数组
{ "inprog" : [ { "opid" : 3434473,//操做的id "active" : <boolean>,//是否处于活动状态 "secs_running" : 0,//操做运行了多少秒 "op" : "<operation>",//具体的操做行为,包括(insert/query/update/remove/getmore/command) "ns" : "<database>.<collection>",//操做的命名空间,如:数据库名.集合名 "query" : {//具体的操做语句 }, "client" : "<host>:<outgoing>",//链接的客户端信息 "desc" : "conn57683",//数据库链接描述 "threadId" : "0x7f04a637b700",//线程id "connectionId" : 57683,//数据库链接id "locks" : {//锁的相关信息 "^" : "w", "^local" : "W", "^<database>" : "W" }, "waitingForLock" : false,//是否在等待并获取锁, "msg": "<string>" "numYields" : 0, "progress" : { "done" : <number>, "total" : <number> } "lockStats" : { "timeLockedMicros" : {//此操做得到如下锁后,把持的微秒时间 "R" : NumberLong(),//整个mongodb服务实例的全局读锁 "W" : NumberLong(),//整个mongodb服务实例的全局写锁 "r" : NumberLong(),//某个数据库实例的读锁 "w" : NumberLong() //某个数据库实例的写锁 }, "timeAcquiringMicros" : {//此操做为了得到如下的锁,而耗费等待的微秒时间 "R" : NumberLong(),//整个mongodb服务实例的全局读锁 "W" : NumberLong(),//整个mongodb服务实例的全局写锁 "r" : NumberLong(),//某个数据库实例的读锁 "w" : NumberLong()//某个数据库实例的写锁 } } }, ..... ] }
注:ide
1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)函数
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)ui
查看db.currentOp函数定义this
rs_test:SECONDARY> db.currentOp
function ( arg ){
var q = {}
if ( arg ) {
if ( typeof( arg ) == "object" )
Object.extend( q , arg );
else if ( arg )
q["$all"] = true;
}spa
// don't send any read preference with psudo commands
var _readPref = this.getMongo().getReadPrefMode();
try {
this.getMongo().setReadPref(null);
var results = this.$cmd.sys.inprog.findOne( q );
} finally {
this.getMongo().setReadPref(_readPref);
}线程
return results
}
打印客户端信息
db.currentOp(true).inprog.forEach( function(opDoc){ if (opDoc.client) printjson(opDoc.client) } )
还能够获取当前操做中,已中止活动 而且操做行为为query的信息
db.currentOp(true).inprog.forEach( function(opDoc){//opDoc实际上是返回的每一个op操做对象 if(!opDoc.active && opDoc.op=='query') printjson(opDoc) } )
还能够获取当前操做中,正在进行中 而且操做行为为query的信息
db.currentOp(true).inprog.forEach( function(opDoc){//opDoc实际上是返回的每一个op操做对象 if(opDoc.active && opDoc.op=='query') printjson(opDoc) } )
经过以上监控若是发现某个操做比较慢,还能够对其进行kill:
db.killOp(opid) //kill当前的操做 opid为具体的操做id号,固然了,只能kill正在进行中的。