如何排查 Amazon RDS 实例中由 IOPS 瓶颈导致的 Amazon EBS 卷延迟问题?

上次更新日期:2021 年 10 月 11 日

我有一个 Amazon Relational Database Service(Amazon RDS)数据库实例。我想排查 Amazon RDS 实例中的 Amazon Elastic Block Store(Amazon EBS)卷延迟问题。

解决方法

由 IOPS 或吞吐量瓶颈导致的 Amazon RDS 实例延迟,最常见的原因包括:

  • 实例级别的 IOPS 瓶颈
  • 卷级别的 IOPS 瓶颈
  • 实例级别的吞吐量瓶颈
  • 卷级别的吞吐量瓶颈
  • 微突发

根据您的使用案例使用以下问题排查步骤。

具有通用型 SSD(gp2)的 RDS 实例

执行以下检查:

  1. 检查 Amazon RDS 实例的配置信息,例如数据库实例类和存储空间大小。此信息可以帮助您跟踪 IOPS 和吞吐量限制。在排查引发 IOPS 或吞吐量瓶颈的问题时,您必须知晓这些值。
  2. 使用 Amazon CloudWatch 图表检查 DiskQueueDepthReadLatencyWriteLatency 的值是否出现任何峰值。在正常情况下,最佳实践是对每 1000 个 IOPS 每分钟使用一个 DiskQueueDepth。预计 ReadLatency 和 WriteLatency 将低于 10 毫秒。如果您发现峰值,那么请确定峰值时间。
  3. 使用 CloudWatch 图表查看 ReadIOPSWriteIOPS 指标。检查在 DiskQueueDepth、ReadLatency 和 WriteLatency 的值出现峰值的时间范围内,是否在卷级别超出了 IOPS 限制。
  4. 使用 CloudWatch 图表检查 BurstBalance 的值是否下降。此检查仅适用于小于 1TB 的卷。如果 BurstBalance 的值下降,则表明在出现峰值的时间范围内出现了 IOPS 瓶颈。
  5. 使用 CloudWatch 图表检查 ReadThroughputWriteThroughput 指标。检查在 ReadThroughput 和 WriteThroughput 的值出现峰值的时间范围内,是否在卷级别超出了吞吐量限制。
  6. 如果您使用的是 EBS 优化的 RDS 实例类,请使用 CloudWatch 图表检查 IOPS 或吞吐量是否发生了限流。对于出现容量爆增的实例类,请在 CloudWatch 图表中检查 EBSIOBalance%EBSByteBalance% 指标。如果 EBSIOBalance% 或 EBSByteBalance% 的值一直较低,则表明实例级别出现了 IOPS 或吞吐量瓶颈。

如果 IOPS 和/或吞吐量出现限流,则表明 IOPS 或吞吐量在存储级别难以满足工作负载的需求。要解决此问题,请执行以下操作:

  • 找到对数据库造成更多负载的 SQL 查询,然后优化这些查询。如果工作负载正常,或者没有调整 SQL 查询的空间,则可能需要增加存储空间才能获得更高的 IOPS 容量。
    注意:增加 RDS 实例的存储空间后,将无法再将此值减小到之前的值。
  • 考虑将卷从通用型(gp2)切换到预置 IOPS(io1)。如果数据库实例为单可用区并且您使用的是自定义参数组,则在 gp2 和 io1 之间切换可能会导致短暂停机。如果您的实例为多可用区,则不会发生任何停机。
  • 如果您注意到实例级别的 IOPS 或吞吐量出现限流,则必须扩展实例类,以获得更高的 IOPS 或吞吐容量。

具有预置 IOPS(io1)的 RDS 实例

  1. 检查 Amazon RDS 实例的配置信息(例如数据库实例类和定义的预置 IOPS),以确定数据库实例类的 IOPS 限制或吞吐量限制。
  2. 使用 CloudWatch 图表检查 DiskQueueDepth、ReadLatency 和 WriteLatency 的值是否出现任何峰值。在正常情况下,最佳实践是对每 1000 个 IOPS 每分钟使用一个 DiskQueueDepth。预计 ReadLatency 或 WriteLatency 将低于 10 毫秒。如果您发现峰值,那么请确定峰值时间。
  3. 使用 CloudWatch 图表查看 ReadIOPS 和 WriteIOPS 指标。检查在 DiskQueueDepth、ReadLatency 和 WriteLatency 的值出现峰值的时间范围内,是否超出了 IOPS 限制。
  4. 使用 CloudWatch 图表检查 ReadThroughput 和 WriteThroughput 指标。检查在 ReadThroughput 和 WriteThroughput 的值出现峰值的时间范围内,是否超出了吞吐量限制。
  5. 如果您使用的是 EBS 优化的 RDS 实例类,请使用 CloudWatch 图表检查 IOPS 或吞吐量是否发生了限流。对于出现容量爆增的实例类,请在 CloudWatch 图表中检查 EBSIOBalance% 和 EBSByteBalance% 指标。如果 EBSIOBalance% 或 EBSByteBalance% 的百分比值一直较低,则表明实例级别分别出现了 IOPS 或吞吐量瓶颈。

如果 IOPS 或吞吐量出现限流,则表明 IOPS 或吞吐量在存储级别难以满足工作负载的需求。要解决此问题,请执行以下操作:

  • 找到对数据库造成更多负载的 SQL 查询,然后优化这些查询。如果工作负载正常,或者没有调整 SQL 查询的空间,则可能需要增加预置 IOPS。
  • 如果您注意到实例级别的 IOPS 或吞吐量出现限流,则需要扩展实例类,以获得更高的吞吐量或 IOPS。

微突发

当 EBS 卷在明显短于收集周期内“突发”高 IOPS 或吞吐量时,就会出现微突发情况。CloudWatch 指标的收集间隔为 60 秒。由于卷在短于收集周期的时间内出现爆突发 IOPS 或吞吐量的时间,因此 CloudWatch 不会反映这种突发情况。您可以使用增强监控来确定微突发是否会导致延迟。启用增强监控(粒度为 1 秒)。您可以使用读取 IO/s写入 IO/s 指标来确定实际的 IOPS 利用率。您可以使用读取 KB/s写入 KB/s 来确定每秒的实际吞吐量利用率。有关更多信息,请参阅增强监控指标说明