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票证编号指标反映了WiredTiger存储引擎的性能。
WiredTiger读取和写入票证是WiredTiger存储引擎的并发控制机制,用于管理并发事务数量。从版本 7.0 开始,MongoDB使用动态算法来调整存储引擎并发事务的最大数量,从而优化集群过载期间的数据库吞吐量。
读取和写入票证控制并发事务的最大数量。WiredTiger票证编号应始终为 128。值持续低于 128 表示服务器延迟和随之而来的潜在问题。
要解决WiredTiger票证证号较低的问题,请执行以下操作:
确保启用动态调整功能以自动管理票证分配。
确保集群有足够的资源(例如 CPU 和内存)来处理工作负载。
如果您使用的是MongoDB 3.2 或更早版本,升级到使用WiredTiger的更高版本。
如需手动调整最大并发事务数,可修改
storageEngineConcurrentReadTransactions
和storageEngineConcurrentWriteTransactions
参数。
注意
修改 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在日志记录进程中捕获的错误来创建断言。
监控以各种严重性级别创建的断言数量可以为意外问题提供第一级指示。断言可以是消息断言(最严重的类型),也可以是警告资产、常规断言和用户断言。