

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 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 主控台建立適用於`io1`磁碟區類型`io2`的佈建 IOPS SSD (`gp2` 和 `gp3`) 或一般用途 SSD (** 和 **) 磁碟區，請選擇**佈建 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`) 或冷 HDD (`sc1`) 磁碟區
<a name="set_up_hdd"></a>

若要建立 `st1` 磁碟區，請在使用 Amazon EC2 主控台建立磁碟區時選擇**輸送量最佳化 HDD**，或者在使用命令列時指定 **--type `st1`**。若要建立 `sc1` 磁碟區，請在使用 Amazon EC2 主控台建立磁碟區時選擇冷 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：//[https://console.aws.amazon.com/cloudformation](https://console.aws.amazon.com/cloudformation/) 開啟 CloudFormation 主控台。

1. 請選擇 **Create Stack** (建立堆疊)。

1. 選取 **Upload a Template to Amazon S3 (上傳範本至 Amazon S3)** 並選取您先前取得的 JSON 範本。

1. 將您的堆疊命名為類似 “ebs-perf-testing” 的名稱，並選取一個執行個體類型 (預設為 r3.8xlarge) 和 SSH 金鑰。

1. 選擇 **Next (下一步)** 兩次，然後選擇 **Create Stack (建立堆疊)**。

1. 在新堆疊的狀態從 **CREATE\$1IN\$1PROGRESS** 變為 **COMPLETE** 之後，選擇 **Outputs** (輸出) 以獲得新執行個體的公有 DNS 項目，該執行個體將具有與其連接的 2 TiB `st1` 磁碟區。

1. 使用在上一個步驟從 DNS 項目取得的主機名稱，以使用者 **ec2-user** 的形式使用 SSH 連線至新堆疊。

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 Calibration Tool](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 是 Microsoft 的 Windows、Windows Server 和 Cloud Server Infrastructure 工程團隊的一種儲存體效能工具。您可在此處下載：[https://github.com/Microsoft/diskspd/releases](https://github.com/Microsoft/diskspd/releases)。 下載 `diskspd.exe` 可執行檔之後，(藉由選取「Run as Administrator (以管理員身分登入)」) 開啟具有管理權限的命令提示字元，然後導覽至您要從中複製 `diskspd.exe` 檔案的目錄。 將所需的 `diskspd.exe` 可執行檔從適當的可執行資料夾 (`amd64fre`、`armfre` 或 `x86fre)`) 複製到簡短的簡單路徑，例如 `C:\DiskSpd`。在大多數情況下，您需要 `amd64fre` 資料夾中的 64 位元版本的 DiskSpd。 DiskSpd 的原始程式碼託管於下列位置的 GitHub：[https://github.com/Microsoft/diskspd](https://github.com/Microsoft/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 MiB/s 和 IOPS 為 500 的 2 TiB `st1` 磁碟區應分別執行 4、8 或 16 佇列長度，同時分別執行 1,024 KiB、512 KiB 或 256 KiB 的序列 I/O。您應該調校這些值的高低來試驗，以查看何者最適用於您的應用程式。

## 停用 C-state
<a name="cstates"></a>

執行基準參考之前，您應該停用處理器 C-state。支援的 CPU 中暫時閒置的核心可能會進入 C-state 以節省電源。呼叫核心來繼續執行時，需要一定的時間量，核心才會再次完成運作。此延遲可能會干擾處理器基準參考例行作業。如需 C-state 的詳細資訊和支援它們的 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-state，如下所示：

1. 取得 C-state 的數量。

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

1. 停用 C-state，從 c1 變更為 cN。理想上來說，核心的狀態應該是 c0。

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

### Windows 執行個體
<a name="cstates-windows"></a>

您可以在 Windows 上停用 C-state，如下所示：

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-state。值 0 表示 C-state 已停用。

   ```
   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 
```

如需解譯結果的詳細資訊，請參閱此教學：[Inspecting disk IO performance with fio](https://www.linux.com/training-tutorials/inspecting-disk-io-performance-fio/)。

#### Windows 執行個體
<a name="piops_benchmarking-windows"></a>

在您建立的磁碟區執行 **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
```

如需解譯結果的詳細資訊，請參閱此教學：[Inspecting disk IO performance with DiskSPd](https://sqlperformance.com/2015/08/io-subsystem/diskspd-test-storage)。

### 基準`st1`和`sc1`磁碟區 (Linux 執行個體）
<a name="hdd_benchmarking"></a>

在您的 **fio** 和 `st1` 磁碟區上執行 `sc1`。

**注意**  
在執行這些測試之前，請按照 [為 `st1`和 `sc1`(*僅限 Linux 執行個體*) 上的高輸送量、高讀取量工作負載增加預先讀取](ebs-performance.md#read_ahead) 中的說明在執行個體上設定緩衝 I/O。

下列命令會針對連接的 `st1` 區塊型儲存裝置 (例如 `/dev/xvdf`) 執行 1 MiB 序列讀取操作：

```
$ 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_rw_mix.cfg` 的 fio 任務檔案，其中包含下列內容：

```
[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
```

如需解譯結果的詳細資訊，請參閱此教學：[Inspecting disk I/O performance with fio](https://www.linux.com/training-tutorials/inspecting-disk-io-performance-fio/)。

直接 I/O 的多個 **fio** 任務即使使用序列讀取或寫入操作，也會導致 `st1` 和 `sc1` 磁碟區的輸送量低於預期。建議您使用一個直接 I/O 任務並使用 `iodepth` 參數來控制並行 I/O 操作的數目。