使用 mongotop 和 mongostat 分析 MongoDB 性能指标指南

利用 mongotop 和 mongostat 发现热点集合、资源压力、连接激增及 MongoDB 慢查询模式。

使用 mongotop 和 mongostat 分析 MongoDB 性能指标指南

MongoDB 性能问题通常表现为页面响应缓慢、写入积压或连接数突然飙升。mongotopmongostat 随 MongoDB 数据库工具一同安装,可快速在终端中查看服务器当前运行状态。

本指南将介绍如何在常见故障场景中解读这些工具的输出,并将结果与后续可能需要的检查项(如索引、查询结构、连接池和磁盘压力)关联起来。

理解 mongotop

mongotop 提供 MongoDB 实例上读写操作的实时视图。它显示指定时间间隔内每个集合在读取或写入操作上花费的时间。这对于识别哪些集合活动最频繁、可能成为性能瓶颈的根源尤为有用。

mongotop 提供的关键指标:

  • ns:集合的命名空间(数据库.集合)。
  • total:采样间隔内对该命名空间进行读写操作所花费的总时间。
  • read:采样间隔内读取活动所花费的时间。
  • write:采样间隔内写入活动所花费的时间。

如何使用 mongotop:

您可以直接在终端中运行 mongotop,前提是已安装 MongoDB 数据库工具并将其添加到 PATH 环境变量中。默认情况下,它每秒更新一次。您也可以指定以秒为单位的更新间隔。

mongotop

指定更新间隔(例如每 5 秒):

mongotop 5

针对运行在不同主机和端口上的 MongoDB 实例运行 mongotop

mongotop --host <主机名> --port <端口>

解读 mongotop 输出:

  • 特定集合的 write 时间较高:该集合正在经历大量写入活动。请检查写入量、文档增长、写入涉及的索引,以及工作负载是否应该分片。
  • read 时间较高:检查该集合的查询计划。缺失索引、结果集过大以及聚合扫描通常会在这种情况下显现。
  • total 时间持续较高的集合:这些是您最热门的集合。请密切监控它们的索引、工作集和查询模式。

理解 mongostat

mongostat 提供 MongoDB 实例性能和资源利用率的更广泛实时概览。它收集并显示服务器状态的多种指标,包括每秒操作数、网络流量、磁盘 I/O 和内存使用情况。

mongostat 提供的关键指标:

  • insert:每秒插入操作数。
  • query:每秒查询操作数。
  • update:每秒更新操作数。
  • delete:每秒删除操作数。
  • getmore:每秒 getmore 操作数(用于游标)。
  • command:每秒命令操作数。
  • dirtydirty %:WiredTiger 缓存中已修改但尚未写入磁盘的数据。具体列名取决于 MongoDB 和工具版本。
  • usedused %:WiredTiger 缓存使用率。具体列名取决于 MongoDB 和工具版本。
  • conn:当前连接数。
  • networkIn:服务器接收的网络流量(以字节为单位)。
  • networkOut:服务器发送的网络流量(以字节为单位)。
  • res:MongoDB 进程使用的常驻内存大小(以 MB 为单位)。
  • qr|qw:排队的读取和写入操作数(如果该列可用)。
  • ar|aw:活跃的读取和写入客户端数(如果该列可用)。

如何使用 mongostat:

mongostat 也是一个命令行工具。与 mongotop 类似,它会定期更新,默认间隔为 5 秒。您可以指定不同的间隔和连接详情。

mongostat

指定更新间隔(例如每 2 秒):

mongostat 2

连接到远程 MongoDB 实例:

mongostat --host <主机名> --port <端口>

解读 mongostat 输出:

  • insertqueryupdatedelete 速率较高:表示操作负载较重。请结合其他指标监控这些值,以判断系统是否能够跟上。
  • conn 较高:大量连接可能会消耗服务器资源。如果该值意外偏高,请检查应用程序中的连接池设置。
  • networkInnetworkOut 较高:表明数据传输量较大。可能是由于大型查询、复制流量或返回的结果集过大。
  • res 较高:MongoDB 进程消耗了大量 RAM。请确保服务器有足够的内存,并检查是否存在低效查询或大型数据集导致内存使用率过高。
  • qr|qw 较高:表示读取或写入操作正在排队,这通常指向资源争用或服务器无法及时处理的工作负载。
  • dirty 或缓存 used 值较高:如果 WiredTiger 缓存压力持续较高,则工作集可能无法舒适地容纳在内存中,或者磁盘写入可能滞后。
  • 操作速率低但查询慢:使用分析器、慢查询日志或 explain() 检查查询是否扫描了过多文档。对于 WiredTiger 部署,现代 mongostat 输出无法可靠地显示单一的索引未命中百分比。

实际用例与故障排查场景

场景 1:应用程序性能缓慢

  1. 运行 mongostat:观察 qrawinsertqueryupdatedelete 速率。如果 qraw 较高,或者操作速率较高但似乎处理速度不快,则表明存在积压。
  2. 运行 mongotop:识别哪些集合的 read mswrite ms 较高。写入活动频繁的集合可能会拖慢其他操作。
  3. 检查查询计划:针对 mongotop 识别出的热点集合,对代表性的慢查询运行 explain("executionStats")
  4. 分析 mongostat 中的 networkIn/networkOut:如果它们异常高,请检查是否存在大型结果集、大型聚合或复制流量。

场景 2:CPU 或内存使用率过高

  1. 运行 mongostat:监控 res(常驻内存)和 CPU 使用率(通常可通过 tophtop 等系统工具观察,但 mongostat 提供了数据库特定的视角)。高 res 可能与 wiredTiger 缓存(used %)相关。
  2. 检查 mongotop:特定集合的高读写毫秒数可能导致 CPU 使用率升高。
  3. 查看 mongostat 的操作速率:如果插入/更新/删除操作极其频繁,自然会消耗 CPU。
  4. 调查 WiredTiger 缓存和磁盘指标:如果脏缓存持续较高且应用程序写入速度变慢,请将 MongoDB 输出与主机磁盘延迟和 I/O 饱和度进行比较。

场景 3:复制延迟

虽然 mongotopmongostat 不直接测量复制延迟,但它们对于理解延迟的原因至关重要。

  1. 在主节点上运行 mongostat:查找高 qraw、高写入操作速率或高 CPU/内存使用率。如果主节点过载,则无法高效写入其 oplog,从而导致从节点出现延迟。
  2. 在从节点上运行 mongostat:观察其读写操作。如果从节点应用 oplog 条目速度缓慢,可能是由于从节点资源不足或应用的查询/操作效率低下。

提示与最佳实践

  • 定期运行工具:不要等到性能问题出现才行动。主动监控您的 MongoDB 实例。
  • 建立基线:了解您的部署“正常”状态的表现。这有助于更容易地发现偏差。
  • 结合其他工具mongotopmongostat 非常适合实时快照。对于历史分析,请考虑使用 MongoDB 内置的性能监控(例如 db.serverStatus()db.stats())或外部工具,如 Prometheus 搭配 MongoDB Exporter,或云提供商监控服务。
  • 了解您的工作集:了解活跃数据集的大小对于内存管理和理解 wiredTiger 缓存效率至关重要。
  • 关注查询计划:使用 explain("executionStats") 和慢查询日志来确认缺失或低效的索引是否导致了扫描。
  • 考虑连接池:高 conn 计数通常可以通过在应用程序层实现适当的连接池来缓解。

要点

使用 mongostat 了解服务器级别的压力,使用 mongotop 找到读写活动最集中的集合。当任一工具指向热点区域时,在更改索引或扩展部署之前,请通过查询计划、慢查询日志、主机指标和应用程序连接行为来确认原因。