使用 mongotop 和 mongostat 分析 MongoDB 性能指标指南
利用 mongotop 和 mongostat 发现热点集合、资源压力、连接激增及 MongoDB 慢查询模式。
使用 mongotop 和 mongostat 分析 MongoDB 性能指标指南
MongoDB 性能问题通常表现为页面响应缓慢、写入积压或连接数突然飙升。mongotop 和 mongostat 随 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:每秒命令操作数。
- dirty 或 dirty %:WiredTiger 缓存中已修改但尚未写入磁盘的数据。具体列名取决于 MongoDB 和工具版本。
- used 或 used %: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 输出:
insert、query、update或delete速率较高:表示操作负载较重。请结合其他指标监控这些值,以判断系统是否能够跟上。conn较高:大量连接可能会消耗服务器资源。如果该值意外偏高,请检查应用程序中的连接池设置。networkIn或networkOut较高:表明数据传输量较大。可能是由于大型查询、复制流量或返回的结果集过大。res较高:MongoDB 进程消耗了大量 RAM。请确保服务器有足够的内存,并检查是否存在低效查询或大型数据集导致内存使用率过高。qr|qw较高:表示读取或写入操作正在排队,这通常指向资源争用或服务器无法及时处理的工作负载。dirty或缓存used值较高:如果 WiredTiger 缓存压力持续较高,则工作集可能无法舒适地容纳在内存中,或者磁盘写入可能滞后。- 操作速率低但查询慢:使用分析器、慢查询日志或
explain()检查查询是否扫描了过多文档。对于 WiredTiger 部署,现代mongostat输出无法可靠地显示单一的索引未命中百分比。
实际用例与故障排查场景
场景 1:应用程序性能缓慢
- 运行
mongostat:观察qr、aw、insert、query、update、delete速率。如果qr或aw较高,或者操作速率较高但似乎处理速度不快,则表明存在积压。 - 运行
mongotop:识别哪些集合的read ms和write ms较高。写入活动频繁的集合可能会拖慢其他操作。 - 检查查询计划:针对
mongotop识别出的热点集合,对代表性的慢查询运行explain("executionStats")。 - 分析
mongostat中的networkIn/networkOut:如果它们异常高,请检查是否存在大型结果集、大型聚合或复制流量。
场景 2:CPU 或内存使用率过高
- 运行
mongostat:监控res(常驻内存)和 CPU 使用率(通常可通过top或htop等系统工具观察,但mongostat提供了数据库特定的视角)。高res可能与 wiredTiger 缓存(used %)相关。 - 检查
mongotop:特定集合的高读写毫秒数可能导致 CPU 使用率升高。 - 查看
mongostat的操作速率:如果插入/更新/删除操作极其频繁,自然会消耗 CPU。 - 调查 WiredTiger 缓存和磁盘指标:如果脏缓存持续较高且应用程序写入速度变慢,请将 MongoDB 输出与主机磁盘延迟和 I/O 饱和度进行比较。
场景 3:复制延迟
虽然 mongotop 和 mongostat 不直接测量复制延迟,但它们对于理解延迟的原因至关重要。
- 在主节点上运行
mongostat:查找高qr或aw、高写入操作速率或高 CPU/内存使用率。如果主节点过载,则无法高效写入其 oplog,从而导致从节点出现延迟。 - 在从节点上运行
mongostat:观察其读写操作。如果从节点应用 oplog 条目速度缓慢,可能是由于从节点资源不足或应用的查询/操作效率低下。
提示与最佳实践
- 定期运行工具:不要等到性能问题出现才行动。主动监控您的 MongoDB 实例。
- 建立基线:了解您的部署“正常”状态的表现。这有助于更容易地发现偏差。
- 结合其他工具:
mongotop和mongostat非常适合实时快照。对于历史分析,请考虑使用 MongoDB 内置的性能监控(例如db.serverStatus()、db.stats())或外部工具,如 Prometheus 搭配 MongoDB Exporter,或云提供商监控服务。 - 了解您的工作集:了解活跃数据集的大小对于内存管理和理解 wiredTiger 缓存效率至关重要。
- 关注查询计划:使用
explain("executionStats")和慢查询日志来确认缺失或低效的索引是否导致了扫描。 - 考虑连接池:高
conn计数通常可以通过在应用程序层实现适当的连接池来缓解。
要点
使用 mongostat 了解服务器级别的压力,使用 mongotop 找到读写活动最集中的集合。当任一工具指向热点区域时,在更改索引或扩展部署之前,请通过查询计划、慢查询日志、主机指标和应用程序连接行为来确认原因。