跳到主要内容

第8章 MongoDB监控

8.1 监控工具概述

MongoDB提供了多种监控工具来查看数据库运行状态,帮助管理员了解系统性能和资源使用情况。

mongo           # 客户端连接工具
mongod # 启动命令
mongos # 分片路由命令
mongostat # 查看mongo运行状态
mongotop # 查看mongo运行状态
mongodump # 备份
mongoexport # 备份
mongoimport # 恢复
mongorestore # 恢复
bsondump # 将bson格式导出json格式

mongostat使用配置

基本使用命令:

mongostat --port 28018 -o vsize,res --humanReadable=false --noheaders -n 1

参数说明:

参数功能说明
--humanReadable=false将G转换为K
--noheaders不输出首行标题
-n 1只输出一次

mongostat指标解析

操作统计指标:

字段说明
insert/s每秒插入数据库的对象数量,如果是slave,数值前有*表示复制集操作
query/s每秒的查询操作次数
update/s每秒的更新操作次数
delete/s每秒的删除操作次数
getmore/s每秒查询cursor(游标)时的getmore操作数
command每秒执行的命令数,主从系统显示两个值(如3|0),分别代表本地|复制命令

注意:一秒内执行的命令数比如批量插入,只认为是一条命令(所以意义不大)

WiredTiger引擎指标:

字段说明
dirty脏数据字节的缓存百分比(仅WiredTiger引擎)
used正在使用中的缓存百分比(仅WiredTiger引擎)
flushesWiredTiger引擎:checkpoint触发次数;MMAPv1引擎:每秒fsync写入硬盘次数

监控要点:flushes一般都是0,间断性会是1。通过计算两个1之间的间隔时间,可以了解flush频率。频繁flush需要查找原因。

系统资源指标:

字段说明监控注意事项
vsize虚拟内存使用量(MB)一般不会有大的变动
res物理内存使用量(MB)会慢慢上升,突然下降需检查是否有其他程序占用内存
qr客户端等待从MongoDB实例读数据的队列长度数值很大表示DB处理不及请求速度
qw客户端等待向MongoDB实例写入数据的队列长度同上
ar执行读操作的活跃客户端数量需要检查是否有开销很大的慢查询
aw执行写操作的活跃客户端数量同上
netInMongoDB实例的网络进流量一般情况下不会成为瓶颈
netOutMongoDB实例的网络出流量同上
conn打开连接的总数,是qr,qw,ar,aw的总和建议配置maxIncomingConnections在5000以下

性能提示:MongoDB为每个连接创建一个线程,线程创建与释放有开销,需适当配置连接数启动参数。

mongotop监控工具

mongotop        # 基本监控
mongotop 5 # 每5秒刷新一次

实战监控案例

高资源占用检测:

测试数据插入:

use oldboy
for(i=1;i<10000;i++){
db.cook.insert({"id":i,"name":"BJ","age":70,"date":new Date()});
}

并行监控观察:

mongostat
mongotop

监控最佳实践

持续监控配置:

  • 设置合适的监控间隔
  • 关注关键性能指标变化趋势
  • 结合系统级监控工具
  • 建立告警机制

性能瓶颈识别:

  • 监控队列长度(qr/qw)变化
  • 观察连接数增长趋势
  • 分析内存使用模式
  • 检查慢查询影响

故障排查与优化

常见问题排查:

  1. 连接数过多:检查应用连接池配置
  2. 内存持续增长:分析查询模式和索引使用
  3. 队列积压:识别慢查询和资源瓶颈
  4. 网络流量异常:检查数据传输和同步状态

监控数据分析:

通过mongostat和mongotop的输出数据,可以:

  • 建立性能基线
  • 识别异常模式
  • 预测容量需求
  • 优化查询性能

更新: 2025-01-26