MongoDB的db.currentOp()輸出結果分析

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正在進行中的。

相關文章
相關標籤/搜索