阿里云主机折上折
  • 微信号
您当前的位置:网站首页 > MongoDB自带的监控工具(mongostat、mongotop)

MongoDB自带的监控工具(mongostat、mongotop)

作者:陈川 阅读数:23443人阅读 分类: MongoDB

MongoDB提供了两个内置的监控工具mongostatmongotop,它们能够实时展示数据库的运行状态和性能指标。这两个工具不需要额外安装,直接通过命令行即可使用,适合快速诊断数据库问题。

mongostat的基本用法

mongostat类似于Linux系统的vmstat,它以固定时间间隔(默认1秒)采样并返回MongoDB实例的统计信息。基本命令格式如下:

mongostat --host <hostname>:<port> --username <user> --password <pass> --authenticationDatabase admin

如果不指定认证信息,默认连接到本地27017端口的MongoDB实例:

mongostat

输出示例:

insert query update delete getmore command flushes mapped vsize res faults qr|qw ar|aw netIn netOut conn time
    *0    *0     *0     *0       0     1|0       0  80.0M 1.21G 50.0M      0   0|0   0|0   79b    10k    1 14:02:45
    *0    *0     *0     *0       0     1|0       0  80.0M 1.21G 50.0M      0   0|0   0|0   79b    10k    1 14:02:46

mongostat输出字段详解

每个字段代表特定时间间隔内的统计值:

  1. 操作计数器(单位:次/秒)

    • insert/query/update/delete:增删改查操作次数
    • getmore:游标批量获取操作
    • command:管理命令执行次数
  2. 存储引擎指标

    • flushes:WAL刷新次数(MMAPv1引擎)
    • vsize:虚拟内存用量
    • res:物理内存用量
  3. 性能指标

    • faults:页错误数(仅MMAPv1)
    • qr|qw:读写队列长度
    • netIn/netOut:网络流量(字节)

mongostat高级用法

通过参数可以定制监控内容:

# 每5秒采样一次,显示20次后退出
mongostat --rowcount 20 --interval 5

# 只显示指定字段
mongostat --discover -o "host=HOST,time=TIME,qr=QR,qw=QW"

# 监控副本集所有成员
mongostat --host rs0/example1:27017,example2:27017 --discover

mongotop的基本用法

mongotop用于监控集合级别的读写时间消耗,类似于Linux的top命令。基本使用方式:

mongotop --host localhost:27017

输出示例:

ns                      total        read        write
admin.system.roles      0ms         0ms         0ms  
test.users              105ms       30ms        75ms 
local.oplog.rs          50ms        50ms        0ms  

mongotop输出解读

  1. ns:命名空间(数据库.集合)
  2. total:总耗时(毫秒)
  3. read/write:读写操作耗时占比

mongotop高级配置

# 每3秒刷新一次,持续10次
mongotop --interval 3 --rowcount 10

# JSON格式输出
mongotop --json

# 监控指定数据库
mongotop --host localhost --username admin --password pass --authenticationDatabase admin test

实际应用场景示例

场景一:识别慢查询

mongotop -n 10  # 显示耗时最高的10个集合

场景二:诊断写入瓶颈

mongostat -o "insert,update,delete,dirty,used"  # 关注写入相关指标

场景三:内存压力分析

mongostat --noheaders --rowcount 60 --interval 5 | grep -v "connected to" > stats.log

与第三方工具的集成

可以通过管道将监控数据传递给其他工具处理:

// Node.js处理mongostat输出示例
const { exec } = require('child_process');
const mongostat = exec('mongostat --json');

mongostat.stdout.on('data', (data) => {
  const stats = JSON.parse(data);
  console.log(`Current ops: ${stats.insert} inserts/s`);
});

监控分片集群

对于分片集群需要特殊处理:

# 监控所有mongos实例
for shard in shard1:27017 shard2:27018; do
  mongostat --host $shard >> cluster_stats.log &
done

安全注意事项

  1. 监控工具需要clusterMonitor角色权限
  2. 生产环境建议使用TLS加密连接:
    mongostat --host dbserver --ssl --sslCAFile /path/to/ca.pem
    

性能影响评估

默认采样间隔下监控工具的资源消耗:

  • CPU占用:< 1%
  • 网络流量:约2KB/s(基础指标)
  • 内存消耗:约10MB

长期监控建议采用以下策略:

# 每天生成一个日志文件
mongostat --rowcount 86400 --interval 1 > $(date +%Y%m%d).log

指标异常处理指南

当出现特定指标异常时可参考以下应对措施:

指标异常 可能原因 检查方向
qw持续>0 写入阻塞 检查磁盘IOPS、journal性能
netOut突增 大量数据返回 检查查询是否未使用索引
res持续增长 内存泄漏 检查workingSet是否超出物理内存

历史数据分析技巧

将监控数据导入MongoDB自身进行分析:

// 将mongostat输出存入集合
use admin
db.createCollection("server_stats")
mongostat --json | mongo --eval '
  while (line=readline()) {
    db.server_stats.insert(JSON.parse(line))
  }
'

本站部分内容来自互联网,一切版权均归源网站或源作者所有。

如果侵犯了你的权益请来信告知我们删除。邮箱:cc@cccx.cn

前端川

前端川,陈川的代码茶馆🍵,专治各种不服的Bug退散符💻,日常贩卖秃头警告级的开发心得🛠️,附赠一行代码笑十年的摸鱼宝典🐟,偶尔掉落咖啡杯里泡开的像素级浪漫☕。‌