mongo性能分析工具詳解

jopen 10年前發布 | 32K 次閱讀 NoSQL數據庫 Mongo

mongodb新手, 請指正。

1 查看鎖

db.serverStatus()["globalLock"]


{
    "totalTime" : NumberLong("59472944000"),
    "lockTime" : NumberLong(296702397),
    "currentQueue" : {
        "total" : 9,
        "readers" : 9,
        "writers" : 0
    },
    "activeClients" : {
        "total" : 1,
        "readers" : 0,
        "writers" : 1
    }
}
totalTime是數據庫啟動之后的總時間, 單位是micro second


lockTime為處于鎖定狀態的時間。 如果鎖定狀態的時間占總時間較大的比例的話,說明很多請求實際上是在等待鎖的釋放。

current queue表示等待鎖的請求數量。 reader表示在等待讀鎖的請求數量。 writers表示等待寫鎖的請求數量。

active clients表示處于連接狀態的client的數量。

db.serverStatus()["locks"] 這個命令可以從一個更細的粒度查看鎖的情況。


{
    "." : {
        "timeLockedMicros" : {
            "R" : NumberLong(27575643),
            "W" : NumberLong(300769879)
        },
        "timeAcquiringMicros" : {
            "R" : NumberLong("7300086599"),
            "W" : NumberLong(921784415)
        }
    },
    "admin" : {
        "timeLockedMicros" : {
            "r" : NumberLong(4879),
            "w" : NumberLong(0)
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong(123),
            "w" : NumberLong(0)
        }
    },
    "local" : {
        "timeLockedMicros" : {
            "r" : NumberLong(104231010),
            "w" : NumberLong(171946358)
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong(740624790),
            "w" : NumberLong(292131659)
        }
    },
    "user" : {
        "timeLockedMicros" : {
            "r" : NumberLong("34795096720"),
            "w" : NumberLong("12286042695")
        },
        "timeAcquiringMicros" : {
            "r" : NumberLong("67754724106"),
            "w" : NumberLong("10418999128")
        }
    }
}
"."這一節代表全局鎖的鎖定時間和等待時間。其他的是各個db的鎖定時間。鎖定時間長,代表長時間查詢過多。


2 查看collection的狀態

命令: db.collection.stats()


db.channels.stats()
{
    "ns" : "user.channels",
    "count" : 53409370,
    "size" : 14972217152,
    "avgObjSize" : 280.3294094650433,
    "storageSize" : 20933169056,
    "numExtents" : 30,
    "nindexes" : 3,
    "lastExtentSize" : 2146426864,
    "paddingFactor" : 1.0060000002673208,
    "systemFlags" : 1,
    "userFlags" : 0,
    "totalIndexSize" : 6916577136,
    "indexSizes" : {
        "_id_" : 2258914336,
        "usrID_1" : 2033027808,
        "num_1" : 2624634992
    },
    "ok" : 1
}
 count是記錄數量, size是總共的字節數。 avgObjSize是平均的 字節數。


3 mongostat命令

mongostat


insert  query update delete getmore command flushes mapped  vsize    res faults  locked db idx miss %     qr|qw   ar|aw  netIn netOut  conn repl       time 
     2    108      4     *0       8     5|0       0    42g  84.4g  1.82g     61  user:0.4%          0       0|0     0|0    14k    58m    14  PRI   16:31:28 
    56     74      5      1      25     7|0       0    42g  84.4g  1.82g     29 user:15.2%          0       0|0     0|0    25k    34m    14  PRI   16:31:29 
   217     84      5      1      43     7|0       0    42g  84.4g  1.83g     76 user:10.5%          0       0|0     0|0    64k    56m    14  PRI   16:31:30 
     1     73      3     *0       4     4|0       0    42g  84.4g  1.81g     18  user:6.2%          0       0|0     0|0     9k    41m    14  PRI   16:31:31 
    *0     56      5     *0      12     4|0       0    42g  84.4g   1.8g     17  user:0.6%          0       0|0     0|0     8k    43m    14  PRI   16:31:32 
     2     78      5      1      45     7|0       0    42g  84.4g   1.8g     16  user:6.6%          0       0|0     0|0    17k    16m    14  PRI   16:31:33 
    *0     84      4      1       6     6|0       0    42g  84.4g  1.78g     67  user:8.4%          0       0|0     4|0    10k     8m    14  PRI   16:31:34
類似vmstat, 每秒鐘會打印一行數據。


insert query update delete分別代表一秒鐘之內執行的操作次數。

res是mongod所占用的物理內存, faluts表示page faults的次數。

locked db是一個字段。 2.2之前是用locked字段。 2.2之后才有這個字段。 這個字段的含義, 不是太明白。 只能明確1點, 即展示的是所有db里面鎖定時間 最長的db 。 可以參詳一下官網原文:


The percent of time in the per-database context-specific lock. mongostat will report the database that has spent the most time since the last mongostat call with a write lock.

This value represents the amount of time that the listed database spent in a locked state combined with the time that the mongod spent in the global lock. Because of this, and the sampling method, you may see some values greater than 100%.
index miss是索引缺失的數量


qr|qw 表示在隊列中等待的客戶端。 rw表示讀和寫。

ar|aw 表示正在進行請求的客戶端。 rw表示讀和寫。 至于為什么為0我也不是很明白。

netIn 和 netOut表示網絡流量,單位是字節 byte.

conn表示連接數,這個沒有什么好說。

repl表示同步狀態。官網給出文檔是這樣:


M    master
SEC     secondary
REC     recovering
UNK     unknown
SLV     slave
在我mongo 2.4.8的機器上,


PRI表示主機。SLV表示從機。

4 profiling

profiling是設置一個全server級別的慢日志,將慢查詢保存下來。 慢查詢的數據會保存到 system.profile中。

打開profiling:

>db.setProfilingLevel(1,1000)
{ "was" : 0, "slowms" : 20, "ok" : 1 }
第一個參數表示Profile的級別, 第二個參數是定義慢查詢的閾值。

profile級別0不保存, 1只保存慢查詢,2保存所有查詢。

注意級別是對應當前的數據庫, 而閾值是全局的。

查看profiling狀態:

>db.getProfilingStatus()
{ "was" : 1, "slowms" : 1000 }
關閉profiling:

>db.setProfilingLevel(0, 1000)
查看慢查詢, 其實就是在system.profile里查:
db.system.profile.find({"op":"query"}).sort({"ts":-1}).limit(1).pretty()
{
        "op" : "query",
        "ns" : "user.channels",
        "query" : {
                "$query" : {
                        "usrID" : "364076",
                        "status" : 1
                },
                "orderby" : {
                        "num" : 1
                }
        },
        "ntoreturn" : 0,
        "ntoskip" : 0,
        "nscanned" : 544,
        "scanAndOrder" : true,
        "keyUpdates" : 0,
        "numYield" : 20,
        "lockStats" : {
                "timeLockedMicros" : {
                        "r" : NumberLong(1328924),
                        "w" : NumberLong(0)
                },
                "timeAcquiringMicros" : {
                        "r" : NumberLong(1775760),
                        "w" : NumberLong(54728)
                }
        },
        "nreturned" : 544,
        "responseLength" : 92082,
        "millis" : 1777,
        "ts" : ISODate("2014-01-01T11:45:02.156Z"),
        "client" : "127.0.0.1",
        "allUsers" : [ ],
        "user" : ""
}
具體的字段含義我只能猜一下, nscanned是掃描的記錄數, 鎖狀態里面的應該是鎖定和獲取鎖的時間。可以看到這個查詢幾乎所有的時間都用在等待一把讀鎖的釋放。 millis是執行的時間。

最后注意, system.profile是固定大小的collection, 默認大小是1M。 如果要修改該大小, 用下面的方法:

db.setProfilingLevel(0)

db.system.profile.drop()

db.createCollection( "system.profile", { capped: true, size:4000000 } )

db.setProfilingLevel(1)




5 mongotop

mongotop可以顯示collection級別的運行時間:

ns       total        read       write              2014-01-01T11:54:14
          admin.system.indexes         0ms         0ms         0ms
            admin.system.users         0ms         0ms         0ms
             local.oplog.$main         0ms         0ms         0ms
                  local.slaves         0ms         0ms         0ms
             local.startup_log         0ms         0ms         0ms
          local.system.indexes         0ms         0ms         0ms
total = read+write

mongotop和vmstat的參數一樣,可以指定間隔時間。

6 web監控界面

一般是mongod服務器的28017端口。

第一部份是服務基本信息。

第二部份是當前的client的監控。 可以看到鎖的類型, 和是否等待和查詢信息。

第三部份是dbtop, 和mongotop結果類似。

第四部份是log。

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!