db.currentOp是个好东西,顾名思义,就是当前的操作。在mongodb中可以查看当前数据库上此刻的操作语句信息,包括insert/query/update/remove/getmore/command等多种操作。直接执行
db.currentOp()一般返回一个空的数组,我们可以指定一个参数true,这样就返回用户connections与系统cmmand相关的操作。下面看个列子:
db.currentOp(true) 会返回很多信息:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
|
{ "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()//某个数据库实例的写锁
}
}
},
.....
]
}
|
注:
1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s)
1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s)
查看db.currentOp函数定义
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;
}
// 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
}
打印客户端信息
1
2
3
4
5
6
|
db.currentOp(
true
).inprog.forEach(
function
(opDoc){
if
(opDoc.client)
printjson(opDoc.client)
}
)
|
还可以获取当前操作中,已停止活动 并且操作行为为query的信息
1
2
3
4
5
6
|
db.currentOp(
true
).inprog.forEach(
function
(opDoc){
//opDoc其实是返回的每个op操作对象
if
(!opDoc.active && opDoc.op==
'query'
)
printjson(opDoc)
}
)
|
还可以获取当前操作中,正在进行中 并且操作行为为query的信息
1
2
3
4
5
6
|
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正在进行中的。
本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1706481 ,如需转载请自行联系原作者