一 MongoDB 监控

1.1 监控概述

MongoDB自带了mongostat 和 mongotop 这两个命令来监控MongoDB的运行情况。这两个命令用于处理MongoDB数据库变慢等等问题非常有用,能详细的统计MongoDB当前的状态信息。除此之外,还可以用db.serverStatus()、db.stats()、开启profile功能通过查看日志进行监控分析。

1.2 模拟插入数据

 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
> use admin
> db.grantRolesToUser( "admin",[{ role: "dbOwner",db:"mydb" }])
> for(i=1;i<=50000;i++){db.user.insert({"id":i,"name":"jack"+i})}
 

二 相关命令

2.1 mongostat 命令

mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。捕捉并返回各种类型(如插入、 查询、 更新、 删除等)数据库操作的统计。
相关输出解释:
 inserts/s		#每秒插入次数
query/s #每秒查询次数
update/s #每秒更新次数
delete/s #每秒删除次数
getmore/s #每秒执行getmore次数
command/s #每秒的命令数,比以上插入、查找、更新、删除的综合还多,还统计了别的命令
dirty #仅仅针对WiredTiger引擎,脏数据字节的缓存百分比
used #仅仅针对WiredTiger引擎,正在使用中的缓存百分比
flushs/s #每秒执行fsync将数据写入硬盘的次数。
 
注意:flushs一般都是0,间断性会是1,通过计算两个1之间的间隔时间,可以大致了解多长时间flush一次。flush开销较大,如果频繁的flush,可能存在异常。
 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毫无压力。高并发时,一般队列值会升高。
qr #客户端等待从MongoDB实例读数据的队列长度
qw #客户端等待从MongoDB实例写入数据的队列长度
ar #执行读操作的活跃客户端数量
aw #执行写操作的活客户端数量
 
注意:如果这两个数值很大,即DB的处理速度不及请求速度。可能存在开销很大的慢查询。如果查询一切正常,确实是负载很大,可能是资源不够。
 conn			#当前连接数,是qr,qw,ar,aw的总和
time #时间戳
net_in #MongoDB实例的网络进流量
net_out #MongoDB实例的网络出流量
 
注意:MongoDB为每一个连接创建一个线程,线程的创建与释放也会有开销,所以尽量要适当配置连接数的启动参数,maxIncomingConnections建议在5000以下,基本满足多数场景。
示例:
 [root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
> use admin
> db.grantRolesToUser( "admin",[{ role: "clusterMonitor",db:"admin" }])
[root@client ~]# mongostat -h 172.24.8.71 -u admin -p admin --authenticationDatabase admin --discover -n 30 3
 
参数说明
-discover:提供集群中所有节点的状态;
-n 30 3:表示输出30次,每次休眠3秒钟。

2.2 mongotop 命令

mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 追踪并报告MongoDB实例当前的读取和写入活动,而且是基于每个集合报告这些统计数据。提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。
相关输出解释:
 ns			        #数据库命名空间,后者结合了数据库名称和集合。
db #数据库的名称。名为 . 的数据库针对全局锁定,而非特定数据库。
total #mongod在这个命令空间上花费的总时间。
read #在这个命令空间上mongod执行读操作花费的时间。
write #在这个命名空间上mongod进行写操作花费的时间。
 
示例:
 [root@client ~]# mongotop -h 172.24.8.71 -u admin -p admin --authenticationDatabase admin -n 30 3
参数说明
 -n 30 3:表示输出30次,每次休眠3秒钟。

2.3 profile

mongodb慢查询检查,Profiler默认为关闭状态,可以选择全部开启,或者有慢查询的时候开启。
相关输出解释:
 ts			        #时间戳
info #具体的操作
millis #操作所花时间,毫秒
[root@client ~]# mongo --host 172.24.8.71 -u admin -p admin
> use mydb
> db.setProfilingLevel(2) #开启profile
{ "was" : 2, "slowms" : 100, "sampleRate" : 1, "ok" : 1 }
> db.getProfilingLevel()
2
> use mydb
switched to db mydb
> db.system.profile.find().sort({$natural:-1}).pretty() #查看Profile日志
> db.system.profile.count() #查看系统中的慢查询数量
6
 
注意:profile操作必须连接mongod进程,而mongos无法执行此类操作;
造成满查询可能是索引的问题,也可能是数据不在内存造成因此磁盘读入造成。
更多慢查询操作见官方文档:https://docs.mongodb.com/manual/tutorial/manage-the-database-profiler/

2.4 serverStatus

serverStatus命令,或mongo shell中的db.serverStatus()返回数据库状态的总览,具体包括磁盘使用状况、内存使用状况、连接、日志和可用的索引。此命令迅速返回,并不会影响MongoDB性能。
 > use mydb
> db.serverStatus() #只显示部分内容
{
"uptime" : 21.0, #表示此实例进程已激活的总时间,单位是秒
"localTime" : ISODate("2017-07-09T05:28:17.007Z"), #表示实例所在服务器的当前时间
"globalLock" : {
"totalTime" : NumberLong(20935000), #数据库启动后运行的总时间,单位是微秒
"currentQueue" : { #表示因为锁引起读写队列数
"total" : 0,
"readers" : 0, #等待读锁的操作数
"writers" : 0 #等待写锁的操作数
},
"activeClients" : { #连接的激活客户端写操作的总数
"total" : 10,
"readers" : 0, #激活客户端读操作数
"writers" : 0 #激活客户端写操作数
}
},
"mem" : { #表示当前内存使用情况
"bits" : 64, #mongod运行的目标机器的架构
"resident" : 96, #当前被使用的物理内存总量,单位MB
"virtual" : 271, #MongoDB进程映射的虚拟内存大小,单位MB
"supported" : true, #表示系统是否支持可扩展内存
"mapped" : 0, #映射数据文件所使用的内存大小,单位MB
"mappedWithJournal" : 0 #映射journaling所使用的内存大小,单位MB
},
}
 
关键输出:
connections:当前连接和可用连接数,设个一个合理值,当到达这个值mongodb就拒绝新的连接请求,避免连接太多而影响性能。
indexCounters:btree:misses 索引的不命中数,和hits的比例高就要考虑索引是否正确建立。

2.5 db.stats()、db.c.stats()

MongoDB数据文件状态指标命令: db.stats(), db.c.stats(),查看文件大小,存储空间大小等。返回一份针对存储使用情况和数据卷的文档,dbStats显示了存储的使用量、包含在数据库中的数据的总量以及对象、集合和索引计数器。
示例:
 > use mydb
> db.stats()
{
"db" : "mydb", #当前数据库
"collections" : 2, #集合数量
"views" : 0,
"objects" : 50007, #对象(记录)数量
"avgObjSize" : 53.88963545103685, #对象平均大小
"dataSize" : 2694859, #所有数据总大小
"storageSize" : 917504, #数据占磁盘大小
"numExtents" : 0, #所有集合占用的区间总数
"indexes" : 1, #索引数
"indexSize" : 491520, #索引大小
"fsUsedSize" : 2733277184,
"fsTotalSize" : 27375431680,
"ok" : 1
}
 
提示:MongoDB数据库磁盘占用大小=storageSize+indexes,压缩比=dataSize/storageSize。

2.6 db.collection.stats()

在集合级别上提供类似dbStats的统计数据,包括集合中对象的计数、集合的大小、集合占用的硬盘空间总量以及集合索引的相关信息。
 > use mydb
switched to db mydb
> db.user.stats()
 

2.7 db.currentOp()

通常Mongodb的命令一般很快就完成,但是在一台繁忙的机器或者有比较慢的命令时,可以通过db.currentOp()获取当前正在执行的操作。
 > db.currentOp()
提示:若发现一个操作太长,导致数据库卡死,可以使用db.killOp("110752")杀死。

2.8 rs.status()

MongoDB副本集状态指标命令。
相关输出解释:
分段
说明
set
当前副本集名称
date
执行命令时间
myState
当前节点的状态(角色)
syncingTo
同步源
heartbeatIntervalMillis
心跳间隔
members
节点成员
members.id
成员编号
members.name
成员名称
members.heath
健康状态,1-true,0-false
members.state
成员状态(角色)1-主节点 2-备节点 7-仲裁节点
members.stateStr
成员状态名
members.uptime
成员启动运行时长
members.optime
成员oplog时间戳(字段ts)
members.optimeDate
成员oplog时间(格式化)
members.lastHeartbeat
当前节点对成员的最后一个心跳
members.lastHeartbeatRecv
当前节点收到该成员的最后一个心跳
members.pingMs
当前节点到该成员的回路时长
members.syncingTo
成员同步源
members.electionTime
主节点选举时间戳(ms)
members.electionDate
主节点选举时间(格式化)
  1. 检查每个成员的state/stateStr确认是否正常;
提示:state状态字段解释可参考官方:https://docs.mongodb.com/manual/reference/replica-states/或https://yq.aliyun.com/articles/405274。
  1. 检查每个成员的optimeDate差异,查看复制延迟;
  2. 检查lastHeartbeat、pingMs值排查网络延迟问题
使用db.printReplicationInfo()输出节点oplog信息,可在主备节点输出对比
 configured oplog size:   20480MB
log length start to end: 589911secs (163.86hrs)
oplog first event time: Tue Apr 03 2018 19:37:14 GMT+0800
oplog last event time: Tue Apr 10 2018 15:29:05 GMT+0800
now: Tue Apr 10 2018 15:30:18 GMT+0800
 
主节点使用db.printSlaveReplicationInfo()可输出备节点的同步信息
 source: 135.177.126.24:10001
syncedTo: Tue Apr 10 2018 15:32:45 GMT+0800
0 secs (0 hrs) behind the primary
 

三 motop监控工具

3.1 motop安装

motop是mongodb实时监控工具,可以同时对多个MongoDB服务器进行监控,同时显示当前操作。
语法格式:
motop [-h] [-u USERNAME] [-p PASSWORD] [-c CONF] [-V] [-K AUTOKILLSECONDS] [host [host ...]]
开源项目地址:项目地址:https://github.com/tart/motop
 [root@client ~]# yum -y install pymongo				#安装以来
[root@client ~]# curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
[root@client ~]# python get-pip.py
[root@client ~]# yum -y install git
[root@client ~]# pip install git+https://github.com/tart/motop.git
 

3.2 motop操作

q:退出
p:暂停
e:解释查询
k:使用“mongo”执行杀死操作
K:使用“mongo”执行杀死比给定秒数更早的操作
r:尝试重新连接到已断开连接的服务器
R:尝试重新连接到所有服务器

3.3 配置

配置文件:/etc/motop.conf,可以有多个配置段,每一节都可以包含以下参数。
 address:服务器的地址(必需)
username:登陆用户名
password:登陆用户密码
status:显示状态(默认开启)
replicationInfo:显示复制状态(默认值:开启)
replicaSet:显示副本集的状态(默认值:开启)
operations:显示操作(默认值:开启)
replicationOperations:不断展现主和从的复制操作(默认值:开启)
“DEFAULT”:是特殊的部分,参数可以在本节中设置为默认值。
 

3.4 监控

 [root@client ~]# motop -h				#查看帮助
[root@client ~]# vi /etc/motop.conf
[MongoDB01]
address=172.24.8.71
username=admin
password=admin
replicationInfo=off [MongoDB02]
address=172.24.8.72
username=admin
password=admin
replicationInfo=off
 

四 影响性能相关因素

4.1 锁

MongoDB用一个锁确保数据的一致性。但如果某种操作时间运行,其他请求和操作将不得不等待这个锁,导致系统性能降低。为了验证是否由于锁降低了性能,可以坚持serverStatus输出的globalLock部分的数据。如果参数globalLock.currentQueue.total的值一直较大,说明系统中有许多请求在等待锁,同时表明并发问题影响了系统的性能。

4.2 内存

MongoDB通过内存映射数据文件,如果数据集很大,MongoDB将占用所有可用的系统内存。正式由于内存映射机制将内存的管理交给操作系统来完成,简化了MongoDB的内存管理,提高了数据库系统的性能,但是由于不能确定数据集的大小,需要多少内存也是个未知数。
通过serverStatus输出的关于内存使用状态方面的数据,我们能够深入地了解内存使用情况。检查参数mem.resident的值,如果超过了系统内存量并且还有大量的数据文件在磁盘上,表明内存过小。检查mem.mapped的值,如果这个值大于系统内存量,那么针对数据库的一些读操作将会引起操作系统的缺页操作,内存的换入换出将会降低系统的性能。

4.3 连接数

有时候,客户端的连接数超过了MongoDB数据库服务器处理请求的能力,这也会降低系统的性能。可以通过serverStatus输出的关于连接数方面的参数进一步分析。参数globalLock.activeClients表示当前正在进行读写操作客户端的连接数,current表示当前客户端到数据库实例的连接数,available表示可用连接数。对于读操作大的应用程序,我们可以增加复制集成员数,将读操作分发到secondary节点上,对于写操作大的应用程序,可以通过部署分片集群来分发写操作。

五 Web图形界面

5.1 开启Web

从3.6版本后废弃了web界面,基于安全性考虑官方不推荐开启http。3.6之前的版本可参考官方方法开启:
https://docs.mongodb.com/v3.2/reference/configuration-options/
 
参考链接:
https://www.cnblogs.com/littleatp/p/8419647.html
https://blog.csdn.net/Chen_Victor/article/details/74855050

011.MongoDB性能监控的更多相关文章

  1. 分布式监控系统Zabbix3.4-针对MongoDB性能监控操作笔记

    公司在IDC机房的一台服务器上部署了MongoDB,由于所存储的业务数据比较重要,所以对MongoDB的监控显得尤为重要!Zabbix监控MongoDB性能的原理:通过echo "db.se ...

  2. MongoDB性能监控

    1.mongostat 查看运行中的mongodb实例的统计信息 重要指标说明: getmore: 通常发生在结果集比较大的查询时,第一个query返回了部分结果,后续的结果是通过getmore来获取 ...

  3. Mongodb性能调优

    摘要 1. Mongodb 适用场景简介 2. Mongodb 性能监控与分析 3. Mongodb 性能优化建议 关于Mongodb的几个大事件 1.根据美国数据库知识大全官网发布的DB热度排行,M ...

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

    这篇文章的目的是让你知道怎么了解你正在运行的Mongdb是否健康.转载自http://tech.lezi.com/archives/290 mongostat详解 启动mongodb监控,通过下面命令 ...

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

    转载自这位仁兄:地址 mongostat详解 mongostat是mongdb自带的状态检测工具,在命令行下使用.它会间隔固定时间获取mongodb的当前运行状态,并输出.如果你发现数据库突然变慢或者 ...

  6. mongodb可以通过profile来监控数据 (mongodb性能优化)

    mongodb可以通过profile来监控数据 (mongodb性能优化)   开启 Profiling  功能 ,对慢查询进行优化: mongodb可以通过profile来监控数据,进行优化. 查看 ...

  7. mongodb的监控与性能优化

    一.mongodb的监控 mongodb可以通过profile来监控数据,进行优化. 查看当前是否开启profile功能用命令 db.getProfilingLevel()  返回level等级,值为 ...

  8. MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划

    这篇文章主要介绍了MongoDB性能篇之创建索引,组合索引,唯一索引,删除索引和explain执行计划的相关资料,需要的朋友可以参考下 一.索引 MongoDB 提供了多样性的索引支持,索引信息被保存 ...

  9. MYSQL使用PMM进行性能监控

    简介Percona监视和管理(PMM)是一个用于管理和监视MySQL和MongoDB性能的开源平台.它是由Percona与托管数据库服务.支持和咨询领域的专家合作开发的. PMM是一个免费的开源解决方 ...

随机推荐

  1. ACM-ICPC 2018 焦作赛区网络预赛 I题 Save the Room

    Bob is a sorcerer. He lives in a cuboid room which has a length of AA, a width of BB and a height of ...

  2. checkbox多选框取值

    var SelectQuestionAnswer = $("input:checkbox[name='SelectQuestionAnswer']:checked").map(fu ...

  3. 2016/09/21 context.getConfiguration().get()

    查看api:http://hadoop.apache.org/docs/stable/api/ public String get(String name) Get the value of the ...

  4. Git之将master合并到自己分支

    工作中常常需要将master合并到自己的分支,这次就记录一下这个过程. 1.切换到master主分支上 git checkout master 2.将master更新的代码pull到本地 git pu ...

  5. Homebrew的安装

    Homebrew是一款Mac OS平台下的软件包管理工具. 安装方法:命令行输入 /usr/bin/ruby -e "$(curl -fsSL https://raw.githubuserc ...

  6. 脚本批量执行Redis命令

    1.将命令写在文件中 数据量比较大的话,建议用程序去生成文件.例如: List<String> planIdList = planDao.findAll().parallelStream( ...

  7. JS---BOM---定时器

    定时器 参数1:函数 参数2:时间---毫秒---1000毫秒--1秒 执行过程: 页面加载完毕后, 过了1秒, 执行一次函数的代码, 又过了1秒再执行函数..... 返回值就是定时器的id值   v ...

  8. JSON2ABAPType:根据JSON数据结构生成ABAP类型定义

    一图表明本文将要介绍的工具: JSON是常见的数据格式,经常用于接口开发.ABAP开发者通常使用/ui2/cl_json来把JSON数据转换为相应的ABAP类型. 在转换前,必须要定义相应的ABAP类 ...

  9. [20191206]隐含参数_db_always_check_system_ts.txt

    [20191206]隐含参数_db_always_check_system_ts.txt --//今年年头我做tab$删除恢复时,遇到的问题,就是遇到延迟块清除的问题.参考链接:http://blog ...

  10. MQ报错2009/2085解决方法

    1.1. 响应2009错误 1.1.1.   涉及协议 MQ,调试回放阶段 1.1.2.   错误信息 完成码2原因为2009 1.1.3.   可能原因 远端MQ连接数不足,拒绝连接 1.1.4.  ...