本文属于机器翻译版本。若本译文内容与英语原文存在差异,则一律以英文原文为准。
您可以通过模拟 I/O 工作负载来测试 Amazon EBS 卷的性能。过程如下所述:
-
启动 EBS 优化实例。
-
创建新的 EBS 卷。
-
将这些卷附加到您的 EBS 优化实例。
-
配置并挂载块储存设备。
-
安装工具以便测试 I/O 性能。
-
测试卷的 I/O 性能。
-
删除卷并终止实例,确保不会继续引发更改。
重要
某些过程可能会对您进行基准测试的 EBS 卷上的现有数据造成破坏。基准测试程序适用于出于测试目的而特别创建的卷,并不适用于生产卷。
设置实例
为了获得最佳的 EBS 卷性能,我们建议您使用 EBS 优化实例。EBS 优化的实例通过实例在 Amazon 和 A EC2 mazon EBS 之间提供专用的吞吐量。EBS 优化的实例在 Amazon 和 A EC2 mazon EBS 之间提供专用带宽,其规格取决于实例类型。
要创建 EBS 优化实例,请在使用 Amazon EC2 控制台启动实例时选择作为 EBS 优化实例启动,或者在使用命令行--ebs-optimized时指定。请确保选择的实例类型支持该选项。
设置 Provisioned IOPS SSD 或 通用型 SSD 卷
要使用亚马逊 EC2 控制台创建预配置 IOPS 固态硬盘(io1
和io2
)或通用固态硬盘(gp2
和gp3
)卷,请为卷类型选择预配置 IOPS 固态硬盘 (io1)、预配置 IOPS 固态硬盘 (io2) 、通用固态硬盘 (gp2) 或通用固态硬盘 (gp3)。在命令行中,为 io1
参数指定 io2
、gp2
、gp3
或 --volume-type。对于 io1
、io2
和 gp3
卷,请指定 --iops 参数的每秒 I/O 操作数(IOPS)。有关更多信息,请参阅Amazon EBS 卷类型 和创建 Amazon EBS 卷。
(仅限 Linux 实例)要了解这些示例测试,我们建议您创建一个包含 6 个卷的高性能 RAID 0 阵列。因为您是按照预配置的 GB 数量(以及为 io1、io2 和 gp3 卷预配置的 IOPS 数量,而不是卷的数量)付费,因此创建多个较小卷并使用它们来创建条带集不会产生额外费用。如果您是使用 Oracle Orion 来测试卷的性能,则它可以模拟 Oracle ASM 的条带化操作,因此我们建议您让 Orion 执行条带化分区。如果您使用的是其他基准测试工具,则需要自己对卷执行条带化分区。
有关如何创建 RAID 0 阵列的更多信息,请参阅创建 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 卷附加到亚马逊 EC2 实例。
(仅限 Linux 实例) AWS 提供了一个用于的 JSON 模板 AWS CloudFormation ,可简化此设置过程。访问模板st1
量。此模板会创建一个最新一代的实例以及一个 2 TiB 的 st1
卷,然后将该卷附加到 /dev/xvdf
处的实例。
(仅限 Linux 实例)使用模板创建 HDD 卷
在 https://console.aws.amazon.com/cloudformat
ion 上打开 AWS CloudFormation 控制台。 -
选择 Create Stack。
-
选择 Upload a Template to Amazon S3,然后选择之前获得的 JSON 模板。
-
为堆栈命名,例如 “ebs-perf-testing”,然后选择实例类型(默认为 r3.8xlarge)和 SSH 密钥。
-
选择 Next 两次,然后选择 Create Stack。
-
新堆栈的状态从 CREATE_IN_PROGRESS 变为 COMPLETE 后,选择 Outputs(输出)以获取新实例的公有 DNS 条目,新实例将附加一个 2TiB 的
st1
卷。 -
以用户
ec2-user
的身份使用 SSH 连接到您的新堆栈(使用从上一步的 DNS 条目中获得的主机名)。 -
继续执行安装基准测试工具。
安装基准测试工具
下表列出了您可用于对 EBS 卷的性能进行基准测试的部分可用工具。
工具 | 描述 |
---|---|
fio |
用于测试 I/O 性能。(请注意,fio 依赖于 要在 Amazon Linux 上安装 fio,请运行以下命令:
要在 Ubuntu 上安装 fio,请执行以下命令:
|
用于校准要与 Oracle 数据库搭配使用的存储系统的 I/O 性能。 |
工具 | 描述 |
---|---|
DiskSpd |
DiskSpd 是微软 Windows、Windows Server 和云服务器基础架构工程团队推出的存储性能工具。它可以在 d https://github.com/Microsoft/iskspd/ 下载 将所需的 的源代码托管在:https://github.com/Microsoft/diskspd GitHub |
CrystalDiskMark |
CrystalDiskMark 是一款简单的磁盘基准测试软件。它可在以下网址下载:https://crystalmark。 info/en/software/crystaldiskmark |
这些基准测试工具可支持各种测试参数。您应该使用命令来测试您的卷支持的工作负载。下面提供的命令示例可帮助您入门。
选择卷队列长度
基于工作负载和卷类型选择最佳卷队列长度。
SSD 支持的卷的队列长度
要确定支持 SSD 的卷上工作负载的最佳队列长度,建议您将每 1000 IOPS(通用型 SSD 卷的基准量,Provisioned IOPS SSD 卷的预置量)对应 1 个队列长度作为目标。然后,您可以监控应用程序性能,并根据应用程序需求调整该值。
在达到预配置 IOPS、吞吐量或最佳系统队列长度值之前,增加队列长度有好处,当前队列长度设置为 32。举例来说,预配置 3,000 IOPS 的卷应该将队列长度设置为 3。您应该尝试将这些值调高或调低,看看对于您的应用程序,什么样的设置能够实现最佳性能。
HDD 支持的卷的队列长度
要确定 HDD 卷上工作负载的最佳队列长度,建议您在执行 1MiB 顺序 I/O 时以至少为 4 的队列长度作为目标。然后,您可以监控应用程序性能,并根据应用程序需求调整该值。例如,突发吞吐量分别为 500 MiB/s and IOPS of 500 should target a queue length of 4, 8, or 16 while performing 1,024
KiB, 512 KiB, or 256 KiB sequential I/Os 的 2 TiB st1
卷。您应该尝试将这些值调高或调低,看看对于您的应用程序,什么样的设置能够实现最佳性能。
禁用 C 状态
在运行基准测试之前,您应禁用处理器 C 状态。支持此功能的 CPU 中的核心在暂时空闲时,会进入 C 状态以节省功耗。在调用核心以恢复处理时,将经过一段特定的时间,核心才能再次全速运行。此延迟可能会干扰处理器基准测试例程。有关 C 状态以及哪些 EC2 实例类型支持这些状态的更多信息,请参阅您的 EC2实例的处理器状态控制。
您可在 Amazon Linux、RHEL 和 CentOS 上按以下所示禁用 C 状态:
获取 C 状态数。
$
cpupower idle-info | grep "Number of idle states:"
从 c1 到 cN 禁用 C 状态。理想情况下,核心应处于状态 c0。
$
for i in `seq 1 $((N-1))`; do cpupower idle-set -d $i; done
在 Windows 上,您可以按以下所示禁用 C 状态:
-
在 PowerShell,获取当前的有功功率方案。
$current_scheme = powercfg /getactivescheme
-
获取电源方案 GUID。
(Get-WmiObject -class Win32_PowerPlan -Namespace "root\cimv2\power" -Filter "ElementName='High performance'").InstanceID
-
获取电源设置 GUID。
(Get-WmiObject -class Win32_PowerSetting -Namespace "root\cimv2\power" -Filter "ElementName='Processor idle disable'").InstanceID
-
获取电源设置子组 GUID。
(Get-WmiObject -class Win32_PowerSettingSubgroup -Namespace "root\cimv2\power" -Filter "ElementName='Processor power management'").InstanceID
-
通过将索引的值设置为 1 来禁用 C 状态。值为 0 表示已禁用 C 状态。
powercfg /setacvalueindex
<power_scheme_guid>
<power_setting_subgroup_guid>
<power_setting_guid>
1 -
设置活动方案以确保设置已保存。
powercfg /setactive
<power_scheme_guid>
执行基准测试
以下步骤介绍各种 EBS 卷类型的基准测试命令。
对附加了 EBS 卷的 EBS 优化实例运行以下命令。如果已从快照创建 EBS 卷,在执行基准测试之前,请确保初始化这些卷。有关更多信息,请参阅 初始化 Amazon EBS 卷。
提示
您可以使用 EBS 详细性能统计数据提供的 I/O 延迟直方图来比较基准测试中的 I/O 性能分布。有关更多信息,请参阅 Amazon EBS 的详细绩效统计数据。
完成对卷的测试后,可参阅以下主题来帮助清除卷:删除 Amazon EBS 卷和终止实例。
基准 Provisioned IOPS SSD 和 通用型 SSD 卷
在您创建的 RAID 0 阵列上运行 fio。
以下命令可执行 16 KB 随机写入操作。
$
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 随机读取操作。
$
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 性能
在您创建的卷上运行 DiskSpd。
以下命令将使用位于 C:
驱动器上的 20GB 测试文件运行 30 秒随机 I/O 测试(25% 的写入比率和 75% 的读取比率以及 8K 块大小)。它将使用八个工作线程,每个线程具有四个未完成的 I/O 和一个 1GB 的写入熵值种子。测试结果将保存到名为 DiskSpeedResults.txt
的文本文件中。这些参数模拟 SQL Server OLTP 工作负载。
diskspd -b8K -d30 -o4 -t8 -h -r -w25 -L -Z1G -c20G C:\iotest.dat > DiskSpeedResults.txt
有关解释结果的更多信息,请参阅本教程:使用磁盘检查磁盘 IO 性能
st1
和 sc1
卷(Linux 实例)基准测试
在 fio 或 st1
卷上运行 sc1
。
注意
在执行这些测试之前,请按为 st1 和 sc1 上的高吞吐量读取密集型工作负载增加预读值(仅限 Linux 实例)所述在实例上设置缓冲 I/O。
以下命令针对附加的 st1
块设备(例如 /dev/xvdf
)执行 1MiB 的顺序读取操作:
$
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 的顺序写入操作:
$
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
然后运行以下命令:
$
sudo fiofio_rw_mix.cfg
有关解析结果的更多信息,请参阅以下教程:使用 fio 检查磁盘 IO 性能
对于 fio 和 st1
卷而言,通过多个 sc1
作业来执行直接 I/O(即使使用顺序读入或写入操作)可能会导致吞吐量小于预期数值。建议您使用一个直接 I/O 作业并使用 iodepth
参数来控制并发 I/O 操作的数量。