http://my.oschina.net/costaxu/blog/189406
mongodb新手, 請指正。
0 查看mongodb 版本
db.serverStatus()["version"]
1 查看鎖
db.serverStatus()["globalLock"]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
{
"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"] 這個命令可以從一個更細的粒度查看鎖的情況。
|
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
|
{
"."
: {
"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()
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
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
|
1
2
3
4
5
6
7
8
|
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 。 可以參詳一下官網原文:
|
1
2
3
|
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表示同步狀態。官網給出文檔是這樣:
|
1
2
3
4
5
|
M master
SEC secondary
REC recovering
UNK unknown
SLV slave
|
在我mongo 2.4.8的機器上,
PRI表示主機。SLV表示從機。
4 profiling
profiling是設置一個全server級別的慢日志,將慢查詢保存下來。 慢查詢的數據會保存到 system.profile中。
打開profiling:
|
1
2
|
>db.setProfilingLevel(1,1000)
{
"was"
: 0,
"slowms"
: 20,
"ok"
: 1 }
|
第一個參數表示Profile的級別, 第二個參數是定義慢查詢的閾值。
profile級別0不保存, 1只保存慢查詢,2保存所有查詢。
注意級別是對應當前的數據庫, 而閾值是全局的。
查看profiling狀態:
|
1
2
|
>db.getProfilingStatus()
{
"was"
: 1,
"slowms"
: 1000 }
|
關閉profiling:
|
1
|
>db.setProfilingLevel(0, 1000)
|
查看慢查詢, 其實就是在system.profile里查:
|
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
|
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。 如果要修改該大小, 用下面的方法:
|
1
2
3
4
5
6
7
|
db.setProfilingLevel(0)
db.system.profile.drop()
db.createCollection(
"system.profile"
, { capped:
true
, size:4000000 } )
db.setProfilingLevel(1)
|
5 mongotop
mongotop可以顯示collection級別的運行時間:
|
1
2
3
4
5
6
7
|
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。

