外观
MongoDB db.serverStatus()
基本用法
命令格式:
javascriptdb.serverStatus()返回结果:
- 服务器运行时状态
- 性能指标
- 连接信息
- 存储引擎状态
- 复制集状态
权限要求:
- 需要clusterMonitor或更高权限
- 建议授予clusterMonitor角色给监控用户
常用参数
showMem:
javascript// 显示内存使用详细信息 db.serverStatus({ showMem: true })recordStats:
javascript// 记录命令统计信息 db.serverStatus({ recordStats: true })recordOpLatencies:
javascript// 记录操作延迟统计 db.serverStatus({ recordOpLatencies: true })
核心指标详解
连接状态
connections:
javascript// 查看连接状态 db.serverStatus().connections- current:当前活跃连接数
- available:可用连接数
- totalCreated:自启动以来创建的连接总数
- rejected:被拒绝的连接数(达到maxConns限制)
连接监控建议:
- 监控current/available比率
- 关注rejected指标,非零值表示连接数达到上限
- 调整maxIncomingConnections参数以增加连接数
操作计数器
opcounters:
javascript// 查看操作计数器 db.serverStatus().opcounters- insert:插入操作数
- query:查询操作数
- update:更新操作数
- delete:删除操作数
- getmore:cursor getmore操作数
- command:命令操作数
opcountersRepl:
javascript// 查看复制操作计数器 db.serverStatus().opcountersRepl- 复制集从节点应用oplog的操作计数
- 指标与opcounters类似
存储引擎状态
wiredTiger:
javascript// 查看WiredTiger存储引擎状态 db.serverStatus().wiredTiger- cache:缓存使用情况
- session:会话统计
- transaction:事务统计
- block-manager:块管理器统计
WiredTiger缓存监控:
javascript// 查看缓存关键指标 db.serverStatus().wiredTiger.cache- bytes currently in the cache:当前缓存大小
- maximum bytes configured:配置的最大缓存大小
- percent dirty in the cache:缓存中脏页百分比
- pages evicted by application threads:应用线程驱逐的页数
复制集状态
repl:
javascript// 查看复制集状态 db.serverStatus().repl- ismaster:是否为主节点
- secondary:是否为从节点
- electable:是否可被选举
- hidden:是否为隐藏节点
- priority:节点优先级
复制延迟指标:
javascript// 查看复制延迟相关指标 db.serverStatus().metrics.repl
网络状态
network:
javascript// 查看网络状态 db.serverStatus().network- bytesIn:输入字节数
- bytesOut:输出字节数
- numRequests:请求总数
网络监控建议:
- 监控bytesIn/bytesOut增长趋势
- 关注numRequests与操作计数器的比例
- 检测异常的网络流量变化
内存使用
mem:
javascript// 查看内存使用情况 db.serverStatus().mem- bits:操作系统位数
- resident:物理内存使用量
- virtual:虚拟内存使用量
- supported:是否支持内存报告
extra_info:
javascript// 查看额外内存信息 db.serverStatus().extra_info- page_faults:页面错误数
- heap_usage_bytes:堆使用字节数
性能诊断应用
识别性能瓶颈
CPU使用率:
javascript// 查看CPU使用率 db.serverStatus().processCpuTotal磁盘I/O:
javascript// 查看磁盘I/O状态 db.serverStatus().diskIO- reads:读操作数
- writes:写操作数
- readWait:读等待时间
- writeWait:写等待时间
慢查询检测:
javascript// 查看慢查询数 db.serverStatus().metrics.query.executor.scanned
监控复制集健康
选举统计:
javascript// 查看选举统计 db.serverStatus().metrics.repl.elections心跳检测:
javascript// 查看心跳统计 db.serverStatus().metrics.repl.heartbeatsOplog状态:
javascript// 查看oplog相关指标 db.serverStatus().metrics.repl.oplog
存储引擎诊断
WiredTiger事务:
javascript// 查看事务统计 db.serverStatus().wiredTiger.transactionWiredTiger锁:
javascript// 查看锁统计 db.serverStatus().wiredTiger.concurrentTransactions缓存命中率:
javascript// 计算缓存命中率 const cache = db.serverStatus().wiredTiger.cache; const hits = cache["cache hits"]; const misses = cache["cache misses"]; const hitRatio = hits / (hits + misses); print("Cache hit ratio: " + (hitRatio * 100).toFixed(2) + "%");
监控脚本示例
基本监控脚本
简单监控脚本:
javascript// 监控关键指标 function monitorMongoDB() { const status = db.serverStatus(); print("=== MongoDB Server Status ==="); print("Time: " + new Date()); print("Version: " + status.version); print("Connections: " + status.connections.current + "/" + (status.connections.current + status.connections.available)); print("CPU: " + status.processCpuTotal.toFixed(2) + "%"); print("Opcounters: " + JSON.stringify(status.opcounters)); print("Cache: " + (status.wiredTiger.cache["bytes currently in the cache"] / 1024 / 1024).toFixed(2) + "MB / " + (status.wiredTiger.cache["maximum bytes configured"] / 1024 / 1024).toFixed(2) + "MB"); print("Cache dirty: " + status.wiredTiger.cache["percent dirty in the cache"].toFixed(2) + "%"); if (status.repl) { print("Replication: " + (status.repl.ismaster ? "Primary" : "Secondary")); } } // 运行监控 monitorMongoDB();定期监控:
javascript// 每5秒监控一次,共10次 for (let i = 0; i < 10; i++) { monitorMongoDB(); sleep(5000); }
告警脚本示例
连接数告警:
javascript// 连接数告警脚本 function checkConnections() { const status = db.serverStatus(); const conn = status.connections; const total = conn.current + conn.available; const usage = (conn.current / total) * 100; if (usage > 80) { print("ALERT: Connection usage is high: " + usage.toFixed(2) + "%"); print("Current: " + conn.current + ", Available: " + conn.available); } else { print("Connection usage is normal: " + usage.toFixed(2) + "%"); } } checkConnections();缓存命中率告警:
javascript// 缓存命中率告警脚本 function checkCacheHitRatio() { const cache = db.serverStatus().wiredTiger.cache; const hits = cache["cache hits"]; const misses = cache["cache misses"]; const hitRatio = hits / (hits + misses); if (hitRatio < 0.9) { print("ALERT: Cache hit ratio is low: " + (hitRatio * 100).toFixed(2) + "%"); print("Hits: " + hits + ", Misses: " + misses); } else { print("Cache hit ratio is normal: " + (hitRatio * 100).toFixed(2) + "%"); } } checkCacheHitRatio();
最佳实践
监控频率
生产环境:
- 核心指标:每10-30秒
- 详细指标:每5-15分钟
- 历史趋势:每天汇总
测试环境:
- 可降低监控频率
- 重点关注测试期间的性能变化
权限管理
监控用户权限:
javascript// 创建监控用户 use admin db.createUser({ user: "monitor", pwd: "monitor123", roles: [{ role: "clusterMonitor", db: "admin" }] })避免使用root权限:
- 生产环境中只授予必要的最小权限
- 使用专用监控用户
指标解读
相对变化比绝对值更重要:
- 关注指标的变化趋势
- 建立基线,识别异常变化
综合分析多个指标:
- 单一指标异常可能不代表问题
- 结合多个指标进行诊断
定期校准监控阈值:
- 根据业务变化调整告警阈值
- 避免过多误报
常见问题(FAQ)
Q1: db.serverStatus()返回哪些核心指标?
A1: db.serverStatus()返回的核心指标包括:
- 连接状态(connections)
- 操作计数器(opcounters)
- 存储引擎状态(wiredTiger)
- 复制集状态(repl)
- 网络状态(network)
- 内存使用(mem)
- CPU使用率(processCpuTotal)
- 磁盘I/O(diskIO)
Q2: 如何使用db.serverStatus()监控性能?
A2: 使用db.serverStatus()监控性能的方法:
- 定期采集核心指标
- 建立性能基线
- 监控指标变化趋势
- 结合多个指标进行综合分析
- 设置合理的告警阈值
Q3: 需要什么权限才能运行db.serverStatus()?
A3: 运行db.serverStatus()需要clusterMonitor或更高权限。建议授予clusterMonitor角色给监控用户,这是一个专门用于监控的角色,权限最小化。
Q4: 如何解释缓存命中率?
A4: 缓存命中率是指从缓存中获取数据的成功率,计算公式为:缓存命中次数 / (缓存命中次数 + 缓存未命中次数)。一般来说:
- 命中率 > 95%:良好
- 命中率 90-95%:可接受
- 命中率 < 90%:需要关注,可能需要增加缓存大小或优化查询
Q5: 如何监控复制集状态?
A5: 使用db.serverStatus().repl可以监控复制集状态,包括:
- 节点角色(主节点/从节点)
- 节点优先级
- 隐藏节点状态
- 可选举状态
Q6: 如何使用db.serverStatus()识别性能瓶颈?
A6: 使用db.serverStatus()识别性能瓶颈的方法:
- 高CPU使用率:检查慢查询和操作计数器
- 高磁盘I/O:检查读写操作数和等待时间
- 低缓存命中率:增加缓存大小或优化查询
- 连接数接近上限:调整maxIncomingConnections参数
- 页面错误率高:内存不足,增加系统内存或调整缓存大小
