MongoDB 執行狀態、效能監控,分析
mongostat詳解
mongostat是mongdb自帶的狀態檢測工具,在命令列下使用。它會間隔固定時間獲取mongodb的當前執行狀態,並輸出。如果你發現數據庫突然變慢或者有其他問題的話,你第一手的操作就考慮採用mongostat來檢視mongo的狀態。
它的輸出有以下幾列:
- inserts/s 每秒插入次數
- query/s 每秒查詢次數
- update/s 每秒更新次數
- delete/s 每秒刪除次數
- getmore/s 每秒執行getmore次數
- command/s 每秒的命令數,比以上插入、查詢、更新、刪除的綜合還多,還統計了別的命令
- flushs/s 每秒執行fsync將資料寫入硬碟的次數。
- mapped/s 所有的被mmap的資料量,單位是MB,
- vsize 虛擬記憶體使用量,單位MB
- res 實體記憶體使用量,單位MB
- faults/s 每秒訪問失敗數(只有Linux有),資料被交換出實體記憶體,放到swap。不要超過100,否則就是機器記憶體太小,造成頻繁swap寫入。此時要升級記憶體或者擴充套件
- locked % 被鎖的時間百分比,儘量控制在50%以下吧
- idx miss % 索引不命中所佔百分比。如果太高的話就要考慮索引是不是少了
- q t|r|w 當Mongodb接收到太多的命令而資料庫被鎖住無法執行完成,它會將命令加入佇列。這一欄顯示了總共、讀、寫3個佇列的長度,都為0的話表示mongo毫無壓力。高併發時,一般佇列值會升高。
- conn 當前連線數
- time 時間戳
使用profiler
類似於MySQL的slow log, MongoDB可以監控所有慢的以及不慢的查詢。
Profiler預設是關閉的,你可以選擇全部開啟,或者有慢查詢的時候開啟。
1 |
>
use test |
2 |
switched
to db test |
3 |
>
db.setProfilingLevel(2); |
4 |
{ "was" :
0 , "slowms" :
100, "ok" :
1} //
"was" is the old setting |
5 |
>
db.getProfilingLevel() |
6 |
2 |
檢視Profile日誌
1 |
>
db.system.profile.find().sort({$natural:-1}) |
2 |
{ "ts" : "Thu
Jan 29 2009 15:19:32 GMT-0500 (EST)" , "info" : |
3 |
"query
test.$cmd ntoreturn:1 reslen:66 nscanned:0 query: { profile: 2 } nreturned:1 bytes:50" , |
4 |
"millis" :
0} ... |
3個欄位的意義
- ts:時間戳
- info:具體的操作
- millis:操作所花時間,毫秒
不多說,此處有官方文件。注意,造成滿查詢可能是索引的問題,也可能是資料不在記憶體造成因此磁碟讀入造成。
使用Web控制檯
Mongodb自帶了Web控制檯,預設和資料服務一同開啟。他的埠在Mongodb資料庫伺服器埠的基礎上加1000,如果是預設的Mongodb資料服務埠(Which is 27017),則相應的Web埠為28017
這個頁面可以看到
- 當前Mongodb的所有連線
- 各個資料庫和Collection的訪問統計,包括:Reads, Writes, Queries, GetMores ,Inserts, Updates, Removes
- 寫鎖的狀態
- 以及日誌檔案的最後幾百行(CentOS+10gen yum 安裝的mongodb預設的日誌檔案位於/var/log/mongo/mongod.log)
可以參考右邊的截圖
db.stat()
獲取當前資料庫的資訊,比如Obj總數、資料庫總大小、平均Obj大小等
01 |
>
use test |