天天看點

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

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

<code>    </code><code>{ "inprog" :   </code>

<code>        </code><code>[   </code>

<code>            </code><code>{  </code>

<code>                        </code><code>"opid" : 3434473,//操作的id  </code>

<code>                        </code><code>"active" : &lt;boolean&gt;,//是否處于活動狀态  </code>

<code>                        </code><code>"secs_running" : 0,//操作運作了多少秒  </code>

<code>                        </code><code>"op" : "&lt;operation&gt;",//具體的操作行為,包括(insert/query/update/remove/getmore/command)  </code>

<code>                        </code><code>"ns" : "&lt;database&gt;.&lt;collection&gt;",//操作的命名空間,如:資料庫名.集合名  </code>

<code>                        </code><code>"query" : {//具體的操作語句  </code>

<code>                        </code><code>},  </code>

<code>                        </code><code>"client" : "&lt;host&gt;:&lt;outgoing&gt;",//連接配接的用戶端資訊  </code>

<code>                        </code><code>"desc" : "conn57683",//資料庫連接配接描述  </code>

<code>                        </code><code>"threadId" : "0x7f04a637b700",//線程id  </code>

<code>                        </code><code>"connectionId" : 57683,//資料庫連接配接id  </code>

<code>                        </code><code>"locks" : {//鎖的相關資訊  </code>

<code>                                </code><code>"^" : "w",  </code>

<code>                                </code><code>"^local" : "W",  </code>

<code>                                </code><code>"^&lt;database&gt;" : "W"  </code>

<code>                        </code><code>"waitingForLock" : false,//是否在等待并擷取鎖,  </code>

<code>                        </code><code>"msg": "&lt;string&gt;"  </code>

<code>                        </code><code>"numYields" : 0,  </code>

<code>                        </code><code>"progress" : {  </code>

<code>                                </code><code>"done" : &lt;number&gt;,  </code>

<code>                                </code><code>"total" : &lt;number&gt;  </code>

<code>                        </code><code>}  </code>

<code>                        </code><code>"lockStats" : {  </code>

<code>                                </code><code>"timeLockedMicros" : {//此操作獲得以下鎖後,把持的微秒時間  </code>

<code>                                        </code><code>"R" : NumberLong(),//整個mongodb服務執行個體的全局讀鎖  </code>

<code>                                        </code><code>"W" : NumberLong(),//整個mongodb服務執行個體的全局寫鎖  </code>

<code>                                        </code><code>"r" : NumberLong(),//某個資料庫執行個體的讀鎖  </code>

<code>                                        </code><code>"w" : NumberLong() //某個資料庫執行個體的寫鎖  </code>

<code>                                </code><code>},  </code>

<code>                                </code><code>"timeAcquiringMicros" : {//此操作為了獲得以下的鎖,而耗費等待的微秒時間  </code>

<code>                                        </code><code>"w" : NumberLong()//某個資料庫執行個體的寫鎖  </code>

<code>                                </code><code>}  </code>

<code>                </code><code>},  </code>

<code>                </code><code>.....  </code>

<code>              </code> 

<code>        </code><code>]   </code>

<code>    </code><code>}</code>

注:

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

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

檢視db.currentOp函數定義

rs_test:SECONDARY&gt; 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   

}

列印用戶端資訊   

<code>    </code><code>db.currentOp(</code><code>true</code><code>).inprog.forEach(    </code>

<code>        </code><code>function</code><code>(opDoc){    </code>

<code>            </code><code>if</code> <code>(opDoc.client)    </code>

<code>        </code><code>printjson(opDoc.client)    </code>

<code>        </code><code>}    </code>

<code>    </code><code>)</code>

還可以擷取目前操作中,已停止活動 并且操作行為為query的資訊   

<code>    </code><code>db.currentOp(</code><code>true</code><code>).inprog.forEach(  </code>

<code>       </code><code>function</code><code>(opDoc){</code><code>//opDoc其實是傳回的每個op操作對象  </code>

<code>         </code><code>if</code><code>(!opDoc.active &amp;&amp; opDoc.op==</code><code>'query'</code><code>)  </code>

<code>            </code><code>printjson(opDoc)  </code>

<code>         </code><code>}  </code>

<code>     </code><code>)</code>

還可以擷取目前操作中,正在進行中 并且操作行為為query的資訊   

<code>      </code><code>function</code><code>(opDoc){</code><code>//opDoc其實是傳回的每個op操作對象  </code>

<code>        </code><code>if</code><code>(opDoc.active &amp;&amp; opDoc.op==</code><code>'query'</code><code>)  </code>

<code>           </code><code>printjson(opDoc)  </code>

<code>        </code><code>}  </code>

通過以上監控如果發現某個操作比較慢,還可以對其進行kill:

   db.killOp(opid) //kill目前的操作 opid為具體的操作id号,當然了,隻能kill正在進行中的。

本文轉自UltraSQL51CTO部落格,原文連結:http://blog.51cto.com/ultrasql/1706481 ,如需轉載請自行聯系原作者