
# 测试云硬盘的性能
在企业级应用中，存储性能直接影响到业务的运行效率和用户体验。然而，很多用户在部署应用时，往往忽视了对存储设备性能的测试，导致在高负载情况下出现性能瓶颈。如何确保存储设备在实际应用中能够提供稳定高效的性能？通过测试块存储性能，可以帮助您更好地理解存储设备的能力，并对其进行相应的优化和调整，以确保最佳性能。
测试方法分为以下两种：
- [Windows]
- [Linux]
#### 前提条件
- 测试性能时，如果分区的初始磁柱编号是非4KiB对齐，则对性能影响较大，请先确保分区的初始磁柱编号已经4KiB对齐，再开始测试。
- 测试共享云硬盘性能时，必须满足以下要求：
  - 共享云硬盘必须同时挂载至多台云服务器。
  
  - 当共享云硬盘挂载至多台弹性云服务器时，这些弹性云服务器必须位于同一个策略为"反亲和性"的云服务器组内。 如果弹性云服务器不满足反亲和性，则共享云硬盘性能无法达到最佳。
    
   
- 测试极速单副本云盘前，需提前配置安全保护组，以确保业务数据的高可靠。IOPS和吞吐量性能、云盘的可靠性指标无 SLA 保障，指标存在波动属于正常现象。
- 测试极速型SSD V2前，请先检查预配置IOPS和实例QOS，如果IOPS超过128000建议挂载aC7、aC9等高规格实例，确保ECS实例QoS高于云硬盘的峰值IOPS和吞吐量，性能才能达到预期
- 测试通用型SSD V2时，请先确认业务对IOPS和吞吐量的诉求，以便配置准确的IOPS和吞吐量参数。
![](https://support.huaweicloud.com/usermanual-evs/public_sys-resources/notice_3.0-zh-cn.png)
- 使用fio工具进行裸盘性能测试时，不能在已创建文件系统的磁盘上测试，因为fio性能测试会破坏文件系统，导致磁盘变为只读，需要删除后重新购买。请尽量不要在保存业务数据的磁盘上进行测试。如果需要，请按照以下建议操作：
  - 在测试开始前对磁盘数据进行[备份](https://support.huaweicloud.com/usermanual-evs/zh-cn_topic_0066615262.html)，防止误操作造成数据丢失。
  
  - 在测试命令中指定**filename** 参数为某个文件，例如**-filename=/opt/fiotest/fiotest.txt**。
   
- 本性能测试结果基于特定测试环境得出，仅供评估参考。在实际生产环境中，由于网络条件、并发访问量等多重因素的影响，云硬盘的实际性能表现可能会有所差异。请以您实际使用中的情况为准。fio工具的测试结果不符合预期，可以参考进行问题排查
 
- [Windows]
  
  本文以"Windows Server 2019 标准版 64位"操作系统为例，不同操作系统的操作可能不同，本文仅供参考，具体操作步骤和差异请参考对应操作系统的产品文档。
  测试性能前请先安装Iometer性能测试工具。
  1. 登录云服务器。 
     登录弹性云服务器请参见[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
     登录裸金属服务器请参见[登录裸金属服务器](https://support.huaweicloud.com/usermanual-bms/bms_01_0038.html)。
     
     
  
  2. 使用"win+r"组合键打开运行窗口，并输入"msinfo32"，单击"确定"。 
     弹出系统信息窗口。
     
     
  
  3. 选择"组件 \> 存储 \> 磁盘"，在右侧区域查看分区起始偏移值。 
     - 如果4096能被该参数值整除，则表示已经4KiB对齐，请执行[4]。
     
     - 如果4096不能被该参数值整除，则表示未4KiB对齐，如需继续测试请重新按照4KiB对齐分区。
       ![](https://support.huaweicloud.com/usermanual-evs/public_sys-resources/notice_3.0-zh-cn.png)
       删除分区并重新按照4KiB对齐选取初始磁柱编号时会导致磁盘原有数据的丢失，请谨慎操作。
       
     
     
     
     
  
  4. 使用Iometer工具测试磁盘性能，具体方法请参见Iometer产品文档。
     
     在进行IOPS和吞吐量测试时，Iometer参数配置和fio工具的参数相同，具体请参考[表1]。
     以下为使用Iometer工具测试磁盘性能的一个示例：
     1. 设置工作流。 ![](https://support.huaweicloud.com/usermanual-evs/zh-cn_image_0000001151849605.png "点击放大")
        
     
     2. 设置测试时间。 示例中测试时间为10分钟，前60秒不做计算，等待写入稳定后开始计算磁盘性能。
        ![](https://support.huaweicloud.com/usermanual-evs/zh-cn_image_0000001105009866.png "点击放大")
        
     
     3. 设置64 KB块写入，采用100%的顺序写。 ![](https://support.huaweicloud.com/usermanual-evs/zh-cn_image_0000001105009874.png "点击放大")
        
     
     4. 查看测试结果。 ![](https://support.huaweicloud.com/usermanual-evs/zh-cn_image_0000001105169704.png "点击放大")
        
     
     
     
     
   
- [Linux]
  
  CentOS 6.5等较老版本的操作系统用**fdisk**创建分区时，默认为非4KiB对齐选择初始磁柱编号，对性能有较大的影响，建议针对该类操作系统，在创建分区时4KiB对齐选取初始磁柱编号。
  本文以"CentOS 7.2 64位"操作系统为例，不同操作系统的格式化操作可能不同，本文仅供参考，具体操作步骤和差异请参考对应操作系统的产品文档。
  1. 以root用户登录云服务器。 
     登录弹性云服务器请参见[登录弹性云服务器](https://support.huaweicloud.com/ecs_faq/ecs_faq_0632.html)。
     登录裸金属服务器请参见[登录裸金属服务器](https://support.huaweicloud.com/usermanual-bms/bms_umn_0011.html)。
     
     
  
  2. 安装fio性能测试工具。 
     **yum install fio**
     
     
  
  3. 进行性能测试之前，请执行以下步骤，确认磁盘分区的初始磁柱编号是否已经4KiB对齐。 
     **fdisk -lu**
     回显类似如下信息：
     ```
     [root@ecs-centos sdc]# fdisk -lu
     Disk /dev/xvda: 10.7 GiB, 10737418240 bytes, 20971520 sectors
     Units = sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     Disk label type: dos
     Disk identifier: 0x7db77aa5
        Device Boot      Start         End      Blocks   Id  System
     /dev/xvda1   *        2048    20968919    10483436   83  Linux
     Disk /dev/xvdb: 10.7 GiB, 10737418240 bytes, 20971520 sectors
     Units = sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     Disk /dev/xvdc: 53.7 GiB, 53687091200 bytes, 104857600 sectors
     Units = sectors of 1 * 512 = 512 bytes
     Sector size (logical/physical): 512 bytes / 512 bytes
     I/O size (minimum/optimal): 512 bytes / 512 bytes
     Disk label type: dos
     Disk identifier: 0x3cf3265c
        Device Boot      Start         End      Blocks   Id  System
     /dev/xvdc1            2048    41943039    20970496   83  Linux
     ```
     - 如果start对应的初始磁柱编号能被8整除，则表示4KiB对齐，请执行[4]进行性能测试。
     
     - 如果start对应的初始磁柱编号不能被8整除，则表示未4KiB对齐，如需继续测试请删除原有分区，重新按照4KiB对齐选择初始磁柱编号。
       ![](https://support.huaweicloud.com/usermanual-evs/public_sys-resources/notice_3.0-zh-cn.png)
       删除分区并重新按照4KiB对齐选取初始磁柱编号会导致磁盘原有数据的丢失，请谨慎操作。
       
     
     
     
     
  
  4. 执行以下命令，使用fio工具测试磁盘性能。
     
     - 测试随机写IOPS：**fio** **-direct=** *1* **-iodepth=** *128* **-rw=** *randwrite* **-ioengine=** *libaio* **-bs=** *4k* **-size=** *10G* **-numjobs=** *1* **-runtime=** *600* **-group_reporting -filename=** */opt/fiotest/fiotest.txt* **-name=** *Rand_Write_IOPS_Test*
     
     - 测试随机读IOPS：**fio -direct=** *1* **-iodepth=** *128* **-rw=** *randread* **-ioengine=** *libaio* **-bs=** *4k* **-size=** *10G* **-numjobs=** *1* **-runtime=** *600* **-group_reporting -filename=** */opt/fiotest/fiotest.txt* **-name=** *Rand_Read_IOPS_Test*
     
     - 测试写吞吐量：**fio -direct=** *1* **-iodepth=** *32* **-rw=** *write* **-ioengine=** *libaio* **-bs=** *1024k* **-size=** *10G* **-numjobs=** *1* **-runtime=** *600* **-group_reporting -filename=** **/opt/fiotest/fiotest.txt** **-name=** *Write_BandWidth_Test*
     
     - 测试读吞吐量：**fio -direct=** *1* **-iodepth=** *32* **-rw=** *read* **-ioengine=** *libaio* **-bs=** *1024k* **-size=** *10G* **-numjobs=** *1* **-runtime=** *600* **-group_reporting -filename=** **/opt/fiotest/fiotest.txt** **-name=** *Read_BandWidth_Test*
     
     - 测试单队列随机读时延：**fio -direct=** *1* **-iodepth=** *1* **-rw=** *randread* **-ioengine** *=libaio* **-bs=** *4k* **-size=** *10G* **-numjobs=** *1* **-runtime=** *60* **-group_reporting -filename** **=** */opt/fiotest/fiotest.txt* **-name=** *Rand_Read_LATE_Test*
       测试fio相关参数说明如[表1]所示。
        表1参数说明 
       | 参数              | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                 |
       |:---|:---|
       | direct          | 定义是否使用direct IO，可选值如下： - 值为0，表示使用buffered IO  - 值为1，表示使用direct IO                                                                                                                                                                                                                               |
       | iodepth         | 定义测试时的IO队列深度。 此处定义的队列深度是指每个线程的队列深度，如果有多个线程测试，意味着每个线程都是此处定义的队列深度。fio总的IO并发数=iodepth \* numjobs。例如： - 单线程，且-iodepth=32，则该线程的IO队列深度为32，fio总的IO并发数=32\*1=32。  - 多线程（3个线程），且-iodepth=32，则3个线程的IO队列深度均为32，fio总的IO并发数=32\*3=96。                                          |
       | rw              | 定义测试时的读写策略，可选值如下： - 随机读：randread  - 随机写：randwrite  - 顺序读：read  - 顺序写：write  - 混合随机读写：randrw   |
       | ioengine        | 定义fio如何下发IO请求，通常有同步IO和异步IO： - 同步IO一次只能发出一个IO请求，等待内核完成后才返回。这样对于单个线程IO队列深度总是小于1，但是可以通过多个线程并发执行来解决。通常会用16\~32个线程同时工作把IO队列深度塞满。  - 异步IO则通常使用libaio这样的方式一次提交一批IO请求，然后等待一批的完成，减少交互的次数，会更有效率。                                                                                                    |
       | bs              | 定义IO的块大小(block size)，单位是k、K、m和M等，默认IO块大小为4 KB。                                                                                                                                                                                                                                                                                                                                                                                                                                     |
       | size            | 定义测试IO操作的数据量，如果未指定runtime这类参数，fio会将指定大小的数据量全部读/写完成，然后才停止测试。 该参数的值，可以是带单位的数字，比如size=10G，表示读/写的数据量为10GiB；也可是百分数，比如size=20%，表示读/写的数据量占该设备总文件的20%的空间。                                                                                                                                                                                                                                                                                                    |
       | numjobs         | 定义测试的并发线程数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                        |
       | runtime         | 定义测试时间。 如果未配置，则持续将size指定的文件大小，以每次bs值为分块大小读/写完。                                                                                                                                                                                                                                                                                                                                                                                                       |
       | group_reporting | 定义测试结果显示模式，group_reporting表示汇总每个进程的统计信息，而非以不同job汇总展示信息。                                                                                                                                                                                                                                                                                                                                                                                                                            |
       | filename        | 定义测试文件（设备）的名称。 - 此处选择文件，则代表测试文件系统的性能。例如：**-filename=/opt/fiotest/fiotest.txt**  - 此处选择设备名称，则代表测试裸盘的性能。例：**-filename=/dev/vdb** 须知： 如果在已经分区、并创建文件系统，且已写入数据的磁盘上进行性能测试，请注意filename选择指定文件，以避免覆盖文件系统和原有数据。                                                            |
       | name            | 定义测试任务名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                          |
          
       
     
     
     
     
   
#### 后续操作
- 测试完成后的新云硬盘，请按以下方式处理：
  - 若需保留：不可直接使用，请[重新初始化](https://support.huaweicloud.com/usermanual-evs/evs_01_0058.html)。
  
  - 若无需保留：请[卸载并删除云硬盘](https://support.huaweicloud.com/usermanual-evs/evs_01_0002.html)。
   
 
#### 相关文档
- [磁盘类型及性能介绍](https://support.huaweicloud.com/productdesc-evs/zh-cn_topic_0044524691.html#zh-cn_topic_0044524691__table1551915301484)。

- [如何提升云硬盘的性能](https://support.huaweicloud.com/evs_faq/evs_faq_0072.html)。
 
