网站模板 自适应,服务态度好的外贸客户搜索软件,微信小程序页面跳转,班级优化大师学生版mongostat
mongostat是MongoDB自带的监控工具#xff0c;其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令#xff0c;可以呈现出实时的状态变化。不同的是#xff0c;mongostat所监视的对象是数据库进程。mongostat常用于…mongostat
mongostat是MongoDB自带的监控工具其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令可以呈现出实时的状态变化。不同的是mongostat所监视的对象是数据库进程。mongostat常用于查看当前的QPS/内存使用/连接数以及多个分片的压力分布。mongostat采用Go语言实现其内部使用了db.serverStatus()命令要求执行用户需具备clusterMonitor角色权限。
mongostat -h 192.168.65.174 --port 28017 -ufox -pfox --authenticationDatabaseadmin --discover -n 300 2
参数说明:
-h指定监听的主机分片集群模式下指定到一个mongos实例也可以指定单个mongod或者复制集的多个节点。--port接入的端口如果不提供则默认为27017。-u接入用户名等同于-user。-p接入密码等同于-password。--authenticationDatabase鉴权数据库。--discover启用自动发现可展示集群中所有分片节点的状态。-n 300 2表示输出300次每次间隔2s。也可以不指定“-n 300”此时会一直保持输出。 指标说明 指标名 说明 inserts 每秒插入数 query 每秒查询数 update 每秒更新数 delete 每秒删除数 getmore 每秒getmore数 command 每秒命令数涵盖了内部的一些操作 %dirty WiredTiger缓存中脏数据百分比 %used WiredTiger 正在使用的缓存百分比 flushes WiredTiger执行CheckPoint的次数 vsize 虚拟内存使用量 res 物理内存使用量 qrw 客户端读写等待队列数量高并发时一般队列值会升高 arw 客户端读写活跃个数 netIn 网络接收数据量 netOut 网络发送数据量 conn 当前连接数 set 所属复制集名称 repl 复制节点状态主节点/二级节点……) time 时间戳
mongostat需要关注的指标主要有如下几个
插入、删除、修改、查询的速率是否产生较大波动是否超出预期。qrw、arw队列是否较高若长时间大于0则说明此时读写速度较慢。conn连接数是否太多。dirty百分比是否较高若持续高于10%则说明磁盘I/O存在瓶颈。netIn、netOut是否超过网络带宽阈值。repl状态是否异常如PRI、SEC、RTR为正常若出现REC等异常值则需要修复。
使用交互模式
mongostat一般采用滚动式输出即每一个间隔后的状态数据会被追加到控制台中。从MongoDB 3.4开始增加了--interactive选项用来实现非滚动式的监视非常方便。
mongostat -h 192.168.65.174 --port 28017 -ufox -pfox --authenticationDatabaseadmin --discover --interactive -n 2 mongotop
mongotop命令可用于查看数据库的热点表通过观察mongotop的输出可以判定是哪些集合占用了大部分读写时间。mongotop与mongostat的实现原理类似同样需要clusterMonitor角色权限。
mongotop -h 192.168.65.174 --port28017 -ufox -pfox --authenticationDatabaseadmin
默认情况下mongotop会持续地每秒输出当前的热点表 指标说明 指标名 说明 ns 集合名称空间 total 花费在该集合上的时长 read 花费在该集合上的读操作时长 write 花费在该集合上的写操作时长
mongotop通常需要关注的因素主要包括
热点表操作耗费时长是否过高。这里的时长是在一定的时间间隔内的统计值它代表某个集合读写操作所耗费的时间总量。在业务高峰期时核心表的读写操作一般比平时高一些通过mongotop的输出可以对业务尖峰做出一些判断。是否存在非预期的热点表。一些慢操作导致的性能问题可以从mongotop的结果中体现出来
mongotop的统计周期、输出总量都是可以设定的
#最多输出100次每次间隔时间为2smongotop -h 192.168.65.174 --port28017 -ufox -pfox --authenticationDatabaseadmin -n 100 2 Profiler模块
Profiler模块可以用来记录、分析MongoDB的详细操作日志。默认情况下该功能是关闭的对某个业务库开启Profiler模块之后符合条件的慢操作日志会被写入该库的system.profile集合中。Profiler的设计很像代码的日志功能其提供了几种调试级别: 级别 说明 0 日志关闭无任何输出 1 部分开启仅符合条件时长大于slowms的操作日志会被记录 2 日志全开所有的操作日志都被记录
对当前的数据库开启Profiler模块:
# 将level设置为2此时所有的操作会被记录下来。db.setProfilingLevel(2)#检查是否生效db.getProfilingStatus() slowms是慢操作的阈值单位是毫秒sampleRate表示日志随机采样的比例1.0则表示满足条件的全部输出。
如果希望只记录时长超过500ms的操作则可以将level设置为1
db.setProfilingLevel(1,500)
还可以进一步设置随机采样的比例
db.setProfilingLevel(1,{slowms:500,sampleRate:0.5})
查看操作日志
开启Profiler模块之后可以通过system.profile集合查看最近发生的操作日志
db.system.profile.find().limit(5).sort({ts:-1}).pretty() 这里需要关注的一些字段主要如下所示:
op操作类型描述增加、删除、修改、查询。ns名称空间格式为{db}.{collection}。Command原始的命令文档。Cursorid游标ID。numYield操作数大于0表示等待锁或者是磁盘I/O操作。nreturned返回条目数。keysExamined扫描索引条目数如果比nreturned大出很多则说明查询效率不高。docsExamined扫描文档条目数如果比nreturned大出很多则说明查询效率不高。locks锁占用的情况。storage存储引擎层的执行信息。responseLength响应数据大小字节数一次性查询太多的数据会影响性能可以使用limit、batchSize进行一些限制。millis命令执行的时长单位是毫秒。planSummary查询计划的概要如IXSCAN表示使用了索引扫描。execStats执行过程统计信息。ts命令执行的时间点。
根据这些字段可以执行一些不同维度的查询。比如查看执行时长最大的10条操作记录
查看某个集合中的update操作日志
db.system.profile.find().limit(10).sort({millis:-1}).pretty()
查看某个集合中的update操作日志
db.system.profile.find({op:update,ns:shop.user})
注意事项
system.profile是一个1MB的固定大小的集合随着记录日志的增多一些旧的记录会被滚动删除。在线上开启Profiler模块需要非常谨慎这是因为其对MongoDB的性能影响比较大。建议按需部分开启同时slowms的值不要设置太低。sampleRate的默认值是1.0该字段可以控制记录日志的命令数比例但只有在MongoDB 4.0版本之后才支持。Profiler模块的设置是内存级的重启服务器后会自动恢复默认状态。
db.currentOp()
Profiler模块所记录的日志都是已经发生的事情db.currentOp()命令则与此相反它可以用来查看数据库当前正在执行的一些操作。想象一下当数据库系统的CPU发生骤增时我们最想做的无非是快速找到问题的根源这时db.currentOp就派上用场了。
db.currentOp()读取的是当前数据库的命令快照该命令可以返回许多有用的信息比如
操作的运行时长快速发现耗时漫长的低效扫描操作。执行计划信息用于判断是否命中了索引或者存在锁冲突的情况。操作ID、时间、客户端等信息方便定位出产生慢操作的源头。 对示例操作的解读如下:
1从ns、op字段获知当前进行的操作正在对test.items集合执行update命令。
2command字段显示了其原始信息。其中command.q和command.u分别展示了update的查询条件和更新操作。
3planSummaryCOLLSCAN 说明情况并不乐观update没有利用索引而是正在全表扫描。4microsecs_runningNumberLong186070表示操作运行了186ms注意这里的单位是微秒。
优化方向
value字段加上索引如果更新的数据集非常大要避免大范围update操作切分成小批量的操作
opid表示当前操作在数据库进程中的唯一编号。如果已经发现该操作正在导致数据库系统响应缓慢则可以考虑将其“杀”死
db.killOp(4001)
db.currentOp默认输出当前系统中全部活跃的操作由于返回的结果较多我们可以指定一些过滤条件:
查看等待锁的增加、删除、修改、查询操作
db.currentOp({waitingForLock:true,$or:[{op:{$in:[insert,update,remove]}},{query.findandmodify:{$exists:true}}]})
查看执行时间超过1s的操作
db.currentOp({secs_running:{$gt:1}})查看test数据库中的操作
db.currentOp({ns:/test/})
currentOp命令输出说明
currentOp.type操作类型可以是op、idleSession、idleCursor的一种一般的操作信息以op表示。其为MongoDB 4.2版本新增功能。currentOp.host主机的名称。currentOp.desc连接描述包含connectionId。currentOp.connectionId客户端连接的标识符。currentOp.client客户端主机和端口。currentOp.appName应用名称一般是描述客户端类型。currentOp.clientMetadata关于客户端的附加信息可以包含驱动的版本。currentOp.currentOpTime操作的开始时间。MongoDB 3.6版本新增功能。currentOp.lsid会话标识符。MongoDB 3.6版本新增功能。currentOp.opid操作的标志编号。currentOp.active操作是否活跃。如果是空闲状态则为false。currentOp.secs_running操作持续时间以秒为单位。currentOp.microsecs_running操作持续时间以微秒为单位。currentOp.op标识操作类型的字符串。可能的值是none update insertquerycommand getmore remove killcursors。其中command操作包括大多数命令如createIndexes和findAndModify。currentOp.ns操作目标的集合命名空间。currentOp.command操作的完整命令对象的文档。如果文档大小超过1KB则会使用一种$truncate形式表示。currentOp.planSummary查询计划的概要信息。currentOp.locks当前操作持有锁的类型和模式。currentOp.waitingForLock是否正在等待锁。currentOp.numYields当前操作执行yield让步的次数。一些锁互斥或者磁盘I/O读取都会导致该值大于0。currentOp.lockStats当前操作持有锁的统计。currentOp.lockStats.acquireCount操作以指定模式获取锁的次数。currentOp.lockStats.acquireWaitCount操作获取锁等待的次数等待是因为锁处于冲突模式。acquireWaitCount小于或等于acquireCount。currentOp.lockStats.timeAcquiringMicros操作为了获取锁所花费的累积时间以微秒为单位。timeAcquiringMicros除以acquireWaitCount可估算出平均锁等待时间。currentOp.lockStats.deadlockCount在等待锁获取时操作遇到死锁的次数。
注意事项
db.currentOp返回的是数据库命令的瞬时状态因此如果数据库压力不大则通常只会返回极少的结果。如果启用了复制集那么currentOp还会返回一些复制的内部操作针对local.oplog.rs需要做一些筛选。db.currentOp的结果是一个BSON文档如果大小超过16MB则会被压缩。可以使用聚合操作$currentOp获得完整的结果。