Amazon Elastic Compute Cloud
Windows 实例用户指南
AWS 文档中描述的 AWS 服务或功能可能因区域而异。要查看适用于中国区域的差异,请参阅中国的 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 之间提供了专用带宽,其规格取决于实例类型。有关更多信息,请参阅Amazon EBS 优化的实例

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

设置预配置 IOPS SSD (io1) 卷

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

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

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

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

安装基准测试工具

下表列出了您可用于对 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(gp2 卷的基准量,io1 卷的预配置量)对应 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 实例的处理器状态控制

在 Windows 系统上禁用 C 状态

在 Windows 上,您可以按以下所示禁用 C 状态:

  1. 在 PowerShell 中,获取当前活动的电源方案。

    C:\> $current_scheme = powercfg /getactivescheme
  2. 获取电源方案 GUID。

    C:\> (Get-WmiObject -class Win32_PowerPlan -Namespace "root\cimv2\power" -Filter "ElementName='High performance'").InstanceID
  3. 获取电源设置 GUID。

    C:\> (Get-WmiObject -class Win32_PowerSetting -Namespace "root\cimv2\power" -Filter "ElementName='Processor idle disable'").InstanceID
  4. 获取电源设置子组 GUID。

    C:\> (Get-WmiObject -class Win32_PowerSettingSubgroup -Namespace "root\cimv2\power" -Filter "ElementName='Processor power management'").InstanceID
  5. 通过将索引的值设置为 1 来禁用 C 状态。值为 0 表示已禁用 C 状态。

    C:\> powercfg /setacvalueindex <power_scheme_guid> <power_setting_subgroup_guid> <power_setting_guid> 1
  6. 设置活动方案以确保设置已保存。

    C:\> powercfg /setactive <power_scheme_guid>

执行基准测试

以下步骤介绍各种 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

以下命令针对附加的 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

有关如何解释结果的更多信息,请参阅 使用 fio 检查磁盘 I/O 性能教程。

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