MongoDB的db.currentOp()输出结果分析

本文介绍如何使用db.currentOp函数监控MongoDB当前的操作情况,包括如何查看正在进行的各种操作、获取操作详细信息以及如何终止特定操作。

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 ,如需转载请自行联系原作者


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值