一 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. HDU11269 迷宫城堡(强连通分量)

    迷宫城堡 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  2. SPOJ- Distinct Substrings(后缀数组&后缀自动机)

    Given a string, we need to find the total number of its distinct substrings. Input T- number of test ...

  3. BZOJ [ZJOI2007]矩阵游戏(二分图匹配)

    1059: [ZJOI2007]矩阵游戏 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 6390  Solved: 3133[Submit][Stat ...

  4. HDU2482-Transit search(地图还原+SPFA)

    Henry decides to develop a web site, which will provide the service of transit search. But he can on ...

  5. Bayer图像处理 raw 数据解析

    Bayer是相机内部的原始图片, 一般后缀名为.raw. 很多软件都可以查看, 比如PS. 我们相机拍照下来存储在存储卡上的.jpeg或其它格式的图片, 都是从.raw格式转化 过来的. .raw格式 ...

  6. Python3 常用的几个内置方法

    目录 max()/min() filter() 过滤 map() 映射 sorted筛选 reduce()减少 max()/min() 传入一个参数 (可迭代对象), 返回这个可迭代对象中最大的元素 ...

  7. CentOS 8安装

    1.VMware workstation14Pro安装 ​ 下载蓝点网,序列号也有,直接输入,永久激活 2.CentOS8下载 CentOS8下载地址:清华源 3.CentOS8安装

  8. 【JS】394- 简明 JavaScript 函数式编程-入门篇

    转载自公众号"程序员成长指北" 写在开头 本文较长,总共分为三大部分:(对于函数式编程以及其优点有一定理解的童鞋,可以直接从 第二部分 开始阅读) 第一部分:首先会通过实际代码介绍 ...

  9. K3cloud、erp系统实时滚动展示未处理数据,监控投诉处理进度

     痛点:企业内部erp人工记录产品投诉销售单,是否跟踪处理完客户投诉,结果不能实时透明,当天还有多少未解决的投诉单,也不能实时查看到,除非手工去系统单据查询,很不方便,跟踪也不顺畅!   解决方案:利 ...

  10. 备战“金九银十”10道String高频面试题解析

    前言 String 是我们实际开发中使用频率非常高的类,Java 可以通过 String 类来创建和操作字符串,使用频率越高的类,我们就越容易忽视它,因为见的多所以熟悉,因为熟悉所以认为它很简单,其实 ...