Linux 实例上的 Amazon EBS 卷性能 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

Linux 实例上的 Amazon EBS 卷性能

几个因素(包括 I/O 特性以及实例和卷的配置)会对 Amazon EBS 的性能造成影响。客户如按照 Amazon EBS 和 Amazon EC2 产品详细信息页面上的指导操作,通常能获得很好的性能。但是,在某些情况下,您可能需要进行一些调整才能在此平台上获得最好的性能。本主题讨论特定于某些使用案例的一般最佳实践和性能调整。除了基准测试之外,我们建议您根据实际工作负载信息来调整性能,以确定最佳配置。当您学习了使用 EBS 卷的基础知识后,最好了解一下所需的 I/O 性能,以及可用于提升 Amazon EBS 性能以满足这些要求的选项。

EBS 卷类型性能的 Amazon 更新可能不会立即在您的现有卷上生效。要查看较早卷上的全部性能,您需要先在其上执行 ModifyVolume 操作。有关更多信息,请参阅在 Linux 上修改 EBS 卷的大小、IOPS 或类型

Amazon EBS 性能提示

这些提示代表了在各种用户场景下能够获得最佳 EBS 卷性能的最佳实践。

使用 EBS 优化的实例

对于不支持 EBS 优化吞吐量的实例,网络流量可能会与实例和 EBS 卷之间的流量产生冲突;而在 EBS 优化实例中,这两种流量相互独立。部分 EBS 优化实例配置(例如 C3、R3 和 M3)会产生额外成本,另一些实例(例如 M4、C4、C5 和 D2)始终可进行 EBS 优化而不会产生额外成本。有关更多信息,请参阅Amazon EBS 优化的实例

了解如何计算性能

度量 EBS 卷的性能时,应了解所需采用的度量单位以及如何计算性能,这十分重要。有关更多信息,请参阅I/O 特性和监控

了解工作负载

EBS 卷的最高性能、I/O 操作的大小和数量,以及完成每个操作所需时间之间存在着某种关系。这些因素(性能、I/O 和延迟)相互影响,不同应用程序对各个因素的敏感程度也不同。有关更多信息,请参阅 对 EBS 卷进行基准测试

请注意,从快照中初始化卷时,性能将会下降

当您首次访问从快照创建的新 EBS 卷上的每个数据块时,延迟会大大增加。您可以使用以下其中一个选项来避免这一性能下降:

  • 在将卷部署到生产环境之前访问每个块。此过程称为初始化(以前称为预热)。有关更多信息,请参阅初始化 Amazon EBS 卷

  • 在快照上启用快速快照还原,以确保从中创建的 EBS 卷在创建时已完全初始化,并立即提供所有预置的性能。有关更多信息,请参阅Amazon EBS 快速快照还原

可能导致 HDD 性能下降的因素

如果创建吞吐量优化型 HDD(st1)或 Cold HDD(sc1)卷的快照,则在快照处理过程中,性能可能会降低,最坏情况下会降低到卷的基准值。这种情况是这些卷类型特有的。其他可能会限制性能的因素包括迫使吞吐量超过实例的支持能力,在初始化从快照创建的卷时损失性能,以及卷上的小型随机 I/O 过多。有关计算 HDD 卷吞吐量的更多信息,请参阅 Amazon EBS 卷类型

如果您的应用程序没有发送足够多的 I/O 请求,性能可能也会受影响。这可通过查看卷的队列长度和 I/O 大小来监控。队列长度是您的应用程序向卷发起的待处理 I/O 请求的数量。为实现最大程度的一致性,在执行 1MiB 的顺序 I/O 时,HDD 卷必须保持 4 或更大的队列长度(四舍五入为最近的整数)。有关确保稳定的卷性能的更多信息,请参阅 I/O 特性和监控

st1sc1 上的高吞吐量读取密集型工作负载增加预读值

一些工作负载读取操作量大,并会访问操作系统页缓存中的块设备(例如从文件系统访问)。在这种情况下,为了实现最大的吞吐量,我们建议您将预读取设置配置为 1 MiB。每个块储存设备的设置不同,应该只应用于您的 HDD 卷。

要检查您的块储存设备的当前预读数值,请使用以下命令:

[ec2-user ~]$ sudo blockdev --report /dev/<device>

块储存设备信息采用以下格式返回:

RO RA SSZ BSZ StartSec Size Device rw 256 512 4096 4096 8587820544 /dev/<device>

以上显示的设备报告预读取值为 256(默认值)。将此数字乘以扇区大小(512 字节)就可获得预读取缓冲区的大小,在此例中为 128 KiB。要将缓冲区值设置为 1 MiB,请使用以下命令:

[ec2-user ~]$ sudo blockdev --setra 2048 /dev/<device>

再次运行第一个命令,验证预读取设置现在显示 2048。

仅当您的工作负载包括大型顺序 I/O 时,才使用此设置。如果它主要包含的是小型随机 I/O,则此设置会降低性能。一般来说,如果工作负载主要包括小型随机 I/O,则应考虑使用通用型 SSD(gp2gp3)卷,而不是 st1sc1 卷。

使用现代 Linux 内核

借助对间接描述符的支持,使用现代 Linux 内核。所有 Linux 内核 3.8 及更高版本的内核上具有此支持,以及任何当代 EC2 实例。如果您的平均 I/O 大小达到或接近 44 KiB,则说明您可能是在不支持间接描述符的情况下使用实例或内核。有关根据 Amazon CloudWatch 指标得出平均 I/O 大小的信息,请参阅 I/O 特性和监控

要在 st1sc1卷上实现最大吞吐量,建议您将值 256 应用于 xen_blkfront.max 参数(对于低于 4.6 的 Linux 内核版本)或 xen_blkfront.max_indirect_segments 参数(对于 Linux 内核版本 4.6 及更高版本)。可在操作系统 boot 命令行中设置相应的参数。

例如,在具有较早内核的 Amazon Linux AMI 中,您可以将它添加到在 /boot/grub/menu.lst 中找到的 GRUB 配置的 kernel 行末尾:

kernel /boot/vmlinuz-4.4.5-15.26.amzn1.x86_64 root=LABEL=/ console=ttyS0 xen_blkfront.max=256

对于更高版本的内核,该命令将类似于以下内容:

kernel /boot/vmlinuz-4.9.20-11.31.amzn1.x86_64 root=LABEL=/ console=tty1 console=ttyS0 xen_blkfront.max_indirect_segments=256

重启实例,让此设置生效。

有关更多信息,请参阅Configuring GRUB。对于其他 Linux 发行版(尤其是不使用 GRUB 引导加载程序的版本)可能需要采用不同方法来调整内核参数。

使用 RAID 0 以最大限度利用实例资源

某些实例类型可以实现的 I/O 吞吐量大于可以为单个 EBS 卷配置的量。可以将多个卷一起加入到 RAID 0 配置中,以将可用带宽用于这些实例。有关更多信息,请参阅Linux 上的 RAID 配置

使用 Amazon CloudWatch 跟踪性能

Amazon Web Services 提供了您可以使用 Amazon CloudWatch 来分析和查看的 Amazon EBS 性能指标,以及可以用于监控卷运行状况的状态检查。有关更多信息,请参阅监控您的卷状态