对 EBS 卷进行基准测试 - Amazon Elastic Compute Cloud
Amazon Web Services 文档中描述的 Amazon Web Services 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅 中国的 Amazon Web Services 服务入门 (PDF)

对 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 之间提供了专用带宽,其规格取决于实例类型。有关更多信息,请参阅Amazon EBS 优化的实例

要创建 EBS 优化实例,可在使用 Amazon EC2 控制台启动实例时选择作为 EBS 优化的实例启动,或在使用命令行时指定 --ebs-optimized。请确保您启动的实例是支持该选项的最新一代实例。有关更多信息,请参阅Amazon EBS 优化的实例

设置 Provisioned IOPS SSD 或 通用型 SSD 卷

要使用 Amazon EC2 控制台创建预调配 IOPS SSD(io1io2)或通用型 SSD(gp2gp3)卷,对于卷类型,选择预调配 IOPS SSD(io1)预调配 IOPS SSD(io2)通用型 SSD(gp2)通用型 SSD(gp3)。在命令行中,为 io1 参数指定 io2gp2gp3--volume-type。对于 io1io2gp3 卷,请指定 --iops 参数的每秒 I/O 操作数(IOPS)。有关更多信息,请参阅Amazon EBS 卷类型创建 Amazon EBS 卷

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

有关如何创建包含 6 个卷的 RAID 0 阵列的说明,请参阅 在 Linux 上创建 RAID 0 阵列

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

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

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

使用模板创建 HDD 卷
  1. 打开 Amazon CloudFormation 控制台,地址:https://console.aws.amazon.com/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 条目,新实例将附加一个 2TiB 的 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 的卷上工作负载的最佳队列长度,建议您将每 1000 IOPS(通用型 SSD 卷的基准量,Provisioned IOPS SSD 卷的预置量)对应 1 个队列长度作为目标。然后,您可以监控应用程序性能,并根据应用程序需求调整该值。

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

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 作为目标。您应该尝试将这些值调高或调低,看看对于您的应用程序,什么样的设置能够实现最佳性能。

禁用 C 状态

在运行基准测试之前,您应禁用处理器 C 状态。支持此功能的 CPU 中的核心在暂时空闲时,会进入 C 状态以节省功耗。在调用核心以恢复处理时,将经过一段特定的时间,核心才能再次全速运行。此延迟可能会干扰处理器基准测试例程。有关 C 状态以及哪些 EC2 实例类型支持此状态的更多信息,请参阅 EC2 实例的处理器状态控制

在 Linux 上禁用 C 状态

您可在 Amazon Linux、RHEL 和 CentOS 上按以下所示禁用 C 状态:

  1. 获取 C 状态数。

    $ cpupower idle-info | grep "Number of idle states:"
  2. 从 c1 到 cN 禁用 C 状态。理想情况下,核心应处于状态 c0。

    $ for i in `seq 1 $((N-1))`; do cpupower idle-set -d $i; done

执行基准测试

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

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

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

基准 Provisioned IOPS SSD 和 通用型 SSD 卷

在您创建的 RAID 0 阵列上运行 fio

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

[ec2-user ~]$ sudo fio --directory=/mnt/p_iops_vol0 --ioengine=psync --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

fiost1 卷上运行 sc1

注意

在执行这些测试之前,请按为 st1 和 sc1 上的高吞吐量读取密集型工作负载增加预读值所述在实例上设置缓冲 I/O。

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

[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 [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 offset=100g

然后运行以下命令:

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

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

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