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。