MongoDB运行状态、性能监控,分析

 

mongo stat 它的输出有以下几列:

 

    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 时间戳

Mongo profile 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

上面斜体的级别可以取0,1,2 三个值,他们表示的意义如下:

  0 – 不开启

  1 – 记录慢命令 (默认为>100ms)

  2 – 记录所有命令

   Profile 记录在级别1时会记录慢命令,那么这个慢的定义是什么?上面我们说到其默认为100ms,当然有默认就有设置,其设置方法和级别一样有两种,一种是通过添 加–slowms启动参数配置。第二种是调用db.setProfilingLevel时加上第二个参数:

db.setProfilingLevel( level , slowms ) 
  db.setProfilingLevel( 1 , 10 );

 

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} ...

 

  • ts:时间戳
  • info:具体的操作
  • millis:操作所花时间,毫秒

官方文档。注意,造成满查询可能是索引的问题,也可能是数据不在内存造成因此磁盘读入造成。

mongodb web monitor 这个页面可以看到

 

    当前Mongodb的所有连接
  • 各个数据库和Collection的访问统计,包括:Reads, Writes, Queries, GetMores ,Inserts, Updates, Removes
  • 写锁的状态
  • 以及日志文件的最后几百行(CentOS+10gen yum 安装的mongodb默认的日志文件位于/var/log/mongo/mongod.log)

db.stat()

 

01 > use test
02 switched to db test
03 > db.stats()
04 {
05     "collections" : 9,
06     "objects" : 4278845,
07     "avgObjSize" : 224.56603031892953,
08     "dataSize" : 960883236,
09     "storageSize" : 1195438080,
10     "numExtents" : 59,
11     "indexes" : 13,
12     "indexSize" : 801931264,
13     "fileSize" : 6373244928,
14     "ok" : 1
15 }

获取服务器的状态

 

01 {
        "host" : "abc1234567890",--server的hostname,这里是计算机的名称
        "version" : "2.2.2",--MongoDB的版本号
        "process" : "mongod",--MongoDB的进程名称
        "pid" : 2996,--MongoDB的进程PID
        "uptime" : 511789,--启动时间(单位:s)
        "uptimeMillis" : NumberLong(511789041),
        "uptimeEstimate" : 505769,--基于MongoDB内部粗粒度定时器的运行时间
        "localTime" : ISODate("2012-12-26T00:42:26.576Z"),--server的本地时间
        "locks" : {
                "." : {
                        "timeLockedMicros" : {
                                "R" : NumberLong(9909170),
                                "W" : NumberLong(105416165)
                        },
                        "timeAcquiringMicros" : {
                                "R" : NumberLong(13023043),
                                "W" : NumberLong(2050090)
                        }
                },
                "admin" : {
                        "timeLockedMicros" : {

                        },
                        "timeAcquiringMicros" : {

                        }
                },
                "local" : {
                        "timeLockedMicros" : {
                                "r" : NumberLong(553001),
                                "w" : NumberLong(0)
                        },
                        "timeAcquiringMicros" : {
                                "r" : NumberLong(36574),
                                "w" : NumberLong(0)
                        }
                },
                "Dobug" : {
                        "timeLockedMicros" : {
                                "r" : NumberLong(1517233),
                                "w" : NumberLong(83584)
                        },
                        "timeAcquiringMicros" : {
                                "r" : NumberLong(112682),
                                "w" : NumberLong(7)
                        }
                }
        },
        "globalLock" : {
                "totalTime" : NumberLong("511789041000"),--自实例启动全局锁创建以来到现在多长时间,单位微秒.
                "lockTime" : NumberLong(105416165),--自全局锁创建以来锁定总时间,单位微秒
                "currentQueue" : {
                        "total" : 0,--等待全局锁的队列中操作数目
                        "readers" : 0,--等待读锁的队列中操作数目
                        "writers" : 0--等待写锁的队列中操作数目
                },
                "activeClients" : {
                        "total" : 0,--连接到server的当前活动client数目
                        "readers" : 0, --执行读操作的当前活动client数目
                        "writers" : 0--执行写操作的当前活动client数目
                }
        },
        "mem" : {
                "bits" : 64,--64位机器
                "resident" : 31,--占用物理内存量
                "virtual" : 20478, --占用的虚拟内存量
                "supported" : true, --是否支持扩展内存
                "mapped" : 10188, --映射到内存的数据文件大小,很接近于你的所有数据库大小。
                "mappedWithJournal" : 20376
        },
        "connections" : {
                "current" : 1,--当前活动连接量。连接到server的当前活跃连接数目
                "available" : 19999--剩余空闲连接量。剩余的可用连接数目
        },
        "extra_info" : {
                "note" : "fields vary by platform",
                "page_faults" : 25747,
                "usagePageFileMB" : 106,
                "totalPageFileMB" : 12151,
                "availPageFileMB" : 6195,
                "ramMB" : 6007
        },
        "indexCounters" : {
                "note" : "not supported on this platform"
        },
        "backgroundFlushing" : {
                "flushes" : 8527, --数据库刷新写到磁盘的次数
                "total_ms" : 599904,--数据库刷新数据到磁盘花费的微秒数
                "average_ms" : 70.35346546264806,--执行单次刷新花费的平均微秒数
                "last_ms" : 51,--最后一次执行完成刷新数据到磁盘花费的微秒数
                "last_finished" : ISODate("2012-12-26T00:41:32.013Z")-当最后一次刷新数据完成时的时间戳
        },
        "cursors" : {
                "totalOpen" : 0, --server为client保持的游标(cursor)总数
                "clientCursors_size" : 0,
                "timedOut" : 0--server启动以来游标(cursor)超时的总数
        },
        "network" : {
                "bytesIn" : 1925,--发送到数据库的数据总量(bytes)
                "bytesOut" : 4294,--数据库发出的数据总量(bytes)
                "numRequests" : 24--发送到数据库的请求量
        },
        "opcounters" : {
                "insert" : 0, --server启动以来总的insert数据量
                "query" : 16646, --server启动以来总的query数据量
                "update" : 1,--server启动以来总的update数据量
                "delete" : 0, --server启动以来总的delete数据量
                "getmore" : 0, --server启动以来调用任何游标的getMore总次数
                "command" : 22 --server启动以来执行其他命令的总次数
        },
        "asserts" : {
                "regular" : 0, --server启动以来抛出正规断言(assert 类似于异常处理的形式)总数目
                "warning" : 0,--server启动以来抛出的告警总数目
                "msg" : 0,--消息断言数目。服务器内部定义的良好字符串错误
                "user" : 0, --用户断言数目。用户产生的错误,譬如:磁盘空间满;重复键。
                "rollovers" : 0--server启动以来,assert counters have rolled over的次数
        },
        "writeBacksQueued" : false,--是否有从mongos执行的retry操作
        "dur" : {
                "commits" : 29,--上一间隔journal日志发生commit的次数
                "journaledMB" : 0,--上一间隔写到journal日志的数据量(单位:MB)
                "writeToDataFilesMB" : 0,--上一间隔journal日志写到数据文件的数据量(单位:MB)
                "compression" : 0,
                "commitsInWriteLock" : 0, --写锁期间发生commits的次数
                "earlyCommits" : 0,--schedule时间前请求commit的次数
                "timeMs" : {
                        "dt" : 3004,
                        "prepLogBuffer" : 0,--准备写journal日志花费的时间
                        "writeToJournal" : 0,--写journal日志花费的实际时间
                        "writeToDataFiles" : 0,--journal日志后写数据文件花费的时间
                        "remapPrivateView" : 0
                }
        },
        "recordStats" : {
                "accessesNotInMemory" : 2,
                "pageFaultExceptionsThrown" : 1,
                "Dobug" : {
                        "accessesNotInMemory" : 2,
                        "pageFaultExceptionsThrown" : 1
                },
                "local" : {
                        "accessesNotInMemory" : 0,
                        "pageFaultExceptionsThrown" : 0
                }
        },
        "ok" : 1--serverStatus是否返回正确
}

 

  • connections 当前连接和可用连接数,听过一个同行介绍过,mongodb最大处理到2000个连接就不行了(要根据你的机器性能和业务来设定),所以设大了没意义。设个合理值的话,到达这个值mongodb就拒绝新的连接请求,避免被太多的连接拖垮。
  • indexCounters:btree:misses 索引的不命中数,和hits的比例高就要考虑索引是否正确建立。你看我的”missRatio” : 3.543930204420982e-7,很健康吧。所以miss率在mongostat里面也可以看
  • 其他的都能自解释,也不是查看mongo健康状况的关键,就不说明了。

Mongodb 的命令一般很快就完成,但是在一台繁忙的机器或者有比较慢的命令时,你可以通过db.currentOp()获取当前正在执行的操作。

 

 

1 >  db.currentOp()
2 "inprog" : [ ] }

 

1 "opid" "shard3:466404288""active" false"waitingForLock" false"op""query""ns" "sd.usersEmails""query" : { }, "client_s" :"10.121.13.8:34473""desc" "conn" },

 

1 > db.killOp("shard3:466404288")

MongoDB Monitoring Service(MMS)是Mongodb厂商提供的监控服务,可以在网页和Android客户端上监控你的MongoDB状况。

 http://blog.csdn.net/liubo2012/article/details/8203751

posted @ 2014-11-18 13:23  seasonzone  阅读(557)  评论(0编辑  收藏  举报