MongoDB性能监控工具

mongostat

mongostat是MongoDB自带的监控工具,其可以提供数据库节点或者整个集群当前的状态视图。该功能的设计非常类似于Linux系统中的vmstat命令,可以呈现出实时的状态变化。不同的是,mongostat所监视的对象是数据库进程。mongostat常用于查看当前的QPS/内存使用/连接数,以及多个分片的压力分布。mongostat采用Go语言实现,其内部使用了db.serverStatus()命令,要求执行用户需具备clusterMonitor角色权限。

mongostat -h 192.168.65.174 --port 28017 -ufox -pfox --authenticationDatabase=admin --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 --authenticationDatabase=admin --discover --interactive -n 2

mongotop

mongotop命令可用于查看数据库的热点表,通过观察mongotop的输出,可以判定是哪些集合占用了大部分读写时间。mongotop与mongostat的实现原理类似,同样需要clusterMonitor角色权限。

mongotop -h 192.168.65.174 --port=28017 -ufox -pfox --authenticationDatabase=admin

默认情况下,mongotop会持续地每秒输出当前的热点表

指标说明

指标名

说明

ns

集合名称空间

total

花费在该集合上的时长

read

花费在该集合上的读操作时长

write

花费在该集合上的写操作时长

mongotop通常需要关注的因素主要包括:

  • 热点表操作耗费时长是否过高。这里的时长是在一定的时间间隔内的统计值,它代表某个集合读写操作所耗费的时间总量。在业务高峰期时,核心表的读写操作一般比平时高一些,通过mongotop的输出可以对业务尖峰做出一些判断。
  • 是否存在非预期的热点表。一些慢操作导致的性能问题可以从mongotop的结果中体现出来

mongotop的统计周期、输出总量都是可以设定的

#最多输出100次,每次间隔时间为2smongotop -h 192.168.65.174 --port=28017 -ufox -pfox --authenticationDatabase=admin -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命令。

(2)command字段显示了其原始信息。其中,command.q和command.u分别展示了update的查询条件和更新操作。

(3)"planSummary":"COLLSCAN" 说明情况并不乐观,update没有利用索引而是正在全表扫描。(4)microsecs_running:NumberLong(186070)表示操作运行了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" "insert""query""command" "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获得完整的结果。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/35210.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

【LeetCode: 999. 可以被一步捕获的棋子数 + 模拟】

🚀 算法题 🚀 🌲 算法刷题专栏 | 面试必备算法 | 面试高频算法 🍀 🌲 越难的东西,越要努力坚持,因为它具有很高的价值,算法就是这样✨ 🌲 作者简介:硕风和炜,…

智创 AI 新视界 -- 优化 AI 模型训练效率的策略与技巧(16 - 1)

💖💖💖亲爱的朋友们,热烈欢迎你们来到 青云交的博客!能与你们在此邂逅,我满心欢喜,深感无比荣幸。在这个瞬息万变的时代,我们每个人都在苦苦追寻一处能让心灵安然栖息的港湾。而 我的…

专业140+总分420+上海交通大学819考研经验上交电子信息与通信工程,真题,大纲,参考书。博睿泽信息通信考研论坛,信息通信考研Jenny

考研结束,专业819信号系统与信号处理140,总分420,终于梦圆交大,高考时敢都不敢想目标,现在已经成为现实,考研后劲很大,这一年的复习经历,还是历历在目,整理一下&#xff…

K8S服务突然中断无法访问:报The node had condition: [DiskPressure]异常

一、背景 程序在运行过程中,突然无法访问,发现后台接口也无法访问;查看kuboard,发现报如下异常:The node had condition: [DiskPressure]. 继续查看磁盘使用率,发现系统盘使用率已经高达93%。问题前后呼应…

【工具变量】上市公司企业违规数据(企业当年是否违规、企业当年违规的次数)2000-2022年

一、测算方式:参考C刊《当代财经》纪亚方(2023)老师的研究,通过对上市公司被处罚涉及的年份进行追溯,为了保证企业违规行为变量度量的准确性,将追溯到公司被处罚的年份定义为违规年份。 采用两个指标对企业…

视频孪生携手视联网 智汇云舟亮相中国电信2024数字科技生态大会

12月3日,由中国电信主办的“2024数字科技生态大会”在广州盛大开幕。活动现场,前沿科技与创新理念交相辉映,数字科技未来蓝图徐徐展开。智汇云舟作为中国电信的战略合作伙伴,受邀出席本次活动。 展会期间,以“天翼视联…

Unity 使用LineRenderer制作模拟2d绳子

效果展示: 实现如下: 首先,直接上代码: using System.Collections; using System.Collections.Generic; using UnityEngine;public class LineFourRender : MonoBehaviour {public Transform StartNode;public Transform MidNod…

力扣-图论-4【算法学习day.54】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向和记录学习过程(例如想要掌握基础用法,该刷哪些题?)我的解析也不会做的非常详细,只会提供思路和一些关键点,力扣上的大佬们的题解质量是非…

【射频IC进阶实践教程】2.6 LNA版图设计及DRC/LVS验证

射频集成电路的版图设计非常关键,他对寄生参数非常敏感,需要使其最小化。还需要注意相互耦合的方式本次课程主要介绍射频IC的一些相关布局和连线方面的考虑。 一、版图设计 1. 版图的元件布局 首先打开对应的原理图 点击进行版图设计 由于已经有做好的…

uviewplus中的时间单选框up-datetime-picker的在uni-app+vue3的使用方法

uviewplus中的时间单选框up-datetime-picker的使用方法 前言 在实际开发中,我们经常需要使用时间选择器来让用户选择特定的时间。本文将详细介绍uviewplus中up-datetime-picker组件的使用方法,特别是在处理年月选择时的一些关键实现,因为官方有很多相关的功能和方法…

Spring Bean 的生命周期和获取方式

优质博文:IT-BLOG-CN 一、Spring Bean 的生命周期,如何被管理的 对于普通的 Java对象,当 new的时候创建对象,当它没有任何引用的时候被垃圾回收机制回收。而由 Spring IoC容器托管的对象,它们的生命周期完全由容器控…

【Spring MVC篇】返回响应

个人主页:兜里有颗棉花糖 欢迎 点赞👍 收藏✨ 留言✉ 加关注💓本文由 兜里有颗棉花糖 原创 收录于专栏【Spring MVC】 本专栏旨在分享学习Spring MVC的一点学习心得,欢迎大家在评论区交流讨论💌 目录 一、返回静态页面…

使用Python创建API服务器并打包成exe文件

本文来记录下使用Python创建API服务器并打包成exe文件 文章目录 概述简述API服务器创建打包API服务器为exe文件本文小结 概述 在软件开发中,API服务器是连接前端和后端服务的桥梁,而Python因其丰富的库和框架,如Flask、Django等,成…

MHA切换过程

MHA(Master High Availability)是一套用于MySQL数据库的高可用性解决方案,它能够在主服务器发生故障时自动将一个从服务器提升为新的主服务器,从而实现数据库服务的持续可用。MHA的切换过程主要包括以下几个步骤: 1. …

NextUI 教程:打造美观高效的React UI

NextUI 教程:打造美观高效的React UI 项目地址:https://gitcode.com/gh_mirrors/ne/nextui 1. 项目介绍 NextUI 是一个轻量级、快速且现代化的React UI库,提供了一系列优雅的组件以帮助开发者构建令人印象深刻的Web应用。它注重性能和用户体验&#x…

Python和Java后端开发技术对比

在当今互联网技术飞速发展的时代,后端开发扮演着至关重要的角色。Python和Java作为两大主流的后端开发语言,各自具备独特的优势和应用场景。让我们深入了解这两种技术的特点和选择建议。 Java后端开发一直是企业级应用的首选方案。它以强大的类型系统、…

Java HashMap

HashMap 是一个散列表,它存储的内容是键值对(key-value)映射。 HashMap 实现了 Map 接口,根据键的 HashCode 值存储数据,具有很快的访问速度,最多允许一条记录的键为 null,不支持线程同步。 HashMap 是无序的&#x…

模型案例:| 帐篷检测模型!

导读 2023年以ChatGPT为代表的大语言模型横空出世,它的出现标志着自然语言处理领域取得了重大突破。它在文本生成、对话系统和语言理解等方面展现出了强大的能力,为人工智能技术的发展开辟了新的可能性。同时,人工智能技术正在进入各种应用领…

实验日志——DETR

DETR训练日志 1. 代码来源 代码源自作者的Github: https://github.com/facebookresearch/detr?tabreadme-ov-file 2. 数据来源 在DETR中只使用了COCO2017数据集,其中训练集有118288张图像,验证集有5001张数据,测试集有40671张数据&#…

18、IO流:

18、IO流: 这一章很枯燥无聊~ 文件: 什么是文件: 文件,对我们并不陌生,文件时保存数据的地方,比如我们经常使用的word文档,txt文档,excel文档…都是文件。它既可以保存一张图片&…