跳至内容

为什么我的 Amazon DocumentDB 集群中的查询运行缓慢?

1 分钟阅读
0

我想对 Amazon DocumentDB(兼容 MongoDB)集群中运行缓慢的查询进行故障排除,从而提高性能。

解决方法

由于以下原因,您在 Amazon DocumentDB 集群中可能会遇到运行缓慢的查询:

  • 硬件规模不足
  • 工作负载变化
  • 流量增加
  • 内存问题
  • 次优查询计划

监控工作负载

要了解数据库性能问题的根本原因,请检查实例使用的所有服务器范围的资源。监控您的工作负载,调查查询性能何时处于最佳状态,以及查询运行耗时过长的起始时间。

使用 Amazon CloudWatch 指标

使用 Amazon DocumentDB 的 CloudWatch 指标来分析您的集群性能。要识别因资源不足而导致的性能瓶颈,请使用 CPUUtilizationFreeableMemory 等指标。要了解内存优化情况,请使用 BufferCacheHitRatioLowMemNumOperationsThrottled 等指标。

监控操作级别指标以了解实例上的工作负载。有用的指标包括 DocumentsInsertedDocumentsReturnedDocumentsDeletedTransactionsAborted。有关更多信息,请参阅监控 Amazon DocumentDB(兼容 MongoDB)集群上的指标并设置警报

使用性能详情

使用性能详情来评估按等待、查询、主机、数据库和应用程序划分的数据库工作负载。捕获计数器详细查询信息,并评估哪些查询对数据库负载贡献最大。高于 Max vCPU 值的数据库负载表明实例类上的工作负载受到限制。分析查询文本以帮助调整查询。

使用 Profiler 日志

使用 Amazon DocumentDB 分析器记录在集群上执行的操作的运行时间和详细信息。分析器允许您监控集群上速度最慢的操作。这可以帮助您提高单个查询性能以及集群整体性能。

使用数据库方法

定期在 Amazon DocumentDB 实例上运行以下 currentOp() 命令,以便监控一段时间内的系统使用情况:

db.adminCommand({currentOp: 1, $all: 1});

要计算系统中每个命名空间的查询和操作数量,请运行以下命令:

db.adminCommand({
  aggregate: 1,
  pipeline: [
    {
      $currentOp: {
        allUsers: true,
        idleConnections: true
      }
    },
    {
      $group: {
        _id: {
          desc: "$desc",
          ns: "$ns",
          WaitState: "$WaitState"
        },
        count: {
          $sum: 1
        }
      }
    }
  ],
  cursor: {}
});

运行命令后,分析系统使用情况的结果,了解系统的负载并执行相应的操作。

优化您的查询

确定长时间运行的查询后,调整查询以提高查询性能。

使用正确的查询计划程序

要提高性能,请使用最优索引计划并为操作符开启索引扫描支持。对于 Amazon DocumentDB 5.0 及更高版本,请使用计划程序版本 2.0,以便充分利用能够优化查找、更新、删除以及查找并修改命令等基本操作的高级查询计划程序。对于未选择最优索引的特定查询模式,此版本增加了对计划缓存筛选功能的支持,允许您指定特定查询形状的索引列表。

分析查询的统计信息

要优化查询性能,请使用 executionStats 来分析查询的运行方式。executionStats 提供在每个查询阶段处理的文档数量、每个阶段的运行时长以及尝试生成查询计划的次数。

要查看查询的统计信息,请运行以下命令:

query.explain("executionStats");

操作示例:

db.collection.find({}).limit(2).explain("executionStats");

上述操作示例分析了在尝试查找两个文档时查询的执行情况。

查看返回的统计信息。您可以添加索引以减少完整集合扫描次数,并限制查询必须扫描的文档数量。最佳做法是测试所有新索引并评估其性能。使用克隆快照还原选项来创建测试环境。

检查实例中是否存在低效的索引

每个索引都会增加额外的写入延迟、CPU 使用量、I/O 操作以及资源上的整体已利用存储空间。尽管索引可以提高查询性能,但最佳做法是定期检查索引并移除未使用的索引。

要查看每个索引的访问频率明细,请运行类似于以下示例的命令:

db.collection.aggregate([{$indexStats:{}}]).pretty()

要查看使用索引执行的扫描总数(索引扫描),请运行以下命令:

db.collection.stats()

将上述查询的计数与未使用索引执行的扫描次数(集合扫描)进行比较。然后分析操作在访问集合时使用索引的频率。

关闭实例上的非活动游标

Amazon DocumentDB 实例对给定时间内打开的活动游标数量设有限制。您使用的实例类型决定了此限制。有关更多信息,请参阅实例限制。使用 CloudWatch 监控 CloudWatch 中的 DatabaseCursors 指标,查看处于打开状态的游标数量。

要查看有关打开游标的更多详细信息,请运行类似于以下示例的命令:

db.runCommand("listCursors")

最佳做法是在使用游标后将其关闭以避免节流。空闲游标会占用 CPU 和内存来监控与之关联的队列。

相关信息

对性能和资源利用率进行故障排除

AWS 官方已更新 6 个月前