

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 对 Amazon EBS 卷进行基准测试
<a name="benchmark_procedures"></a>

您可以通过模拟 I/O 工作负载来测试 Amazon EBS 卷的性能。过程如下所述：

1. 启动 EBS 优化实例。

1. 创建新的 EBS 卷。

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

1. 配置并挂载块储存设备。

1. 安装一个工具来对 I/O 性能进行基准测试。

1. 对您的卷的 I/O 性能进行基准测试。

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

**重要**  
某些过程可能会对您进行基准测试的 EBS 卷上的现有数据造成破坏。基准测试程序适用于出于测试目的而特别创建的卷，并不适用于生产卷。

## 设置实例
<a name="set_up_instance"></a>

为了获得最佳的 EBS 卷性能，我们建议您使用 EBS 优化实例。EBS 优化的实例在 Amazon EC2 与 Amazon EBS 之间提供了专用带宽，其规格取决于实例类型。

要创建 EBS 优化实例，可在使用 Amazon EC2 控制台启动实例时选择**作为 EBS 优化实例启动**，或在使用命令行时指定 **--ebs-optimized**。请确保选择的实例类型支持该选项。

### 设置 Provisioned IOPS SSD 或 通用型 SSD 卷
<a name="setupPIOPS"></a>

要使用 Amazon EC2 控制台创建预调配 IOPS SSD（`io1` 和 `io2`）或通用型 SSD（`gp2` 和 `gp3`）卷，对于**卷类型**，选择**预调配 IOPS SSD（io1）**、**预调配 IOPS SSD（io2）**、**通用型 SSD（gp2）**或**通用型 SSD（gp3）**。在命令行中，为 `io1` 参数指定 `io2`、`gp2`、`gp3` 或 **--volume-type**。对于`io1``io2`、和`gp3`卷，请为**--iops**参数指定每秒 I/O 操作数 (IOPS)。有关更多信息，请参阅[Amazon EBS 卷类型](ebs-volume-types.md)和[创建 Amazon EBS 卷](ebs-creating-volume.md)。

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

有关如何创建 RAID 0 阵列的更多信息，请参阅[创建 RAID 0 阵列](raid-config.md#create-raid-array)。

### 设置吞吐量优化型 HDD（`st1`）卷或 Cold HDD（`sc1`）卷
<a name="set_up_hdd"></a>

要创建 `st1` 卷，可在使用 Amazon EC2 控制台创建卷时选择**吞吐量优化型 HDD**，或在使用命令行时指定 **--type `st1`**。要创建 `sc1` 卷，可在使用 Amazon EC2 控制台创建卷时选择 Cold HDD，或在使用命令行时指定 **--type `sc1`**。有关创建 EBS 卷的信息，请参阅[创建 Amazon EBS 卷](ebs-creating-volume.md)。有关将这些卷附加到您的实例的信息，请参阅 [将 Amazon EBS 卷挂载到 Amazon EC2 实例](ebs-attaching-volume.md)。

（*仅限 Linux 实例*） AWS 提供了一个用于的 JSON 模板 CloudFormation ，可简化此设置过程。访问[模板](https://s3.amazonaws.com/cloudformation-examples/community/st1_cloudformation_template.json)并将其另存为 JSON 文件。 CloudFormation 允许您配置自己的 SSH 密钥，并提供了一种更简单的方法来设置性能测试环境来评估容`st1`量。此模板会创建一个最新一代的实例以及一个 2 TiB 的 `st1` 卷，然后将该卷附加到 `/dev/xvdf` 处的实例。

**（*仅限 Linux 实例*）使用模板创建 HDD 卷**

1. 在 [https://console.aws.amazon.com/cloudformat](https://console.aws.amazon.com/cloudformation/) ion 上打开 CloudFormation 控制台。

1. 选择 **Create Stack**。

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

1. 为堆栈命名，例如 “ebs-perf-testing”，然后选择实例类型（默认为 r3.8xlarge）和 SSH 密钥。

1. 选择 **Next** 两次，然后选择 **Create Stack**。

1. 新堆栈的状态从 **CREATE\$1IN\$1PROGRESS** 变为 **COMPLETE** 后，请选择**输出**以获取新实例的公有 DNS 条目，新实例将附加一个 2TiB `st1` 卷。

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

1. 继续执行[安装基准测试工具](#install_tools)。

## 安装基准测试工具
<a name="install_tools"></a>

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

### Linux 实例
<a name="install_tools-linux"></a>


| 工具 | 描述 | 
| --- | --- | 
|  fio  |  用于对 I/O 性能进行基准测试。（请注意，**fio** 依赖于 `libaio-devel`。） 要在 Amazon Linux 上安装 **fio**，请运行以下命令： <pre>$ sudo yum install -y fio</pre> 要在 Ubuntu 上安装 **fio**，请执行以下命令： <pre>sudo apt-get install -y fio</pre>  | 
|  [Oracle Orion 校准工具](https://docs.oracle.com/cd/E18283_01/server.112/e16638/iodesign.htm#BABFCFBC)  |  用于校准要用于 Oracle 数据库的存储系统的 I/O 性能。  | 

### Windows 实例
<a name="install_tools-windows"></a>


| 工具 | 说明 | 
| --- | --- | 
| [DiskSpd](https://github.com/microsoft/diskspd/releases) | DiskSpd 是微软 Windows、Windows Server 和云服务器基础架构工程团队推出的存储性能工具。它可以在 d [https://github.com/Microsoft/iskspd/](https://github.com/Microsoft/diskspd/releases) 发行版上下载。 下载 `diskspd.exe` 可执行文件后，以管理权限打开命令提示符（通过选择“以管理员身份运行”），然后导航到复制 `diskspd.exe` 文件的目录。 将所需的 `diskspd.exe` 可执行文件从相应的可执行文件的文件夹（`amd64fre`、`armfre` 或 `x86fre)`）复制到简短的路径，如 `C:\DiskSpd`。在大多数情况下，您需要 DiskSpd 从该`amd64fre`文件夹中获得 64 位版本的。 的源代码托管在：[https://github.com/Microsoft/diskspd GitHub ](https://github.com/Microsoft/diskspd) 上。 DiskSpd  | 
|  CrystalDiskMark  | CrystalDiskMark 是一款简单的磁盘基准测试软件。它可在以下网址下载[：https://crystalmark。 info/en/software/crystaldiskmark](https://crystalmark.info/en/software/crystaldiskmark/)/。 | 

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

## 选择卷队列长度
<a name="UnderstandingQueueLength"></a>

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

### SSD 支持的卷的队列长度
<a name="SSD_queue"></a>

要确定支持 SSD 的卷上工作负载的最佳队列长度，建议您将每 1000 IOPS（通用型 SSD 卷的基准量，Provisioned IOPS SSD 卷的预置量）对应 1 个队列长度作为目标。然后，您可以监控应用程序性能，并根据应用程序需求调整该值。

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

### HDD 支持的卷的队列长度
<a name="HDD_queue"></a>

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

## 禁用 C 状态
<a name="cstates"></a>

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

### Linux 实例
<a name="cstates-linux"></a>

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

1. 获取 C 状态数。

   ```
   $ cpupower idle-info | grep "Number of idle states:"
   ```

1. 从 c1 到 cN 禁用 C 状态。理想情况下，核心应处于状态 c0。

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

### Windows 实例
<a name="cstates-windows"></a>

在 Windows 上，您可以按以下所示禁用 C 状态：

1. 在 PowerShell，获取当前的有功功率方案。

   ```
   $current_scheme = powercfg /getactivescheme
   ```

1. 获取电源方案 GUID。

   ```
   (Get-WmiObject -class Win32_PowerPlan -Namespace "root\cimv2\power" -Filter "ElementName='High performance'").InstanceID          
   ```

1. 获取电源设置 GUID。

   ```
   (Get-WmiObject -class Win32_PowerSetting -Namespace "root\cimv2\power" -Filter "ElementName='Processor idle disable'").InstanceID                  
   ```

1. 获取电源设置子组 GUID。

   ```
   (Get-WmiObject -class Win32_PowerSettingSubgroup -Namespace "root\cimv2\power" -Filter "ElementName='Processor power management'").InstanceID
   ```

1. 通过将索引的值设置为 1 来禁用 C 状态。值为 0 表示已禁用 C 状态。

   ```
   powercfg /setacvalueindex <power_scheme_guid> <power_setting_subgroup_guid> <power_setting_guid> 1
   ```

1. 设置活动方案以确保设置已保存。

   ```
   powercfg /setactive <power_scheme_guid>
   ```

## 执行基准测试
<a name="perform_benchmarking"></a>

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

对附加了 EBS 卷的 EBS 优化实例运行以下命令。如果已从快照创建 EBS 卷，在执行基准测试之前，请确保初始化这些卷。有关更多信息，请参阅 [创建后手动初始化卷](initalize-volume.md#ebs-initialize)。

**提示**  
您可以使用 EBS 详细性能统计数据提供的 I/O 延迟直方图来比较基准测试中的 I/O 性能分布。有关更多信息，请参阅 [Amazon EBS 详细性能统计数据](nvme-detailed-performance-stats.md)。

完成对卷的测试后，可参阅以下主题来帮助清除卷：[删除 Amazon EBS 卷](ebs-deleting-volume.md)和[终止实例](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)。

### 基准 Provisioned IOPS SSD 和 通用型 SSD 卷
<a name="piops_benchmarking"></a>

#### Linux 实例
<a name="piops_benchmarking-linux"></a>

在您创建的 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 性能](https://www.linux.com/training-tutorials/inspecting-disk-io-performance-fio/)。

#### Windows 实例
<a name="piops_benchmarking-windows"></a>

在您创建的卷上运行 **DiskSpd**。

以下命令将使用位于`C:`驱动器上的 20GB I/O 测试文件运行 30 秒的随机测试，写入率为 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 性能](https://sqlperformance.com/2015/08/io-subsystem/diskspd-test-storage)。SPd

### `st1` 和 `sc1` 卷（Linux 实例）基准测试
<a name="hdd_benchmarking"></a>

在 **fio** 或 `st1` 卷上运行 `sc1`。

**注意**  
在运行这些测试之前，请在您的实例 I/O 上设置缓冲，如中所述。[为 `st1` 和 `sc1` 上的高吞吐量读取密集型工作负载增加预读值（*仅限 Linux 实例*）](ebs-performance.md#read_ahead)

以下命令针对附加的 `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 fio fio_rw_mix.cfg
```

有关解释结果的更多信息，请参阅本教程：[使用 fio 检查磁盘 I/O 性能](https://www.linux.com/training-tutorials/inspecting-disk-io-performance-fio/)。

对于 **fio** 和 `st1` 卷而言，通过多个 `sc1` 作业来执行直接 I/O（即使使用顺序读入或写入操作）可能会导致吞吐量小于预期数值。我们建议您使用一个直接 I/O 任务并使用`iodepth`参数来控制并发 I/O 操作的数量。