mongodb系列之-管理mongodb->db.currentOp()

今天公司的dba在內部分享了針對mysql上具體的每個crud語句操作如何進行控制管理(利用的inntop工具),挺好的。這裏,我也獻醜下,在mongodb中如何管理具體的每個crud操作(比如某個查詢語句慢,太佔資源,直接可以將其kill掉,這貌似很暴力哈,不過沒關係,有時候不得已而爲之...不過mongodb中可不是用第三方的工具哦,而是自家實現的功能)

 

 currentOp是個好東西,顧名思義,就是當前的操作。在mongodb中可以查看當前數據庫上此刻的操作語句信息,包括insert/query/update/remove/getmore/command等多種操作。直接執行db.currentOp()一般返回一個空的數組,我們可以指定一個參數true,這樣就返回用戶connections與系統cmmand相關的操作。下面看個列子:

 

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()//某個數據庫實例的寫鎖
                             }
                     }
             },
             .....
			
		] 
	}
	

 

 

注:

1秒=1000毫秒(ms) 1毫秒=1/1,000秒(s) 

1秒=1,000,000 微秒(μs) 1微秒=1/1,000,000秒(s) 

 

 

 

比如可以獲取當前操作中,

--已停止活動 並且操作行爲爲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正在進行中的

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章