亚马逊AWS官方博客

使用 Performance Insights 优化 Amazon RDS for MySQL

Original URL:https://amazonaws-china.com/cn/blogs/database/tuning-amazon-rds-for-mysql-with-performance-insights/

Amazon RDS Performance InsightsAmazon RDS 提供了一个直观的调优界面,可帮助您发现和调查 RDS 数据库的性能问题。对于所有数据库引擎类型(例如 RDS for MySQL、RDS for PostgreSQL 和 Amazon Aurora)而言, Performance Insights 的外观和感觉都相同。当然每种引擎的实现又略有不同。不论采用哪种引擎,Performance Insights 都能够显示数据库负载和Top SQL。每种引擎都支持扩展数据保留以及与 Amazon CloudWatch 集成等 Performance Insights 功能。但根据数据库引擎类型的不同,Performance Insights 显示的信息略有不同,具体取决于引擎的原生性能仪表板。例如在 PostgreSQL 兼容版 Aurora 中,您会发现数据库负载又根据 PostgreSQL 10 等待事件进行了细分。对于 MySQL 兼容版 Aurora 以及 RDS MySQL,您会发现负载根据 MySQL Performance Schema 等待事件进行了细分。通过使用各引擎类型的原生等待事件仪表板信息,Performance Insights 对于各种引擎类型的外观和感觉都保持类似,同时保留了各引擎类型的原生性能仪表板。我们在 2018 年 8 月 28 日 发布了适用于 RDS MySQL(版本 5.7.22 及以上)和所有数据库实例类(db.t2 除外)的 Performance Insights。由于 Aurora MySQL 和 RDS MySQL 的原生性能仪表板由 MySQL Performance Schema 提供,Performance Insights 在启用 MySQL Performance Schema 功能时效果最好。

您可能还没有使用 RDS 参数组为数据库实例启用 MySQL Performance Schema。如果是这样,启用 Performance Insights 将会自动为您启用并配置 MySQL Performance Schema。有关 MySQL Performance Schema 与 Performance Insights 结合使用的更多信息,请参阅 Amazon RDS 用户指南中的启用 Performance Insights

数据库负载

Performance Insights的核心指标称为数据库负载。数据库负载将数据库系统的总体性能状况浓缩为一个指标,反映了整个系统的压力水平。有关如何计算数据库负载的详细说明,请参阅 Amazon RDS 用户指南中的使用 Amazon RDS Performance Insights

数据库负载图占据 Performance Insights 屏幕的顶部,按以下四个维度中的一个显示负载细分:等待、SQL、主机、用户。负载图最常用的维度是等待,它将告诉您数据库引擎中的哪种活动正在导致负载上升。负载图中的厚色带表示贡献最大的等待类型。

要选择某个时间段,请选择负载图右上部的时间跨度,或拖放放大负载图的任何部分。由于 MySQL 等待事件的名称描述性不强,我们将最常见的事件记录在 Amazon Aurora MySQL 参考中。虽然此文档针对的是 Aurora MySQL,但有关这些事件的描述也同样适用于 RDS MySQL。对于 AWS 文档没有涉及的等待事件,请参阅 MySQL 文档中的 Performance Schema 仪表板命名惯例

为方便演示,下面我将使用一个跨度为一小时数据库负载图,它来自在 RDS MySQL 上运行的 sysbench OLTP 工作负载的 Performance Insights。  该工作负载是一个稳态读取密集型工作负载(读写比 90:10)。这对 OLTP 应用程序相当典型,演示了正常工作负载在Performance Insights中将会如何显示。

从图中可以看出,数据库负载的主要贡献因素为等待事件 io/table/sql/handler。根据 AWS 文档,这是一个表 I/O 等待事件。观察此工作负载,您会看到正常运行的工作负载会通过消耗 CPU 和 I/O 等基本的主机资源来产生负载。这些资源没有遇到瓶颈,系统可以正常工作。

如果不启用 MySQL Performance Schema 会是什么情况?

如果您有意禁用 MySQL Performance Schema,Performance Insights 仍会运行,但会以降级模式运行。您仍可看到数据库负载和Top SQL。但这时Performance Insights 不会显示 MySQL Performance Schema 等待事件,而是显示 MySQL 进程状态。进程状态值一般位于 show processlist 命令的 state 列。

Top 10 SQL 语句摘要

Performance Insights 页面的底部显示了在负载图中显示的时间段内,数据库负载的Top 10 SQL 语句摘要列表。此类别可帮助识别对系统影响最大的 SQL 语句,从而让您知道如何确定调整工作的重点。借助Performance Insights,您还可以选择任何其他支持的维度(等待、主机或用户)并显示Top 10对象。当然,Top 10列表中最常用的维度是 SQL。

MySQL 语句摘要是数据库中运行的 SQL 的简化版,但用问号替换了持续变化的字面值。借助摘要功能,Performance Insights 能够汇总上百个甚至上千个基本相同的 SQL 语句的影响。摘要还可以在Top 10列表中将这些语句的真正影响显示为一个单一逻辑 SQL 语句。

诊断问题

借助数据库负载指标,可以非常明了地确定数据库性能下降的时候。以下面的负载图为例。

该图显示了一个稳态工作负载在 io/table/sql/handler 事件中的高负载时期发生了中断。如前文所述,此事件是一个 I/O 事件。在此期间,有四到八个数据库连接处于等待状态,主要是在 I/O 方面。问题是为何为这样。解答该问题的第一步是在负载图上拖放以放大相关期间。

放大后,您可以看到在 I/O 等待严重时期涉及最多的 SQL 语句。

在问题发生期间,主要的 SQL 语句是一个大型表的更新,该语句没有 where 条件。这种操作可能会使用大量的 I/O,导致正常工作负载发生竞争。知道问题在于此 SQL 后,我们可以开始调查谁应该为此负责。为此,单击细分下拉菜单,然后选择用户

将数据库负载按用户细分后,您可以立即找到须对运行违规查询负责的具体用户。该用户仅在负载突增期间出现。在Top SQL 列表中,您还可以看到违规查询仅由该用户运行。

小结

借助 Performance Insights,RDS MySQL 能够实现在 Oracle 等商业数据库引擎中常见、但在 MySQL 和 PostgreSQL 等开源数据库中不常见的可视化显示和细分功能。虽然开源引擎的用户对这种方法还不熟悉,但它能够简单、直观地显示性能问题的源头。

我们的团队正在紧锣密鼓地工作,以在未来推出更多有关Performance Insights 的增强。 如果您想提供反馈或请求增强,请给我们发电子邮件


本篇作者

Jeremiah Wilton

Jeremiah Wilton 是 Amazon Web Services Relational Database Services (RDS) 团队的首席数据库工程师。

Szymon Komendera

Szymon Komendera 是 Amazon Web Services Relational Database Services (RDS) 团队的数据库工程师。