共计 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 怎么用”这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。