mongostat 命令

news/2025/11/6 6:54:59/文章来源:https://www.cnblogs.com/gdjgs/p/19144756

mongostat 命令

mongostat 是 MongoDB 自带的轻量级监控工具,功能类似 Linux 的 vmstat,能按固定时间间隔(默认 1 秒)采集实例运行指标并输出,是运维人员排查性能瓶颈、监控实例健康状态的核心工具。本文将从连接方式、结果解读、高级参数到实战排查,全面讲解 mongostat 的使用方法。

一、基础用法:连接不同场景的 MongoDB 实例

mongostat 支持连接本地单机实例、复制集等场景,核心是通过命令行参数指定连接信息、输出次数和间隔。以下是两种典型场景的实战命令。

1.1 连接本地单机实例

适用于开发环境或单机部署的生产环境,需指定主机、端口、认证信息(若开启)。
 
# 命令格式:mongostat --host=主机 --port=端口 --username=用户名 --humanReadable=true --authenticationDatabase=认证库 -n 输出次数 采集间隔
mongostat --host=127.0.0.1 --port=27017 --username=admin --humanReadable=true --authenticationDatabase=admin -n 20 1
 
 
关键参数解释:
 
  • --humanReadable=true:将内存、流量等指标转换为易读单位(如 G、k),避免原始数字难以理解。
  • -n 20:指定输出 20 次后停止(若不指定,会持续输出直到手动按 Ctrl+C 终止)。
  • 1:采集间隔为 1 秒(单位:秒),可根据需求调整(如 5 秒采集一次则写 5)。
  • --authenticationDatabase=admin:指定认证数据库(通常为 admin,与创建用户时的数据库一致)。

1.2 连接 MongoDB 复制集

生产环境多采用复制集部署,需指定所有节点地址(避免单点依赖),格式与单机类似。
 
# 连接复制集:指定多个节点地址,用逗号分隔
mongostat --host=20.20.20.64:27017,20.20.20.65:27017,20.20.20.66:27017 --username=admin --humanReadable=true --authenticationDatabase=admin -n 20 1
 
 
执行后会自动识别复制集角色(主节点 PRIMARY、从节点 SECONDARY),并在输出结果中体现(repl 字段)。

二、核心解读:mongostat 输出结果含义

执行命令后,会输出多列指标,每一行代表一个采集周期的数据。以下结合实际输出示例,按 “功能分类” 解读关键字段,重点标注需警惕的阈值。

2.1 输出示例(节选)

 
insert  query update delete getmore command dirty  used flushes vsize   res qrw arw net_in net_out conn            set           repl                time*0     4     *0     *0       0    35|0  0.1% 79.6%       0 11.3G 8.86G 0|0 0|0  10.2k    373k  103 myabc_mongo_rs   SLV Apr 10 10:27:26.560*0     0     *0     *0       3    10|0  0.1% 79.6%       0 11.3G 8.86G 0|0 0|0   6.37k   66.3k  103 myabc_mongo_rs   SLV Apr 10 10:27:28.559
 

2.2 字段分类解读

按功能可将字段分为 4 类,其中 标红部分为需重点监控的指标。

(1)读写操作类:反映业务访问压力

字段含义  
insert 每秒插入的文档数,带 * 表示该操作是复制集同步的操作(从节点特有)。    
query 每秒执行的查询操作数(含普通查询、聚合查询等)。    
update 每秒执行的更新操作数。    
delete 每秒执行的删除操作数。    
getmore 每秒通过游标获取批量数据的操作数(如分页查询的后续请求)。    
command 每秒执行的命令数(如 createIndexdropCollection);从节点会显示 “本地 复制”(如 `35 0`),前者是本地命令,后者是复制命令。

(2)缓存与存储类:反映实例资源占用(重点关注)

这类指标直接关联性能瓶颈,尤其是 WiredTiger 引擎(MongoDB 3.2+ 默认引擎)下的 dirty 和 used
 
字段含义与阈值警示
dirty WiredTiger 引擎的脏数据比例(内存中未刷到磁盘的数据)。
 
⚠️ 阈值:5%(触发主动刷盘)、20%(阻塞新请求,全力刷盘)。
used WiredTiger 引擎已占用的内存比例(MongoDB 默认最大占用系统内存的 60%)。
 
⚠️ 阈值:80%(触发 LRU 淘汰旧数据)、95%(阻塞操作,全力淘汰数据)。
flushes 刷盘次数:WiredTiger 下是检查点(checkpoint)次数,MMAPv1 下是 fsync 次数。
 
⚠️ 频繁刷盘(如每秒 1 次以上)可能导致 IO 压力过大。
vsize MongoDB 占用的虚拟内存大小(单位:G),通常大于物理内存,无需过度关注。
res MongoDB 占用的物理内存大小(单位:G),需结合系统内存判断是否溢出。

(3)连接与网络类:反映请求拥堵情况

字段含义与阈值警示  
qrw 客户端等待处理的读写队列长度(格式:读队列 写队列,如 `0 0`)。
 
⚠️ 队列长度持续大于 5,说明实例处理速度跟不上请求量,可能有慢查询或资源瓶颈。
arw 客户端正在处理的活跃读写操作数(格式:读 写)。
 
⚠️ 数值持续过大(如超过 50),需检查是否有耗时操作阻塞线程。
 
net_in 实例每秒接收的网络流量(含 mongostat 自身流量),单位通常为 k(千字节)。    
net_out 实例每秒发送的网络流量,单位通常为 k 或 M(如大查询会导致该值骤增)。    
conn 当前打开的连接总数(含应用连接、mongostat 连接等),需小于 MongoDB 最大连接数(默认 65536)。    

(4)复制集信息类:反映集群角色与时间

字段含义
set 复制集名称(如示例中的 myabc_mongo_rs),确认连接的集群是否正确。
repl 节点角色:PRI(主节点)、SLV(从节点)、ARB(仲裁节点)。
time 采集该条数据的时间戳,用于定位问题发生时间。

三、高级用法:自定义输出字段

默认输出的字段较多,若只需关注特定指标(如仅监控查询量和内存占用),可通过 -o 和 -O 参数自定义输出,减少信息干扰。

3.1 -o:仅输出指定字段

-o 会屏蔽默认字段,只显示你指定的列,适合聚焦单一维度监控。格式为 字段1,字段2=别名(可选),支持对指标做 rate()(每秒比率)或 diff()(两次采集差值)计算。
 
# 示例:仅输出主机、插入率、查询率、命令率、缓存请求数
mongostat --host=127.0.0.1 --port=27017 --username=admin --humanReadable=true --authenticationDatabase=admin -n 5 1 -o='host,opcounters.insert.rate()=Insert Rate,opcounters.query.rate()=Query Rate,opcounters.command.rate()=Command Rate,wiredTiger.cache.pages requested from the cache=Pages Req'
 
 
输出结果(简洁聚焦):
 
           host Insert Rate Query Rate Command Rate   Pages Req
127.0.0.1:27017           0          0            3 10809493343
127.0.0.1:27017           0          3           36 10809494060
 

3.2 -O:在默认字段基础上增加自定义字段

-O 不会屏蔽默认输出,而是在默认列后追加指定字段,适合需要保留基础指标、同时补充额外信息的场景(如查看 MongoDB 版本)。
 
# 示例:默认字段 + 主机 + 版本 + 网络请求数
mongostat --host=127.0.0.1 --port=27017 --username=admin --humanReadable=true --authenticationDatabase=admin -n 3 1 -O='host,version,network.numRequests=network requests'
 
 
输出结果(默认列 + 新增列):
 
insert query update delete getmore command dirty  used flushes vsize   res qrw arw net_in net_out conn            set           repl                time            host version network requests*0     0     *0     *0       0     2|0  0.0% 79.5%       0 11.3G 8.90G 0|0 0|0   560b   59.5k  103 myabc_mongo_rs   SLV Apr 10 11:13:25.792 127.0.0.1:27017  5.0.13        140029101
 

四、实战排查:常见问题与解决方案

通过 mongostat 发现异常后,需结合指标定位问题根源。以下是 3 类高频问题的排查思路。

4.1 问题 1:qrw 队列持续大于 5(请求拥堵)

  • 现象:qrw 字段如 3|5(读队列 3,写队列 5),且持续 10 秒以上。
  • 排查步骤:
    1. 查看 query/update 字段,确认是否有突发的请求量增长(如业务峰值)。
    2. 若请求量正常,需排查慢查询(通过 mongosh 执行 db.currentOp() 查看当前耗时操作)。
  • 解决方案:
    • 若为业务峰值,可临时扩容实例或优化请求频率(如缓存热点数据)。
    • 若为慢查询,需添加索引(如 db.collection.createIndex({field:1}))或优化查询语句(避免全表扫描)。

4.2 问题 2:dirty 比例超过 10%(脏数据堆积)

  • 现象:dirty 字段如 15%,且持续上升(接近 20% 阈值)。
  • 原因:写入速度超过刷盘速度,导致内存中未刷盘的数据堆积。
  • 解决方案:
    1. 检查 flushes 字段,确认是否刷盘频率过低(如 5 分钟以上未刷盘)。
    2. 临时调整 WiredTiger 刷盘参数(需谨慎,建议先咨询官方):db.adminCommand({setParameter: 1, wiredTigerEngineRuntimeConfig: "checkpoint=(wait=60)"})(设置每 60 秒强制刷盘一次)。
    3. 长期解决方案:升级磁盘 IO 性能(如从 HDD 换 SSD)或拆分写入压力(如分库分表)。

4.3 问题 3:used 比例超过 85%(内存占用过高)

  • 现象:used 字段如 88%,且持续上升(接近 95% 阈值)。
  • 原因:缓存的热数据过多,或存在内存泄漏(罕见)。
  • 解决方案:
    1. 查看 res 字段,确认物理内存是否真的不足(如 res=11G,系统内存仅 16G)。
    2. 执行 db.runCommand({clearCache: 1}) 手动清理缓存(仅临时缓解,需谨慎在业务低峰执行)。
    3. 长期解决方案:增加实例内存(如从 16G 升级到 32G)或优化数据访问模式(减少大文档的频繁读取)。

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Got Fatal Error 1236 或 MY-013114 Error

Got Fatal Error 1236 或 MY-013114 Error错误事务(errant transaction) 比如开始GTID的复制:1 2 3 4 5 6 7 8mysql > show replica status\G *************************** 1. row *************************** ..…

XMind 2024 pro 破解版下载及安装使用教程

XMind 2024 pro 破解版下载及安装使用教程前言 XMind 是一款专业的全球领先的商业思维导图软件,在国内使用广泛,拥有强大的功能、包括思维管理、商务演示、与办公软件协同工作等功能。 它采用全球先进的Eclipse RCP软…

Tailscale 虚拟局域网 安装

Tailscale 虚拟局域网 安装Tailscale 是一款基于 WireGuard 协议开发的轻量级网络工具,被称作"零配置虚拟局域网"神器。它能让散落在不同地方的设备通过加密通道组成一个专属的私人网络(虚拟局域网),实现…

[转]Register an application

[转]Register an application注册应用程序 - Training | Microsoft Learn 本文转自:Register an application - Training | Microsoft Learn注册应用程序已完成100 XP12 分钟注册应用程序会在应用与 Microsoft 标识平…

[转]Adobe Marketo 向 Azure 註冊應用程式,以取得用戶端 ID/應用程式 ID

[转]Adobe Marketo 向 Azure 註冊應用程式,以取得用戶端 ID/應用程式 ID本文转自:向 Azure 註冊應用程式,以取得用戶端 ID/應用程式 ID | Adobe Marketo EngageAzure Active Directory將您的內部部署目錄延伸至雲端…

Redis Lua沙箱逃逸漏洞分析与防护方案

本文详细分析了Redis Lua脚本子系统中的UAF漏洞CVE-2025-49844(RediShell),该漏洞允许攻击者逃逸沙箱执行任意代码。文章提供了修复方案、临时缓解措施,并介绍了FortiGuard系列产品的防护能力,包括漏洞检测、入侵…

pyslam - MKT

pyslam 1 创建环境 pyslamREM 保存当前目录 set STARTING_DIR=%cd% set ROOT_DIR=.. cd %ROOT_DIR%REM 检查 conda conda --version if errorlevel 1 (echo 错误:请先安装 condapauseexit )REM 创建环境 call script…

【Linux dbus】1-连接消息总线守护进程,创建名字

前言 本文章以函数dbus_bus_get()和dbus_bus_request_name()两个函数为引子,介绍如何连接消息总线守护进程,并为当前进程起一个名字dbus_bus_get 函数核心概念 dbus_bus_get 是 D-Bus 库(特别是在 libdbus 这个底层…

【Linux dbus】2-dbus发送消息(以创建方法调用为例)的过程

消息(方法调用)创建后的典型流程 仅仅创建消息头是不够的,完整的调用流程如下:创建方法调用消息 - dbus_message_new_method_call添加参数 - dbus_message_append_args发送消息 - dbus_connection_send(可选)等待…

CSP-S 2025 复赛解析

刚写完,暂时只放了代码,具体思路争取在7号晚上补完[CSP-S 2025] 社团招新 / club 题目描述 小 L 是学校算法协会的成员。在今年的学校社团招新中,小 L 一共招收了 \(n\) 个新成员,其中 \(n\) 为偶数。现在小 L 希望…

记录一次Prism9隐式注册引发的事件聚合器失效问题

直接上代码 1、我的注册从App的RegisterTypes方法迁移到了模块public class AccountModule : IModule{public void OnInitialized(IContainerProvider containerProvider){}public void RegisterTypes(IContainerRegis…

20232318 2025-2026-1 《网络与系统攻防技术》实验四实验报告

一、实验内容 本次实验围绕恶意代码分析的核心流程展开,具体包含四项关键任务:一是识别恶意代码的文件类型标识,完成文件脱壳操作与字符串提取,为后续分析扫清障碍;二是运用 IDA Pro 工具对指定 exe 文件开展静态…

用友U8C销售订单开单比较慢

1.登录软件录SPRso_accountmany_m比较耗时 2.检查so_accountmany_m的索引SELECTa.uniqueness 索引类型,b.index_name 索引名称,b.column_name 字段,a.table_name 表名 FROMuser_indexes a ,user_ind_columns b WHEREa.…

Winfrom机器人自动寻路

Winfrom机器人自动寻路public partial class Form1 : Form{private const int MapWidth = 25;private const int MapHeight = 20;private const int CellSize = 50;private List<Obstacle> obstacles = new List…

低代码平台基础知识

1.数据导入 在数据源将数据库下的物理表导入为数据模型 新建 → 数据库表模型 → 搜索 → 导入目录 一 连接方式(实时连接/只读模式/读写模式) 2.空白模型 使用空白模型定义表结构 新建 → 空白模型 切换到字段列表 →…

test first

记录第一次使用 简单写一点内容看看效果展示 展示

Win11 install CUDA 12.5

1.Check pc supported Nvidia GPUnvidia-smi 2.Download CUDA12.5https://developer.download.nvidia.cn/compute/cuda/12.5.0/local_installers/cuda_12.5.0_555.85_windows.exe3.Install CUDA12.5//validate nvcc --…

机器学习-逻辑回归算法-向量版代码

`import numpy as np x_train=[[1,2],[1,3],[1,6],[1,9],[1,2],[1,3],[1,6],[1,9]] y_train=[1,1,0,0,1,1,0,0] x_train_num=len(x_train) 向量化训练组 x_a=np.array(x_train) x_v=(x_a.T) y_v=np.array(y_train) pri…

星期三

今天离散和马原感觉没啥意思。早上第1节课太困了。睡着了。

「学习笔记」文件包含

文件包含开发人员常常把可重复使用的函数写入到单个文件中,在使用该函数时,直接调用此文件,而无需再次编写函数,这一过程就叫做包含。文件包含漏洞 通常出现在动态网页中,有时候由于网站功能需求,会让前端用户选…