

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# Amazon EBS I/O 特征和监控
<a name="ebs-io-characteristics"></a>

在给定的卷配置中，某些 I/O 特征决定了 EBS 卷的性能行为。
+ SSD-backed 无论 I/O 操作是随机操作还是顺序操作，卷、通用型 SSD（`io1`和`io2`）和预配置 IOPS 固态硬盘（和）都能提供一致的性能。`gp2` `gp3`
+ HDD-backed 卷、吞吐量优化 HDD (`st1`) 和 Cold HDD (`sc1`) 只有在 I/O 操作量大且连续运行时才能提供最佳性能。

要了解 SSD 和 HDD 卷在应用程序中的表现，重要的是要了解卷需求、可用的 IOPS 数量、 I/O 操作完成所需的时间以及卷的吞吐量限制之间的联系。

**Topics**
+ [IOPS](#ebs-io-iops)
+ [卷队列长度和延迟](#ebs-io-volume-queue)
+ [I/O 大小和体积吞吐量限制](#ebs-io-size-throughput-limits)
+ [使用监视 I/O 特性 CloudWatch](#ebs-io-metrics)
+ [监控实时 I/O 性能统计数据](#monitor-io-nvme)
+ [相关资源](#ebs-io-resources)

## IOPS
<a name="ebs-io-iops"></a>

IOPS 是表示每秒 input/output 操作数的计量单位。操作以 kiB 为单位进行测量，底层驱动器技术决定了一种卷类型算作单个卷的最大数据量。 I/O I/O 固态硬盘卷的大小上限为 256 KiB，硬盘卷的大小上限为 1,024 KiB，因为固态硬盘卷处理小容量或 I/O随机卷的效率要比硬盘高得多。

当小型 I/O 操作按物理顺序进行时，Amazon EBS 会尝试将它们合并为一个最大 I/O 规模的 I/O 操作。同样，当 I/O 操作大于最大 I/O 规模时，Amazon EBS 会尝试将其拆分为较小的 I/O 操作。下表显示了一些示例。



- **SSD**
  - **最大 I/O 尺寸:** 256 KiB
  - **I/O 来自您的应用程序的操作:** 1 x 1024 kiB 操作 I/O  / **IOPS 数量:** 4（1024÷256=4） / **备注:** 亚马逊 EBS 将 1,024 KiB 的操作拆分为四个较小的 I/O 256 KiB 操作。
  - **I/O 来自您的应用程序的操作:** 8 次顺序 32 KiB 操作 I/O  / **IOPS 数量:** 1（8x32=256） / **备注:** Amazon EBS 将连续八个 32 KiB 操作合并为一个 256 KiB I/O 操作。
  - **I/O 来自您的应用程序的操作:** 8 次随机 32 kiB 操作 I/O  / **IOPS 数量:** 8 / **备注:** Amazon EBS 将随机 I/O 操作单独计数。

- **HDD**
  - **最大 I/O 尺寸:** 1,024 KiB
  - **I/O 来自您的应用程序的操作:** 1 x 1024 kiB 操作 I/O  / **IOPS 数量:** 1 / **备注:** 该 I/O 操作已经等于最大大 I/O 小。它不会被合并或拆分。
  - **I/O 来自您的应用程序的操作:** 8 x 连续 128 KiB 操作 I/O  / **IOPS 数量:** 1（8x128=1024） / **备注:** 亚马逊 EBS 将连续八个 128 KiB 操作合并为一个 1,024 KiB I/O 操作。 I/O 
  - **I/O 来自您的应用程序的操作:** 8 次随机 32 kiB 操作 I/O  / **IOPS 数量:** 8 / **备注:** Amazon EBS 将随机 I/O 操作单独计数。



因此，当您创建支持 3,000 IOPS 的`io2`卷（通过预置 3,000 IOPS 的`io1`或`gp2`卷、将卷大小调整为 1,000 GiB 或使用`gp3`卷），并将其连接到可以提供足够带宽的 EBS-optimized 实例时，您每秒最多可以传输 3,000 I/Os 个数据，吞吐量由大小决定。 SSD-backed I/O 

## 卷队列长度和延迟
<a name="ebs-io-volume-queue"></a>

卷队列长度是设备待处理 I/O 请求的数量。延迟是指 I/O 操作的真实端到端客户端时间，换句话说，就是从向 EBS 发送 I/O 到收到 I/O 读取或写入已完成的 EBS 确认之间经过的时间。必须根据 I/O 大小和延迟正确校准队列长度，以避免在客户机操作系统或与 EBS 的网络链路上造成瓶颈。

每个工作负载的最佳队列长度不同，具体取决于您的特定应用程序对于 IOPS 和延迟的敏感程度。如果您的工作负载提供的 I/O 请求不足以充分利用 EBS 卷的可用性能，则您的卷可能无法提供您预配置的 IOPS 或吞吐量。

Transaction-intensive 应用程序对 I/O 延迟增加很敏感，非常适合 SSD-backed 存储卷。您可以通过使卷保持较小的队列长度和较高的 IOPS 数量，来维持高 IOPS 和低延迟。持续为一个卷驱动的 IOPS 超过其可用容量可能会导致 I/O 延迟增加。为了达到最大一致性，对于 1 分钟 1,000 个预调配 IOPS，卷必须保持平均队列深度（四舍五入到最接近的整数）1。例如，对于预置了 3,000 IOPS 的卷，队列深度平均值必须为 3。

Throughput-intensive 应用程序对 I/O 延迟增加不太敏感，非常适合 HDD-backed 存储卷。在执行大型连续操作时，您可以通过保持较高的队列长度来保持 HDD-backed 卷的高吞吐量 I/O。

## I/O 大小和体积吞吐量限制
<a name="ebs-io-size-throughput-limits"></a>

对于 SSD-backed 卷，如果您的容量非常 I/O 大，则由于已达到卷的吞吐量限制，因此您遇到的 IOPS 数量可能会少于预配置的数量。例如，如果`gp2`卷低于 1,000 GiB 且可用的突发积分，则其 IOPS 限制为 3,000，卷吞吐量限制为 250。 MiB/s如果您使用的是 256 KiB I/O 的大小，则您的卷将在 1000 IOPS（1000 x 256 KiB = 250 MiB = 250 MiB）时达到其吞吐量限制。对于较 I/O 小的容量（例如 16 KiB），同样的卷可以维持 3,000 IOPS，因为吞吐量远低于 250。 MiB/s（这些示例假设您的卷 I/O 未达到实例的吞吐量限制。） 有关每种 EBS 卷类型吞吐量限制的更多信息，请参阅 [Amazon EBS 卷类型](ebs-volume-types.md)。

对于较小的 I/O 操作，您可能会看到从实例内部测量的 IOPS 值高于预置的 IOPS 值。当实例操作系统在将小型 I/O操作传递给 Amazon EBS 之前将其合并成较大的操作时，就会发生这种情况。

如果您的工作负载使用顺序 I/Os 开启 HDD-backed `st1`和`sc1`卷，则从实例内部测量的 IOPS 数量可能会高于预期。当实例操作系统按顺序合并 I/Os 并以 1,024 个 KiB-sized 单位计算它们时，就会发生这种情况。如果您的工作负载使用少量或随机使用量 I/Os，则吞吐量可能会低于预期。这是因为我们会将每个随机的、非连续 I/O 的 IOPS 计数计入总 IOPS 计数，这可能会导致您比预期更快地达到卷的 IOPS 限制。

无论您采用何种 EBS 卷类型，如果您的 IOPS 或吞吐量与您在配置中的预期不同，请确保 EC2 实例带宽并不是导致这种结果的限制因素。为了获得最佳性能，您应始终使用最新一代的 EBS-optimized 实例（或包含 10 个 Gb/s 网络连接的实例）。未达到预期 IOPS 的另一个可能原因是，您开车不够 I/O 到 EBS 卷。

## 使用监视 I/O 特性 CloudWatch
<a name="ebs-io-metrics"></a>

您可以使用每个卷的音[CloudWatch 量指标](using_cloudwatch_ebs.md#ebs-volume-metrics)来监控这些 I/O 特征。

**监控是否已停止 I/O**  
`VolumeStalledIOCheck` 监控 EBS 卷的状态以确定您的卷何时受损。该指标是一个二进制值，它将根据 EBS 卷能否完成 I/O 操作返回 `0``1`（通过）或（失败）状态。

如果该`VolumeStalledIOCheck`指标失败，您可以等待 Amazon 问题得到解决，也可以采取措施，例如更换受影响的卷或停止并重新启动该卷所连接的实例。在大多数情况下，当该指标失败时，EBS 将在几分钟内自动诊断并恢复您的卷。您可以使用中的 “[暂停 I/O](ebs-fis.md)” 操作 Amazon Fault Injection Service 来运行受控实验，以测试您的架构并基于此指标进行监控，从而提高您的存储故障恢复能力。

**监控卷的 I/O 延迟**  
您可以使用 `VolumeAvgReadLatency` 和 `VolumeAvgWriteLatency` 指标分别监控 Amazon EBS 卷的读取和写入操作的平均延迟。您可以使用中的 “[延迟注入](ebs-fis-latency-injection.md)” 操作 Amazon Fault Injection Service 来运行受控实验，以测试您的架构，并根据此指标进行监控，从而提高您应对存储性能下降的弹性。

如果您的 I/O 延迟高于您的要求，请确保您的应用程序尝试驱动的 IOPS 或吞吐量不会超过您为卷预配置的。您可以使用 `VolumeAvgIOPS` 和 `VolumeAvgThroughput` 指标来监控一分钟内驱动到卷的平均 IOPS 和吞吐量，然后将其与卷的预调配 IOPS 和吞吐量进行比较。如果卷在该分钟内没有驱动任何操作，则指标将报告值零（`0`）。如果高 IOPS 或吞吐量的爆发持续时间短于分钟间隔，则卷会遭遇微爆，但平均 IOPS 和吞吐量指标可能会报告，您的性能低于卷的预调配 IOPS 或吞吐量限制。要确定您的卷在给定的分钟内是否出现性能突，您可以使用 `VolumeIOPSExceededCheck` 和 `VolumeThroughputExceededCheck` 指标。您可以监控这些指标，以确定在给定的分钟内，您的工作负载持续尝试驱动高于卷的预置性能的 IOPS 或吞吐量。如果在该分钟的任意一秒驱动的 IOPS 持续超过卷的预调配 IOPS 性能，则返回 `VolumeIOPSExceededCheck` 指标。`1`如果在该分钟的任意一秒驱动的吞吐量持续超过卷的预调配吞吐量性能，则返回 `VolumeThroughputExceededCheck` 指标。`1`如果驱动的 IOPS 和吞吐量在卷的预调配性能范围内，则返回 `0` 指标。

如果您的应用程序需要的 IOPS 数量超出您的卷所能提供的数量，则应考虑使用以下选项之一：
+ `gp3`、`io2` 或 `io1` 卷，预置了足够 IOPS 以实现所需延迟
+ 更大的 `gp2` 卷，提供足够的基准 IOPS 性能

HDD-backed `st1`而且，对于利用最大`sc1`容量 1,024 KiB I/O 的工作负载，卷的性能最佳。要确定卷的平均 I/O 大小，请`VolumeWriteBytes`除以`VolumeWriteOps`。同样的计算也适用于读取操作。如果平均 I/O 大小低于 64 KiB，则增加发送到`st1`或`sc1`卷的 I/O 操作的大小应该可以提高性能。

**监控 `gp2`、`st1` 和 `sc1` 卷的突发存储桶余额**  
`BurstBalance` 以剩余余额百分比的形式显示 `gp2`、`st1` 和 `sc1` 卷的突增存储桶余额。当您的突发存储桶耗尽时，容量 I/O （对于`gp2`卷）或卷吞吐量（`st1`和`sc1`卷）将限制为基准。检查 `BurstBalance` 值以确定卷是否因为此原因而受限制。有关可用亚马逊 EBS 指标的完整列表，请参阅[亚马逊 EBS 的亚马逊 CloudWatch 指标](using_cloudwatch_ebs.md)和 [Amazon EBS 实例指标。 Nitro-based ](https://docs.amazonaws.cn/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ebs-metrics-nitro)

## 监控实时 I/O 性能统计数据
<a name="monitor-io-nvme"></a>

您可以访问附加到 Amazon EC2 实例的 Amazon EBS 卷的实时详细性能统计数据。 Nitro-based 

您可以组合这些统计数据来得出平均延迟和 IOPS，或者检查 I/O 操作是否已完成。您还可以查看应用程序超过 EBS 卷或所附加实例的预调配 IOPS 或吞吐量限制的总时间。通过跟踪这些统计数据随时间推移的增长情况，您可以确定是否需要增加预调配 IOPS 或吞吐量限制，以优化应用程序的性能。详细的性能统计数据还包括读取和写入 I/O 操作的直方图，这些直方图通过跟踪 I/O 延迟区间内完成的 I/O 操作总数来提供延迟分布情况。

有关更多信息，请参阅 [Amazon EBS 详细性能统计数据](nvme-detailed-performance-stats.md)。

## 相关资源
<a name="ebs-io-resources"></a>

有关 Amazon EBS I/O 特性的更多信息，请参阅以下 re: Invent 演示文稿：A [mazon EBS](https://www.youtube.com/watch?v=2wKgha8CZ_w)：为性能而设计。