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 0mstotal = read+write
mongotop和vmstat的參數一樣,可以指定間隔時間。
6 web監控界面
一般是mongod服務器的28017端口。
第一部份是服務基本信息。
第二部份是當前的client的監控。 可以看到鎖的類型, 和是否等待和查詢信息。
第三部份是dbtop, 和mongotop結果類似。
第四部份是log。