Skip to content

MongoDB mongostat 工具使用

命令语法

基本语法

bash
mongostat [options] [--host <hostname:port>] [--username <username>] [--password <password>] [--authenticationDatabase <dbname>]

常用选项

选项描述
--host <hostname:port>指定 MongoDB 实例地址和端口
--username <username>用户名,用于认证
--password <password>密码,用于认证
--authenticationDatabase <dbname>认证数据库,默认为 admin
--ssl启用 SSL 连接
--tls启用 TLS 连接
--discover自动发现分片集群中的所有节点
--rowcount <n>输出指定行数后退出
--json以 JSON 格式输出
--fields <fields>指定要显示的字段,用逗号分隔
--noheaders不显示表头
--http使用 HTTP 协议连接
<interval>采样间隔,单位为秒,默认为 1 秒

输出解读

输出示例

insert query update delete getmore command dirty used flushes vsize  res qrw arw net_in net_out conn                time
    *0    *0     *0     *0       0     1|0  0.0% 0.0%       0  160M 1.1M   0|0   0|0   112b    10.7k    2 Apr 13 14:30:01.454
    *0    *0     *0     *0       0     1|0  0.0% 0.0%       0  160M 1.1M   0|0   0|0   112b    10.7k    2 Apr 13 14:30:02.454
    *0    *0     *0     *0       0     1|0  0.0% 0.0%       0  160M 1.1M   0|0   0|0   112b    10.7k    2 Apr 13 14:30:03.454

输出字段解读

操作计数字段

字段描述
insert每秒插入操作数
query每秒查询操作数
update每秒更新操作数
delete每秒删除操作数
getmore每秒 getMore 操作数(用于游标)
command每秒命令操作数,格式为 `本地命令数

特殊符号

  • *:表示该值被截断,实际值大于显示值
  • -:表示该值为 0 或不可用

存储引擎字段

字段描述
dirtyWiredTiger 缓存中脏数据的百分比
usedWiredTiger 缓存的使用率百分比
flushes每秒写入磁盘的检查点数量

内存使用字段

字段描述
vsizeMongoDB 进程使用的虚拟内存大小
resMongoDB 进程使用的物理内存大小

锁定和队列字段

字段描述
qr等待读锁的队列长度
qw等待写锁的队列长度
ar活跃读客户端数量
aw活跃写客户端数量

网络字段

字段描述
net_in每秒网络输入字节数
net_out每秒网络输出字节数

连接和时间字段

字段描述
conn当前连接数
time采样时间戳

常用命令示例

监控本地实例

命令

bash
mongostat

输出

  • 每秒显示一次本地 MongoDB 实例(默认端口 27017)的性能指标

监控指定实例

命令

bash
mongostat --host 192.168.1.100:27017

输出

  • 监控指定 IP 和端口的 MongoDB 实例

使用认证

命令

bash
mongostat --host 192.168.1.100:27017 --username admin --password password --authenticationDatabase admin

输出

  • 使用用户名和密码认证,监控指定实例

调整采样间隔

命令

bash
mongostat --host 192.168.1.100:27017 5

输出

  • 每 5 秒采样一次,显示监控结果

监控分片集群

命令

bash
mongostat --host mongos-host:27017 --discover

输出

  • 自动发现并监控分片集群中的所有节点

自定义输出字段

命令

bash
mongostat --fields insert,query,update,delete,conn,time 2

输出

  • 仅显示指定字段,每 2 秒采样一次

JSON 格式输出

命令

bash
mongostat --json --host 192.168.1.100:27017 1

输出

  • 以 JSON 格式输出监控结果,便于自动化处理

限制输出行数

命令

bash
mongostat --rowcount 10 --host 192.168.1.100:27017

输出

  • 输出 10 行后退出

输出解读与分析

正常状态指标

操作计数

  • 稳定的操作计数,没有突然的峰值或下降
  • 读操作数与写操作数比例符合业务预期

内存使用

  • res 大小稳定,没有持续增长
  • vsizeres 比例合理(通常 2-3 倍)

锁定和队列

  • qrqw 接近 0
  • araw 与系统资源匹配

存储引擎

  • dirty 百分比 < 20%
  • used 百分比 < 90%
  • flushes 频率稳定

连接数

  • 连接数稳定,远低于最大连接数

异常状态分析

高锁等待

现象qrqw 持续增长

可能原因

  • 慢查询导致锁持有时间过长
  • 索引设计不合理
  • 写操作过于频繁
  • 系统资源不足

解决方案

  • 分析慢查询日志,优化查询
  • 优化索引设计
  • 考虑读写分离或分片
  • 增加系统资源

高内存使用率

现象res 接近或超过系统内存

可能原因

  • 数据量过大,超过内存容量
  • 索引过多
  • 内存泄漏

解决方案

  • 增加系统内存
  • 优化索引,删除不使用的索引
  • 考虑使用分片集群
  • 升级 MongoDB 版本,修复内存泄漏

高连接数

现象conn 接近或达到最大连接数

可能原因

  • 应用连接池配置不合理
  • 连接泄漏
  • 业务流量突增

解决方案

  • 优化应用连接池配置
  • 检查应用代码,修复连接泄漏
  • 考虑增加 MongoDB 实例或分片
  • 临时增加最大连接数

高网络流量

现象net_innet_out 持续过高

可能原因

  • 业务流量突增
  • 大文档传输
  • 不合理的查询(如返回过多数据)

解决方案

  • 优化查询,限制返回字段
  • 使用分页查询
  • 考虑使用缓存
  • 增加网络带宽

最佳实践

1. 监控策略

实时监控

  • 生产环境建议 24/7 实时监控
  • 关键业务高峰期增加监控频率
  • 结合其他监控工具(如 Prometheus、Grafana)

历史数据存储

  • 将监控数据存储到时间序列数据库
  • 保留足够长的历史数据,用于趋势分析
  • 定期生成性能报告

2. 告警配置

告警指标

  • 连接数 > 70% 最大连接数
  • 锁等待队列长度 > 10
  • 内存使用率 > 90%
  • 复制延迟 > 30s
  • 操作数异常波动(如突然增长或下降)

告警方式

  • 邮件告警
  • 短信告警
  • 即时通讯工具告警(如 Slack、微信)
  • 电话告警(严重情况)

3. 性能基线建立

基线定义

  • 在系统正常运行时收集监控数据
  • 建立各项指标的正常范围
  • 定期更新基线,适应业务变化

基线使用

  • 对比当前指标与基线,识别异常
  • 用于容量规划和性能优化

4. 自动化监控

脚本示例

bash
#!/bin/bash

# 监控 MongoDB 实例
mongostat --json --host 192.168.1.100:27017 1 | while read line; do
    # 解析 JSON 数据
    conn=$(echo $line | jq -r '.conn')
    qr=$(echo $line | jq -r '.qr')
    qw=$(echo $line | jq -r '.qw')
    time=$(echo $line | jq -r '.time')
    
    # 检查连接数
    if [ "$conn" -gt 5000 ]; then
        echo "[$time] WARNING: Connection count is high: $conn" >> /var/log/mongodb/alerts.log
    fi
    
    # 检查锁等待
    if [ "$qr" -gt 10 ] || [ "$qw" -gt 10 ]; then
        echo "[$time] WARNING: Lock queue is high - qr: $qr, qw: $qw" >> /var/log/mongodb/alerts.log
    fi
done

自动化集成

  • 与监控系统集成(如 Prometheus + Alertmanager)
  • 与自动化运维平台集成
  • 实现自动扩缩容

5. 注意事项

性能影响

  • mongostat 本身对数据库性能影响很小,但高频采样可能会增加开销
  • 生产环境建议采样间隔不小于 1 秒

权限要求

  • 监控分片集群需要 clusterMonitor 角色
  • 监控单个实例需要 read 角色

版本兼容性

  • 不同 MongoDB 版本的 mongostat 输出可能略有差异
  • 建议使用与数据库版本匹配的 mongostat 版本

输出解读

  • 单一指标异常可能不代表问题,需要综合分析
  • 结合业务场景解读监控数据

与其他监控工具比较

mongostat vs mongotop

特性mongostatmongotop
监控粒度实例级集合级
主要指标操作计数、连接数、内存使用等集合读写耗时
适用场景整体性能监控集合级性能分析
输出频率秒级秒级

mongostat vs db.serverStatus()

特性mongostatdb.serverStatus()
输出方式命令行实时输出MongoDB Shell 命令,单次输出
监控频率可自定义,默认 1 秒手动执行,无实时监控
输出格式表格或 JSONJSON
适用场景实时监控、自动化脚本详细状态查询、一次性分析

mongostat vs MongoDB Atlas/Ops Manager

特性mongostatMongoDB Atlas/Ops Manager
部署方式命令行工具云服务或本地部署
监控范围单个实例或集群完整的集群监控
功能丰富度基础监控全面的监控、告警、备份等
成本免费付费或企业版
易用性需要手动操作可视化界面,易于使用

常见问题(FAQ)

Q1: mongostat 输出中的 * 符号是什么意思?

A1: * 符号表示该值被截断,实际值大于显示值。例如,*1000 表示实际插入操作数超过 1000 次/秒。

Q2: 如何使用 mongostat 监控分片集群?

A2: 使用 --discover 选项,mongostat 会自动发现分片集群中的所有节点并监控。命令示例:

bash
mongostat --host mongos-host:27017 --discover

Q3: mongostat 可以监控副本集吗?

A3: 是的,mongostat 可以监控副本集。它会显示所有副本集成员的状态,包括主节点和副本节点。

Q4: 如何将 mongostat 输出保存到文件?

A4: 使用重定向符号 > 将输出保存到文件:

bash
mongostat --json 1 > mongostat_output.json

Q5: mongostat 对数据库性能有影响吗?

A5: mongostat 本身对数据库性能影响很小,因为它只读取状态信息,不执行写操作。但高频采样(如 < 1 秒)可能会增加少量开销,建议生产环境使用 1-5 秒的采样间隔。

Q6: 如何解读 mongostat 输出中的 command 字段?

A6: command 字段显示每秒执行的命令数,格式为 本地命令数|复制命令数。本地命令是指直接发送到该实例的命令,复制命令是指从主节点复制到副本节点的命令。

Q7: mongostat 支持 TLS/SSL 连接吗?

A7: 是的,mongostat 支持 TLS/SSL 连接。使用 --ssl--tls 选项启用 TLS/SSL 连接,例如:

bash
mongostat --host 192.168.1.100:27017 --tls --tlsCAFile /path/to/ca.pem

Q8: 如何只显示特定的监控字段?

A8: 使用 --fields 选项指定要显示的字段,用逗号分隔。例如:

bash
mongostat --fields insert,query,update,delete,conn,time