我想对 Amazon DocumentDB(兼容 MongoDB)集群中运行缓慢的查询进行故障排除,从而提高性能。
解决方法
由于以下原因,您在 Amazon DocumentDB 集群中可能会遇到运行缓慢的查询:
- 硬件规模不足
- 工作负载变化
- 流量增加
- 内存问题
- 次优查询计划
监控工作负载
要了解数据库性能问题的根本原因,请检查实例使用的所有服务器范围的资源。监控您的工作负载,调查查询性能何时处于最佳状态,以及查询运行耗时过长的起始时间。
使用 Amazon CloudWatch 指标
使用 Amazon DocumentDB 的 CloudWatch 指标来分析您的集群性能。要识别因资源不足而导致的性能瓶颈,请使用 CPUUtilization 和 FreeableMemory 等指标。要了解内存优化情况,请使用 BufferCacheHitRatio 和 LowMemNumOperationsThrottled 等指标。
监控操作级别指标以了解实例上的工作负载。有用的指标包括 DocumentsInserted、DocumentsReturned、DocumentsDeleted 和 TransactionsAborted。有关更多信息,请参阅监控 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 和内存来监控与之关联的队列。
相关信息
对性能和资源利用率进行故障排除