Skip to content

MongoDB db.serverStatus()

基本用法

  1. 命令格式

    javascript
    db.serverStatus()
  2. 返回结果

    • 服务器运行时状态
    • 性能指标
    • 连接信息
    • 存储引擎状态
    • 复制集状态
  3. 权限要求

    • 需要clusterMonitor或更高权限
    • 建议授予clusterMonitor角色给监控用户

常用参数

  1. showMem

    javascript
    // 显示内存使用详细信息
    db.serverStatus({ showMem: true })
  2. recordStats

    javascript
    // 记录命令统计信息
    db.serverStatus({ recordStats: true })
  3. recordOpLatencies

    javascript
    // 记录操作延迟统计
    db.serverStatus({ recordOpLatencies: true })

核心指标详解

连接状态

  1. connections

    javascript
    // 查看连接状态
    db.serverStatus().connections
    • current:当前活跃连接数
    • available:可用连接数
    • totalCreated:自启动以来创建的连接总数
    • rejected:被拒绝的连接数(达到maxConns限制)
  2. 连接监控建议

    • 监控current/available比率
    • 关注rejected指标,非零值表示连接数达到上限
    • 调整maxIncomingConnections参数以增加连接数

操作计数器

  1. opcounters

    javascript
    // 查看操作计数器
    db.serverStatus().opcounters
    • insert:插入操作数
    • query:查询操作数
    • update:更新操作数
    • delete:删除操作数
    • getmore:cursor getmore操作数
    • command:命令操作数
  2. opcountersRepl

    javascript
    // 查看复制操作计数器
    db.serverStatus().opcountersRepl
    • 复制集从节点应用oplog的操作计数
    • 指标与opcounters类似

存储引擎状态

  1. wiredTiger

    javascript
    // 查看WiredTiger存储引擎状态
    db.serverStatus().wiredTiger
    • cache:缓存使用情况
    • session:会话统计
    • transaction:事务统计
    • block-manager:块管理器统计
  2. WiredTiger缓存监控

    javascript
    // 查看缓存关键指标
    db.serverStatus().wiredTiger.cache
    • bytes currently in the cache:当前缓存大小
    • maximum bytes configured:配置的最大缓存大小
    • percent dirty in the cache:缓存中脏页百分比
    • pages evicted by application threads:应用线程驱逐的页数

复制集状态

  1. repl

    javascript
    // 查看复制集状态
    db.serverStatus().repl
    • ismaster:是否为主节点
    • secondary:是否为从节点
    • electable:是否可被选举
    • hidden:是否为隐藏节点
    • priority:节点优先级
  2. 复制延迟指标

    javascript
    // 查看复制延迟相关指标
    db.serverStatus().metrics.repl

网络状态

  1. network

    javascript
    // 查看网络状态
    db.serverStatus().network
    • bytesIn:输入字节数
    • bytesOut:输出字节数
    • numRequests:请求总数
  2. 网络监控建议

    • 监控bytesIn/bytesOut增长趋势
    • 关注numRequests与操作计数器的比例
    • 检测异常的网络流量变化

内存使用

  1. mem

    javascript
    // 查看内存使用情况
    db.serverStatus().mem
    • bits:操作系统位数
    • resident:物理内存使用量
    • virtual:虚拟内存使用量
    • supported:是否支持内存报告
  2. extra_info

    javascript
    // 查看额外内存信息
    db.serverStatus().extra_info
    • page_faults:页面错误数
    • heap_usage_bytes:堆使用字节数

性能诊断应用

识别性能瓶颈

  1. CPU使用率

    javascript
    // 查看CPU使用率
    db.serverStatus().processCpuTotal
  2. 磁盘I/O

    javascript
    // 查看磁盘I/O状态
    db.serverStatus().diskIO
    • reads:读操作数
    • writes:写操作数
    • readWait:读等待时间
    • writeWait:写等待时间
  3. 慢查询检测

    javascript
    // 查看慢查询数
    db.serverStatus().metrics.query.executor.scanned

监控复制集健康

  1. 选举统计

    javascript
    // 查看选举统计
    db.serverStatus().metrics.repl.elections
  2. 心跳检测

    javascript
    // 查看心跳统计
    db.serverStatus().metrics.repl.heartbeats
  3. Oplog状态

    javascript
    // 查看oplog相关指标
    db.serverStatus().metrics.repl.oplog

存储引擎诊断

  1. WiredTiger事务

    javascript
    // 查看事务统计
    db.serverStatus().wiredTiger.transaction
  2. WiredTiger锁

    javascript
    // 查看锁统计
    db.serverStatus().wiredTiger.concurrentTransactions
  3. 缓存命中率

    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) + "%");

监控脚本示例

基本监控脚本

  1. 简单监控脚本

    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();
  2. 定期监控

    javascript
    // 每5秒监控一次,共10次
    for (let i = 0; i < 10; i++) {
      monitorMongoDB();
      sleep(5000);
    }

告警脚本示例

  1. 连接数告警

    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();
  2. 缓存命中率告警

    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();

最佳实践

监控频率

  1. 生产环境

    • 核心指标:每10-30秒
    • 详细指标:每5-15分钟
    • 历史趋势:每天汇总
  2. 测试环境

    • 可降低监控频率
    • 重点关注测试期间的性能变化

权限管理

  1. 监控用户权限

    javascript
    // 创建监控用户
    use admin
    db.createUser({
      user: "monitor",
      pwd: "monitor123",
      roles: [{ role: "clusterMonitor", db: "admin" }]
    })
  2. 避免使用root权限

    • 生产环境中只授予必要的最小权限
    • 使用专用监控用户

指标解读

  1. 相对变化比绝对值更重要

    • 关注指标的变化趋势
    • 建立基线,识别异常变化
  2. 综合分析多个指标

    • 单一指标异常可能不代表问题
    • 结合多个指标进行诊断
  3. 定期校准监控阈值

    • 根据业务变化调整告警阈值
    • 避免过多误报

常见问题(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参数
  • 页面错误率高:内存不足,增加系统内存或调整缓存大小