共計 3370 個字符,預計需要花費 9 分鐘才能閱讀完成。
這篇文章將為大家詳細講解有關 MongoDB 中 mongostat 怎么用,丸趣 TV 小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
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 默認是關閉的,你可以選擇全部開啟,或者有慢查詢的時候開啟。
use test
switched to db test
db.setProfilingLevel(2);
{was : 0 , slowms : 100, ok : 1} // was is the old setting
db.getProfilingLevel()
查看 Profile 日志
db.system.profile.find().sort({$natural:-1})
{ts : Thu Jan 29 2009 15:19:32 GMT-0500 (EST) , info :
query test.$cmd ntoreturn:1 reslen:66 nscanned:0 query: {profile: 2} nreturned:1 bytes:50 ,
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 大小等
use test
switched to db test
db.stats()
{
collections : 9,
objects : 4278845,
avgObjSize : 224.56603031892953,
dataSize : 960883236,
storageSize : 1195438080,
numExtents : 59,
indexes : 13,
indexSize : 801931264,
fileSize : 6373244928,
ok : 1
}
db.serverStatus()
獲取服務器的狀態
{
version : 1.6.5 ,
uptime : 7208469,
uptimeEstimate : 7138829,
localTime : Wed Oct 26 2011 22:23:07 GMT+0800 (CST) ,
globalLock : {
totalTime : 7208469556704,
lockTime : 4959693717,
ratio : 0.000688036992871448,
currentQueue : {
total : 0,
readers : 0,
writers : 0
}
},
mem : {
bits : 64,
resident : 3131,
virtual : 6172,
supported : true,
mapped : 4927
},
connections : {
current : 402,
available : 2599
},
extra_info : {
note : fields vary by platform ,
heap_usage_bytes : 832531920,
page_faults : 8757
},
indexCounters : {
btree : {
accesses : 2821726,
hits : 2821725,
misses : 1,
resets : 0,
mi***atio : 3.543930204420982e-7
}
},
backgroundFlushing : {
flushes : 120133,
total_ms : 73235923,
average_ms : 609.6236920746173,
last_ms : 1332,
last_finished : Wed Oct 26 2011 22:22:23 GMT+0800 (CST)
},
cursors : {
totalOpen : 0,
clientCursors_size : 0,
timedOut : 238392
},
repl : {
ismaster : true
},
opcounters : {
insert : 269351,
query : 19331151,
update : 14199331,
delete : 1,
getmore : 145575,
command : 55982302
},
asserts : {
regular : 0,
warning : 0,
msg : 0,
user : 27,
rollovers : 0
},
ok : 1
}
需要關心的地方:
connections 當前連接和可用連接數,聽過一個同行介紹過,mongodb 最大處理到 2000 個連接就不行了 (要根據你的機器性能和業務來設定),所以設大了沒意義。設個合理值的話,到達這個值 mongodb 就拒絕新的連接請求,避免被太多的連接拖垮。
indexCounters:btree:misses 索引的不命中數,和 hits 的比例高就要考慮索引是否正確建立。你看我的”mi***atio”: 3.543930204420982e-7,很健康吧。所以 miss 率在 mongostat 里面也可以看
其他的都能自解釋,也不是查看 mongo 健康狀況的關鍵,就不說明了。
db.currentOp()
Mongodb 的命令一般很快就完成,但是在一臺繁忙的機器或者有比較慢的命令時,你可以通過 db.currentOp() 獲取當前正在執行的操作。
在沒有負載的機器上,該命令基本上都是返回空的
db.currentOp()
{inprog : [] }
以下是一個有負載的機器上得到的返回值樣例:
{opid : shard3:466404288 , active : false, waitingForLock : false, op : query , ns : sd.usersEmails , query : {}, client_s : 10.121.13.8:34473 , desc : conn },
字段名字都能自解釋。如果你發現一個操作太長,把數據庫卡死的話,可以用這個命令殺死他
db.killOp(shard3:466404288)
關于“MongoDB 中 mongostat 怎么用”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。