Amazon Elastic Compute Cloud
Linux 实例用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 Amazon AWS 入门

对 EBS 卷进行基准测试

本节介绍如何通过模拟 I/O 工作负载来测试 Amazon EBS 卷的性能。过程如下所述:

  1. 启动 EBS 优化实例。

  2. 创建新的 EBS 卷。

  3. 将这些卷附加到您的 EBS 优化实例。

  4. 配置并装载块储存设备。

  5. 安装工具以便测试 I/O 性能。

  6. 测试卷的 I/O 性能。

  7. 删除卷并终止实例,确保不会继续引发更改。

重要

本主题中描述的部分程序可能会对您进行基准测试的 EBS 卷上的现有数据造成破坏。基准测试程序适用于出于测试目的而特别创建的卷,并不适用于生产卷。

设置实例

为了获得最佳的 EBS 卷性能,我们建议您使用 EBS 优化实例。EBS 优化实例可在 Amazon EC2 和 Amazon EBS 之间提供实例专用吞吐量。EBS 优化实例可在 Amazon EC2 和 Amazon EBS 之间提供专用带宽,选择范围在 425 到 14,000 Mbps 之间,具体取决于实例类型。

要创建 EBS 优化实例,可在使用 Amazon EC2 控制台启动实例时选择 Launch as an EBS-Optimized instance,或在使用命令行时指定 --ebs-optimized。请确保您启动的实例是支持该选项的最新一代实例。要了解本主题中提到的测试示例,建议您启动一个 c3.4xlarge 实例。有关更多信息,请参阅 Amazon EBS 优化实例

设置预配置 IOPS SSD (io1) 卷

要创建 io1 卷,请在使用 Amazon EC2 控制台创建卷时选择预配置 IOPS SSD,或在命令行中指定 --type io1 --iops n,其中 n 是 100 到 32000 之间的整数。有关创建 EBS 卷的信息,请参阅创建 Amazon EBS 卷。有关将这些卷附加到您的实例的信息,请参阅 将 Amazon EBS 卷附加到实例

要了解这些示例测试,我们建议您创建一个包含 6 个卷的高性能 RAID 阵列。因为您是按照预配置的 GB 数量以及为 io1 卷预配置 IOPS 的数量 (而不是卷数) 付费,因此创建多个较小卷并使用它们来创建条带集不会产生额外费用。如果您是使用 Oracle Orion 来测试卷的性能,则它可以模拟 Oracle ASM 的条带化操作,因此我们建议您让 Orion 执行条带化分区。如果您使用的是其他基准测试工具,则需要自己对卷执行条带化分区。

要在 Amazon Linux 上创建 6 卷条带集,请使用与此类似的命令:

[ec2-user ~]$ sudo mdadm --create /dev/md0 --level=0 --chunk=64 --raid-devices=6 /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk

在这个示例中,文件系统是 XFS。请使用符合您的要求的文件系统。使用以下命令安装 XFS 文件系统支持:

[ec2-user ~]$ sudo yum install -y xfsprogs

然后,使用这些命令创建、装载 XFS 文件系统并分配其的所有权:

[ec2-user ~]$ sudo mkdir -p /mnt/p_iops_vol0 && sudo mkfs.xfs /dev/md0 [ec2-user ~]$ sudo mount -t xfs /dev/md0 /mnt/p_iops_vol0 [ec2-user ~]$ sudo chown ec2-user:ec2-user /mnt/p_iops_vol0/

设置吞吐优化 HDD (st1) 或Cold HDD (sc1) 卷

要创建 st1 卷,可在使用 Amazon EC2控制台创建卷时选择吞吐优化 HDD,或在使用命令行时指定 --type st1。要创建 sc1 卷,可在使用 Amazon EC2 控制台创建卷时选择Cold HDD,或在使用命令行时指定 --type sc1。有关创建 EBS 卷的信息,请参阅创建 Amazon EBS 卷。有关将这些卷附加到您的实例的信息,请参阅 将 Amazon EBS 卷附加到实例

AWS 提供了一个 JSON 模板,以便与 AWS CloudFormation 配合使用来简化此设置过程。访问模板并将它另存为 JSON 文件。AWS CloudFormation 允许您配置自己的 SSH 密钥并提供了一种简单的方式来设置性能测试环境,以评估 st1 卷。此模板会创建一个最新一代的实例以及一个 2 TiB 的 st1 卷,然后将该卷附加到 /dev/xvdf 处的实例。

使用模板创建 HDD 卷

  1. 通过以下网址打开 AWS CloudFormation 控制台:https://console.amazonaws.cn/cloudformation

  2. 选择 Create Stack

  3. 选择 Upload a Template to Amazon S3,然后选择之前获得的 JSON 模板。

  4. 为您的堆栈提供名称 (如“ebs-perf-testing”),然后选择实例类型 (默认为 r3.8xlarge) 和 SSH 密钥。

  5. 选择 Next 两次,然后选择 Create Stack

  6. 新堆栈的状态从 CREATE_IN_PROGRESS 变为 COMPLETE 后,选择 Outputs 以获得新实例的公共 DNS 条目,新实例将附加一个 2 TiB 的 st1 卷。

  7. 以用户 ec2-user 的身份使用 SSH 连接到您的新堆栈 (使用从上一步的 DNS 条目中获得的主机名)。

  8. 继续执行安装基准测试工具

安装基准测试工具

下表列出了您可用于对 EBS 卷的性能进行基准测试的部分可用工具。

工具 描述

fio

用于测试 I/O 性能。(请注意,fio 依赖于 libaio-devel。)

要在 Amazon Linux 上安装 fio,请执行以下命令:

[ec2-user ~]$ sudo yum install -y fio

要在 Ubuntu 上安装 fio,请执行以下命令:

sudo apt-get install -y fio

Oracle Orion 校准工具

用于校准要与 Oracle 数据库搭配使用的存储系统的 I/O 性能。

这些基准测试工具可支持各种测试参数。您应该使用命令来测试您的卷支持的工作负载。下面提供的命令示例可帮助您入门。

选择卷队列长度

基于工作负载和卷类型选择最佳卷队列长度。

SSD 卷的队列长度

要确定 SSD 卷上工作负载的最佳队列长度,建议您将每 500 IOPS (gp2 卷的基准量,io1 卷的预配置量) 对应 1 个队列长度作为目标。然后,您可以监控应用程序性能,并根据应用程序需求调整该值。

在达到预配置 IOPS、吞吐量或最佳系统队列长度值之前,增加队列长度有好处,当前队列长度设置为 32。举例来说,预配置 1000 IOPS 的卷应该将队列长度设置为 2。您应该尝试将这些值调高或调低,看看对于您的应用程序,什么样的设置能够实现最佳性能。

HDD 卷的队列长度

要确定 HDD 卷上工作负载的最佳队列长度,建议您在执行 1MiB 顺序 I/O 时以至少为 4 的队列长度作为目标。然后,您可以监控应用程序性能,并根据应用程序需求调整该值。例如,突发吞吐量为 500 MiB/s、IOPS 为 500 的 2 TiB st1 卷在执行 1024 KiB、512 KiB 或 256 KiB 的顺序 I/O 时,分别应该将队列长度 4、8 或 16 作为目标。您应该尝试将这些值调高或调低,看看对于您的应用程序,什么样的设置能够实现最佳性能。

执行基准测试

以下步骤介绍各种 EBS 卷类型的基准测试命令。

对附加了 EBS 卷的 EBS 优化实例运行以下命令。如果已从快照还原 EBS 卷,在执行基准测试之前,请确保初始化这些卷。有关更多信息,请参阅 初始化 Amazon EBS 卷

完成对卷的测试后,可参阅以下主题来帮助清除卷:删除 Amazon EBS 卷终止您的实例

对 io1 卷进行基准测试

对创建的条带集运行 fio

以下命令可执行 16 KB 随机写入操作。

[ec2-user ~]$ sudo fio --directory=/mnt/p_iops_vol0 --name fio_test_file --direct=1 --rw=randwrite --bs=16k --size=1G --numjobs=16 --time_based --runtime=180 --group_reporting --norandommap

以下命令可执行 16 KB 随机读取操作。

[ec2-user ~]$ sudo fio --directory=/mnt/p_iops_vol0 --name fio_test_file --direct=1 --rw=randread --bs=16k --size=1G --numjobs=16 --time_based --runtime=180 --group_reporting --norandommap

有关解析结果的更多信息,请参阅以下教程:使用 fio 检查磁盘 IO 性能

st1sc1 卷进行基准测试

st1sc1 卷上运行 fio

注意

在执行这些测试之前,请按st1sc1 上高吞吐量、读取操作量大的工作负载增大预读取值所述在实例上设置缓冲 I/O。

以下命令针对附加的 st1 块储存设备 (例如 /dev/xvdf) 执行 1 MiB 的顺序读取操作:

[ec2-user ~]$ sudo fio --filename=/dev/<device> --direct=1 --rw=read --randrepeat=0 --ioengine=libaio --bs=1024k --iodepth=8 --time_based=1 --runtime=180 --name=fio_direct_read_test

以下命令针对附加的 st1 块储存设备执行 1 MiB 的顺序写入操作:

[ec2-user ~]$ sudo fio --filename=/dev/<device> --direct=1 --rw=write --randrepeat=0 --ioengine=libaio --bs=1024k --iodepth=8 --time_based=1 --runtime=180 --name=fio_direct_write_test

有些工作负载可对块储存设备的不同部分混合执行顺序读取和顺序写入操作。要对此类工作负载进行基准测试,我们建议您为读取和写入操作单独、同时使用 fio 作业,并为每个作业使用 fio offset_increment 选项将块储存设备的不同位置作为目标。

运行此类工作负载比顺序写入或顺序读取工作负载要复杂一些。使用文本编辑器创建一个 fio 作业文件,在此示例中名为 fio_rw_mix.cfg,包含以下内容:

[global] clocksource=clock_gettime randrepeat=0 runtime=180 offset_increment=100g [sequential-write] bs=1M ioengine=libaio direct=1 iodepth=8 filename=/dev/<device> do_verify=0 rw=write rwmixread=0 rwmixwrite=100 [sequential-read] bs=1M ioengine=libaio direct=1 iodepth=8 filename=/dev/<device> do_verify=0 rw=read rwmixread=100 rwmixwrite=0

然后运行以下命令:

[ec2-user ~]$ sudo fio fio_rw_mix.cfg

有关如何解释结果的更多信息,请参阅 Inspecting disk I/O performance with fio 教程。

对于 st1sc1 卷而言,通过多个 fio 作业来执行直接 I/O (即使使用顺序读入或写入操作) 可能会导致吞吐量小于预期数值。建议您使用一个直接 I/O 作业并使用 iodepth 参数来控制并发 I/O 操作的数量。