如何确定我的 Amazon EBS 卷是否出现微爆发流量,又该如何防止这种情况发生?

上次更新日期:2022 年 12 月 5 日

我的 Amazon Elastic Block Store(Amazon EBS)卷并未超出 Amazon CloudWatch 中的吞吐量或 IOPS 限制。但该卷似乎受到节流,并且出现高延迟/长队列现象。

简短描述

CloudWatch 按照一分钟的间隔采样,从而监控所有 Amazon EBS 卷类型的 IOPS(操作数/秒)和吞吐量(字节/秒)。

微爆发是指 EBS 卷爆发高 IOPS 或吞吐量的时间明显短于采样周期的情形。由于卷爆发高 IOPS 或吞吐量的时间短于采样周期,因此 CloudWatch 不会反映这种爆发情况。

示例:某个 IO1 卷(1 分钟采样周期)具有 950 的预调配 IOPS,该卷上的一个应用程序持续 5 秒推送 1000 IOPS。当应用程序触及卷的 IOPS 限制时,Amazon EBS 会对其进行节流。此时,卷将无法处理工作负载,从而导致队列长度增加、延迟上升。

CloudWatch 不会显示该卷超过了 IOPS 限制,因为采样周期为 60 秒,而 IOPS 达到 1000 的持续时间仅为 5 秒钟。在 1 分钟采样周期的剩余 55 秒钟内,该卷保持空闲状态。整个 1 分钟期间的 VolumeReadOps+VolumeWriteOps 数量是 5000 次操作(1000*5 秒)。即一分钟的平均值为 83.33 IOPS(5000/60 秒)。这样的平均值通常不构成问题。

在此例中,相同采样时间下的 VolumeIdleTime 为 55 秒,因为该卷在采样周期的剩余时间处于空闲状态。这意味着,在该采样时间内发生的 5000 次操作(VolumeReadOps+VolumeWriteOps)仅发生在 5 秒钟之内。如果用 5000 除以 5 来计算平均 IOPS,则结果为 1000 IOPS。容量限制为 1000 IOPS。

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

  1. 使用 CloudWatch 指标来识别可能的微爆发流量。
  2. 使用 CloudWatch 获取微爆发事件。
  3. 使用操作系统级工具确认微爆发流量。
  4. 通过更改卷大小或类型来满足应用程序的需求,防止出现微爆发流量。

解决方法

使用 CloudWatch 指标来识别可能的微爆发流量

1.    检查 VolumeIdleTime 指标。该指标指示在指定时间段内无任何读取或写入操作提交的总秒数。如果 VolumeIdleTime 较高,则说明在采样周期的大部分时间内,卷保持空闲状态。在相同的采样时间内出现足够高的 IOPS 或吞吐量,这表明可能存在微爆发流量。

对于吞吐量的 VolumeIdleTime 指标,还有 VolumeReadBytesVolumeWriteBytes 指标。

2.    使用以下公式计算卷处于活动状态时达到的平均吞吐量:

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

对于 IOPS 的 VolumeIdleTime 指标,还有 VolumeReadOpsVolumeWriteOps 指标。

3.    使用以下公式计算卷处于活动状态时达到的平均 IOPS:

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

使用 CloudWatch 获取微爆发事件

  1. 打开 CloudWatch 控制台
  2. 选择 All Metrics(所有指标)。
  3. 使用卷 ID 搜索受影响的卷。
  4. 要查看吞吐量指标,请选择 Browse(浏览),然后添加 VolumeReadBytesVolumeWriteBytesVolumeIdleTime
  5. 选择 Graphed metrics(已绘制指标)。
  6. 对于 Statistics(统计数据),选择 Sum(总和),对于 Period(周期),选择 1 minute(1 分钟)。
  7. 对于 Add Math(添加数学公式),选择 Start with empty expression(以空表达式开头)。
  8. Details of Expression(表达式详细信息)中,输入 Actual Average Throughput in Bytes/s [实际平均吞吐量(字节/秒)] 公式的图形 ID。例如,(m1+m2)/(60-m3)。

如果公式计算出的值大于卷支持的最大吞吐量,则会出现微爆发流量。要查看 IOPS 指标,请按照前面的步骤操作,然后在第 4 步中添加 VolumeReadOpsVolumeWriteOpsVolumeIdleTime

使用操作系统级工具确认微爆发流量

上述公式并非始终能够实时识别微爆发流量。这是因为即使 VolumeIdleTime 比较低,卷也可能发生微突发。

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

要确认是否出现微爆发流量,请使用比 CloudWatch 更精细的操作系统级工具。

Linux

使用 iostat 命令。有关更多信息,请参阅 Linux 主页上的 iostat(1)

1.    运行以下命令,以 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,则说明出现了微爆发流量。

Windows

在 Windows Performance Monitor 中运行 perfmon 命令。有关更多信息,请参阅 确定您的 IOPS 和吞吐量要求

通过更改卷大小或类型来满足应用程序的需求,防止出现微爆发流量

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

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


这篇文章对您有帮助吗?


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