如何确定 EBS 卷中出现微突发,如何防止这种情况发生?

上次更新时间:2020 年 12 月 17 日

我的 Amazon Elastic Block Store (Amazon EBS) 卷没有超出 Amazon CloudWatch 中的吞吐量(字节/秒)或 IOPS(操作数/秒)限制,但系统却显示受限,而且正在遭遇高延迟/长队列。怎样确定这是否由微突发流量造成,怎样才能防止这种情况的发生?

简短描述

对于大多数卷,CloudWatch 每 5 分钟收集一次样本,由此来监控 EBS 卷的 IOPS(操作数/秒)和吞吐量(字节/秒)。IO1 和 IO2 卷支持详细监控(每分钟收集一次样本)。

当 EBS 卷在明显短于收集周期内“突发”高 IOPS 或吞吐量时,就会出现微突发情况。由于卷在短于收集周期的时间内出现突发高 IOPS 或吞吐量的时间,因此 CloudWatch 不会反映这种突发情况。

示例:预置了 950 IOPS 的一个 IO1 卷(1 分钟收集周期)中有一个应用程序,持续 5 秒推送 1000 IOPS。当应用程序达到卷的 IOPS 限制时,Amazon EBS 会对其进行限制。此时,卷无法处理工作负载,从而导致队列长度增加、延迟更高。

CloudWatch 不会显示卷超过 IOPS 限制,因为收集周期为 60 秒。而 IOPS 达到 1000 仅持续了 5 秒钟的时间。在 1 分钟收集周期的剩余 55 秒钟时间内,卷保持空闲状态。因此,整个 1 分钟时间,VolumeReadOps+VolumeWriteOps 的数量是 5000 次操作(1000*5 秒)。这相当于这 1 分钟内的平均值为 83.33 IOPS(5000/60 秒),通常情况下,这没有什么问题。

在这种情况中,相同采样时间下,VolumeIdleTime 为 55 秒,因为该卷在收集周期的剩余时间内处于空闲状态。这意味着,在该采样时间内发生的 5000 次操作 (VolumeReadOps+VolumeWriteOps) 仅发生在 5 秒钟之内。用 5000 除以 5 计算出平均 IOPS。结果等于 1000 IOPS,达到了卷的限制。

要确定卷上是否出现了微突发流量,请执行以下操作:

  1. 使用 CloudWatch 指标来识别可能的微突发。
  2. 使用操作系统级工具(如 iostat)确认微突发。
  3. 通过更改卷大小或类型来满足应用程序的需求,防止微突发的发生。

解决方法

使用 CloudWatch 来识别可能的微突发

要在 CloudWatch 中使用 IOPS(操作数/秒)识别微突发,请执行以下操作:

1.    检查 VolumeIdleTime 指标。

如果 VolumeIdleTime 较高,则在收集周期的大部分时间内,卷将保持空闲状态。在相同的采样时间内,如果 IOPS 足够高,则表明可能发生了微突发。

2.    计算平均 IOPS。

VolumeReadOpsVolumeWriteOps 仅显示收集周期内执行的 I/O 操作数。要计算卷处于活动状态时达到的平均 IOPS,请用 Sum(VolumeReadOps)+Sum(VolumeWriteOps) 除以卷的活动时间,如以下公式所示:

实际平均 IOPS(单位:操作数/秒)= (Sum(VolumeReadOps) + Sum(VolumeWriteOps) ) / ( Period - Sum(VolumeIdleTime) )

注意:上述公式中的“Period”使用的是 CloudWatch 中给定时间的样本。CloudWatch 图形的指定 Period 等于卷的收集周期。

如果公式得出的值大于卷支持的最大 IOPS,则会发生微突发。

要在 CloudWatch 中使用吞吐量(字节/秒)识别微突发,请执行以下操作:

1.    检查 VolumeIdleTime 指标。

2.    使用以下公式计算平均吞吐量:

实际平均吞吐量(单位:字节/秒)= (Sum(VolumeReadBytes) + Sum(VolumeWriteBytes) ) / ( Period - Sum(VolumeIdleTime) )

注意:上述公式中的“Period”使用的是 CloudWatch 中给定时间的样本。CloudWatch 图形的指定 Period 等于卷的收集周期。

如果公式得出的值大于卷支持的最大吞吐量,则会发生微突发。

使用操作系统级工具(如 iostat)确认微突发

上述公式也有无法识别微突发的时候。这是因为即使 VolumeIdleTime 比较低,卷也可能发生微突发。

示例:您的卷峰值超出了卷的限制。然后,卷的活动将降低到极低级别,但不会在剩余的收集周期内完全处于空闲状态。即使发生了微突发,VolumeIdleTime 指标也不会反映低活动状态。

要确认是否发生了微突发,请使用比 CloudWatch 更精细的操作系统级工具,例如 iostat。有关 iostat 的更多信息,请参阅 Linux 手册页上的 iostat(1)

1.    使用 iostat 运行以下命令,以 1 秒的粒度报告所有已挂载卷的 I/O 统计信息:

iostat -xdmzt 1

注意:iostat 工具包含在 sysstat 软件包内。如果未找到 iostat 命令,请运行以下命令,在 Amazon Linux AMI 上安装 sysstat。

$ sudo yum install sysstat -y

2.    要确定您是否达到吞吐量限制,请查看输出中的 rMB/swMB/s。如果 rMB/s + wMB/s 大于卷的最大吞吐量,则会发生微突发。

要确定是否达到 IOPS 限制,请查看输出中的 r/sw/s。如果 r/s + w/s 大于卷的最大 IOPS,则表示发生了微突发。

通过更改卷大小或类型来满足应用程序的需求,预防微突发的发生

将卷更改为满足 IOPS 和吞吐量需求的类型/大小。有关卷类型及其各自 IOPS/吞吐量限制的更多信息,请参阅 Amazon EBS 卷类型。请记住,实例可以向所有连接的 EBS 卷推送的 IOPS/吞吐量,是有限制的

最佳实践是根据工作负载对卷进行基准测试,以验证哪些卷类型可以在测试环境中安全地满足工作负载的需求。有关更多信息,请参阅对 EBS 卷进行基准测试。</p


这篇文章对您有帮助吗?


您是否需要账单或技术支持?