对于 AI 代理:可在 https://www.mongodb.com/zh-cn/docs/llms.txt 获取文档索引—通过在任何 URL 路径后添加 .md 可获取所有页面的 Markdown 版本。

性能优化

MongoDB部署可以支持具有高ACID 事务量的大型数据库,因此性能调优至关重要。定期调优有助于及早发现集群中的问题,以便在问题影响系统响应能力或稳定性之前予以解决。

本文档介绍使用性能调优和有用指标来优化部署性能的一些常用方法。这些方法应用于MongoDB Atlas集群和自管理部署。但是,使用MongoDB Atlas可以使调优进程变得更加容易,它可以自动执行许多任务并简化操作以提高效率。有关性能的更多信息,请参阅MongoDB性能。

为了确保最佳的查询性能,您可以使用能够揭示查询性能指标并告诉您在发现慢速查询时该怎么做的指标。

MongoDB日志文件记录每个查询的执行时间和方法,以便您搜索慢速查询。数据库分析器会记录超过指定阈值的查询。

如果查询速度很慢,请先访问权限您的查询计划。有关查找查询计划数据的更多信息,请参阅解释结果。

  • 确保查询执行的是索引扫描,而不是集合扫描。

    索引扫描限制了MongoDB检查的文档数量,而集合扫描要求MongoDB读取集合中的所有文档。要学习;了解有关如何解释计划结果的更多信息,请参阅解释计划结果。

  • 如果在解释计划结果中看到大量集合扫描,请考虑添加索引。

    注意

    索引会减慢写入和更新速度,因此,拥有太多未充分利用的索引可能会阻碍文档修改或插入,具体取决于您的工作负载。

您还可以使用以下查询指标来确保查询以最高速度运行:

  • metrics.queryExecutor.scanned 告诉您扫描了多少文档才能返回查询结果。

    • 理想情况下,扫描的文档与返回的文档之比为 1:1,这意味着MongoDB会返回所有文档。通常,该比率大于 1,表示MongoDB不会返回某些扫描的文档。

    • 该比率可能小于 1 甚至 0,表示索引包含所有必要数据的覆盖查询。

    • 如果MongoDB扫描大量文档来响应查询,则可能缺少索引或需要优化查询。

  • metrics.operation.scanAndOrder 指示服务器对查询结果进行排序的努力。

    • 较高的“扫描和排序”数字(例如 20 或更高)表示服务器必须对结果进行排序,从而增加查询结果时间和服务器内存负载。

    • 要修复较高的“扫描”和“排序”数量,请根据查询要求对索引进行排序,或添加任何缺失的索引。通常,如果是复合索引,则从索引中的前导字段开始按升序对 B-Tree 索引进行排序。

  • WiredTiger 工单 Number 指标反映了 WiredTiger 存储引擎的并发状态。

    • WiredTiger 使用独立的读取工单和写入工单池来控制存储引擎中可以执行的并发读取和写入操作的数量。

    • 工单数量会根据工作负载在 4 和 128 之间动态调整。初创企业时的初始值近似于节点的 vCPU 数量,最少为 4 个工单。集群中不同节点的工单数量可能不同。

    • 要检测存储引擎争用,请监控 globalLock.currentQueue.readers、globalLock.currentQueue.writers 和 globalLock.currentQueue.total 指标。排队操作持续增加表明存在并发瓶颈。

    • 128 的默认上限涵盖了大多数使用案例。MongoDB 不建议手动调整工单数量,因为动态算法会逐渐增加并发性并验证额外的工单是否能提高吞吐量。资源可用性较高的罕见工作负载可能会从更高的上限中受益。

    • 如果发现性能下降,请调查根本的瓶颈,而不是直接调整工单参数。常见原因包括:

      • 工作负载的 CPU、内存和磁盘 I/O 容量不足。

      • 目标不明确的查询(扫描的文档与返回的文档比例过高)、缺失的索引以及较高的 metrics.operation.scanAndOrder 计数。

      • WiredTiger 缓存压力:缓存使用率持续高于驱逐 trigger (95%) 或脏数据高于脏数据 trigger (20%)。

      要了解如何分析性能问题,请参阅 MongoDB 性能。

    • 要查看当前的读取和写入工单数量及其使用情况,请参阅 queues.execution 输出的 serverStatus 部分。

注意

您可以使用 storageEngineConcurrentReadTransactions 和 storageEngineConcurrentWriteTransactions 参数手动调整最大工单数。修改这些设置时请务必小心,因为更改可能会导致性能问题或错误。在更改这些参数之前,请咨询 MongoDB 支持部门。

查询计划不包含任何揭示文档结构反模式的指标,但您可以在调试慢速查询时查找反模式。请注意以下会损害性能的最常见不良查询做法:

  • 未绑定数组:文档中可以无限增长的数组会导致性能问题,因为每次更新大量时, MongoDB都必须将大量重写到文档中。有关详细信息,请参阅避免无界数组。

  • 无边界嵌入式文档: MongoDB支持在文档中插入文档,最多具有 128 级嵌套。每个MongoDB文档(包括嵌入式文档)的大小限制为 16MB。嵌入式文档过多可能会导致性能问题。

    要缓解嵌入式文档过多的问题,请将嵌入式文档移动到单独的集合中,并从原始文档中引用它们。有关更多信息,请参阅臃肿的文档。

MongoDB具有数千个指标,可追踪数据库性能的各个方面,包括读取、写入和查询数据库,并确保备份等背景维护任务不会影响性能。以下指标有助于指示数据库的问题,以便确保其最佳性能。

当从节点(secondary node from replica set)集的从副本集落后于主节点 (primary node in the replica set)时,就会出现复制延迟。要了解复制延迟的原因,可以检查与oplog相关的指标。但是,以下问题是复制延迟的最常见原因:

  • 主节点 (primary node in the replica set)和从节点(secondary node from replica set)之间存在网络问题,导致节点无法访问

  • 节点从节点(secondary node from replica set)应用数据的速度比主节点 (primary node in the replica set)节点慢

  • 写入容量不足,在这种情况下应添加更多分片

  • 主节点 (primary node in the replica set)节点上的操作速度缓慢,阻止复制

MongoDB 的内部锁定系统用于支持并发查询,同时避免写入冲突和不一致读取。当可用读取或写入票证的剩余数量达到零时,会出现由于锁定而导致的性能问题,这意味着任何新的读取或写入请求都将排队等待,直到有新的读取或写入票证可用。

锁定性能问题可能表明索引不理想和模式设计不当,而这两种情况都可能导致锁定的持有时间超过必要的时间。

如果打开的游标数量在增加,但流量却没有相应增长,这可能是由于索引查询不佳或由于结果集过大而导致查询长时间运行造成的。

在进行性能调优时,务必要注意系统的总流量或事务吞吐量何时会超出集群的计划容量。通过追踪吞吐量的增长,您可以有效地扩展集群的容量。

以下指标可帮助您追踪集群的吞吐量。要查找这些指标,运行serverStatus命令并检查下面指定的字段。

读取和写入操作指标显示集群执行的工作量。您可以通过opcounters.query字段查找读取操作,通过opcounters.insert、opcounters.update和opcounters.delete写入操作,它们分别计算插入、更新和删除操作的总数。

读取与写入的比率取决于集群上运行的工作负载的性质。

  • 随着时间的推移监控写入操作可以建立正常范围和阈值。

  • 随着写入操作的趋势显示吞吐量的增长,您可以逐渐增加容量。

文档指标和查询执行器会指示集群是否太忙。与“读取”和“写入”操作指标类似,这些指标的数字没有正确或错误之分,但了解正常情况可帮助您辨别性能不佳是由较大的工作负载大小造成还是由其他原因造成。

要检索文档指标,访问权限metrics.keysExamined 和 metrics.totalExecMicros 字段。要检索查询执行器指标,请检查 metrics.fromPlanCache字段。您可以使用$queryStats聚合阶段查找所有这些字段。

  • 每当您查找文档或插入文档时, MongoDB都会更新文档指标。查找、插入、更新或删除的文档越多,集群就越繁忙。

    • 具有大量容量的集群中的性能不佳通常表明存在查询问题。
  • 查询执行器会使用两个数据点告诉您正在处理的查询数量:

    • 已扫描:在查询和查询计划评估期间扫描的索引项在选定示例周期内的平均每秒速率。

    • 扫描的对象:在查询和查询计划评估期间扫描文档的选定示例周期内的平均每秒速率。

硬件和网络指标可以表明吞吐量正在上升,并将超过计算基础设施的容量。这些指标是从操作系统和网络基础架构中收集的。为了使这些指标用于诊断目的,您必须了解什么是正常的。

  • 如果您在本地部署运行MongoDB ,则也许可以使用MongoDB Ops Manager查看硬件和网络指标,具体取决于您的操作系统。

  • 虽然有很多指标需要追踪,但需要设定基线范围的一些重要指标包括:

    • 磁盘延迟

    • 磁盘 IOPS

    • 连接数

MongoDB 集群使用根本的计算和网络基础架构提供的各种资源。

当前客户端连接数指标位于 文档的connections.current serverStatus字段中,可以指示系统上的总负载。追踪一天或一周中不同时间的正常范围可以帮助您快速识别流量峰值。

一个相关指标(已使用的连接百分比)可以指示MongoDB何时即将运行可用连接。

存储指标追踪MongoDB如何使用持久存储。在WiredTiger存储引擎中,每个集合和每个索引都是单独的文件。当您更新集合中的文档时, MongoDB会重写整个文档。

  • 如果 dbStats.dataSize、dbStats.indexSize、dbStats.storageSize 等内存空间指标或数据库中的文档数量显示出重大的意外变化,而数据库流量保持在正常范围内,则可能表明存在数据删除或损坏等问题、意外数据增长或索引更改。

  • dbStats.dataSize 突然下降可能表明存在大量数据删除。如果这种下降是意外的,您应该迅速进行调查。

内存指标显示MongoDB如何使用托管集群的计算基础架构的虚拟内存。您可以在 结果中的mem serverStatus文档中找到内存指标。

  • 页面错误数量的增加或已更改但尚未写入磁盘的数据量的增加可能表明与集群可用内存量相关的问题。

  • 缓存指标可帮助确定工作集是否超出可用缓存。

MongoDB主要通过MongoDB在日志记录进程中捕获的错误来创建断言。

监控以各种严重性级别创建的断言数量可以为意外问题提供第一级指示。断言可以是消息断言(最严重的类型),也可以是警告资产、常规断言和用户断言。