
# 怎样测试磁盘的性能
#### 操作须知
测试性能时，若分区的初始磁柱编号是非4KB对齐，则对性能影响较大，请先确保分区的初始磁柱编号已经4KB对齐，再开始测试。
![](https://support.huaweicloud.com/dss_faq/public_sys-resources/note_3.0-zh-cn.png)
测试共享云硬盘性能时，必须满足以下要求：
- 共享云硬盘必须同时挂载至多台云服务器（弹性云服务器或者裸金属服务器）。
- 当共享云硬盘挂载至多台弹性云服务器时，这些弹性云服务器必须位于同一个策略为"反亲和性"的云服务器组内。 如果弹性云服务器不满足反亲和性，则共享云硬盘性能无法达到最优。
  
 
测试方法分为以下两种：
- [Windows]
- [Linux]
如果测试结果不符合预期，请参考[使用fio工具测试性能，测试结果不对怎么办](https://support.huaweicloud.com/evs_faq/evs_faq_0080.html)。
 #### Windows
本文以"Windows 7 Professional 64位"操作系统为例，不同操作系统的格式化操作可能不同，本文仅供参考，具体操作步骤和差异请参考对应操作系统的产品文档。
测试性能前请先安装Iometer性能测试工具，Iometer官网地址为<http://www.iometer.org/> 。
1. 登录云服务器。
2. 使用"win+r"组合键打开运行窗口，并输入"msinfo32"，单击"确定"。 
   弹出系统信息窗口。
   
   
3. 选择"组件 \> 存储 \> 磁盘"，在右侧区域查看分区起始偏移值。 
   - 若4096能被该参数值整除，则表示已经4KB对齐，请执行[4]。
   
   - 若4096不能被该参数值整除，则表示未4KB对齐，如需继续测试请重新按照4KB对齐分区。
     ![](https://support.huaweicloud.com/dss_faq/public_sys-resources/notice_3.0-zh-cn.png)
     删除分区并重新按照4KB对齐选取初始磁柱编号时会导致磁盘原有数据的丢失，请谨慎操作。
     
   
   
   
   
4. 使用Iometer工具测试磁盘性能，具体方法请参见Iometer产品文档。
   
   在进行IOPS和吞吐量测试时，Iometer参数配置和fio工具的参数相同，具体请参考[表1]。
   以下为使用Iometer工具测试磁盘性能的一个示例：
   1. 设置工作流。 ![](https://support.huaweicloud.com/dss_faq/zh-cn_image_0000001151849605.png "点击放大")
      
   
   2. 设置测试时间。 示例中测试时间为10分钟，前60秒不做计算，等待写入稳定后开始计算磁盘性能。
      ![](https://support.huaweicloud.com/dss_faq/zh-cn_image_0000001105009866.png "点击放大")
      
   
   3. 设置64 KB块写入，采用100%的顺序写。 ![](https://support.huaweicloud.com/dss_faq/zh-cn_image_0000001105009874.png "点击放大")
      
   
   4. 查看测试结果。 ![](https://support.huaweicloud.com/dss_faq/zh-cn_image_0000001105169704.png "点击放大")
      
   
   
   
   
 
 #### Linux
CentOS 6.5等较老版本的操作系统用**fdisk**创建分区时，默认为非4KB对齐选择初始磁柱编号，对性能有较大的影响，建议针对该类操作系统，在创建分区时4KB对齐选取初始磁柱编号。
本文以"CentOS 7.2 64位"操作系统为例，不同操作系统的格式化操作可能不同，本文仅供参考，具体操作步骤和差异请参考对应操作系统的产品文档。
测试性能前请先安装fio性能测试工具。
1. 登录云服务器并切换为root用户。
2. 进行性能测试之前，请执行以下步骤，确认磁盘分区的初始磁柱编号是否已经4KB对齐。 
   **fdisk -lu**
   回显类似如下信息：
   ```
   [root@ecs-centos sdc]# fdisk -lu
   Disk /dev/xvda: 10.7 GB, 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 GB, 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 GB, 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整除，则表示4KB对齐，请执行[3]进行性能测试。
   
   - 若start对应的初始磁柱编号不能被8整除，则表示未4KB对齐，如需继续测试请删除原有分区，重新按照4KB对齐选择初始磁柱编号。
     ![](https://support.huaweicloud.com/dss_faq/public_sys-resources/notice_3.0-zh-cn.png)
     删除分区并重新按照4KB对齐选取初始磁柱编号会导致磁盘原有数据的丢失，请谨慎操作。
     
   
   
   
   
3. 执行以下命令，使用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*
     ![](https://support.huaweicloud.com/dss_faq/public_sys-resources/notice_3.0-zh-cn.png)
     - 使用fio工具进行裸盘性能测试时，不能在已创建文件系统的磁盘上测试，因为fio性能测试会破坏文件系统，导致磁盘变为只读，需要删除后重新购买。
     
     - 请尽量不要在保存业务数据的磁盘上进行测试。如果需要，请按照以下建议操作：
       - 在测试开始前对磁盘数据进行备份，防止误操作造成数据丢失。
       
       - 在测试命令中指定**filename** 参数为某个文件，例如**-filename=/opt/fiotest/fiotest.txt**。
        
      
     测试fio相关参数说明如[表1]所示。
      表1参数说明 
     | 参数              | 说明                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                     |
     |:---|:---|
     | direct          | 定义是否使用direct IO，可选值如下： - 值为0，表示使用buffered IO  - 值为1，表示使用direct IO                                                                                                                                                                                                                                                                                                                                                                         |
     | iodepth         | 定义测试时的IO队列深度，默认为1。 此处定义的队列深度是指每个线程的队列深度，如果有多个线程测试，意味着每个线程都是此处定义的队列深度。fio总的IO并发数=iodepth \* numjobs。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                               |
     | 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，表示读/写的数据量为10GB；也可是百分数，比如size=20%，表示读/写的数据量占该设备总文件的20%的空间。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   |
     | numjobs         | 定义测试的并发线程数。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            |
     | runtime         | 定义测试时间。 如果未配置，则持续将size指定的文件大小，以每次bs值为分块大小读/写完。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                    |
     | group_reporting | 定义测试结果显示模式，group_reporting表示汇总每个进程的统计信息，而非以不同job汇总展示信息。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                |
     | filename        | 定义测试文件（设备）的名称。 - 此处选择文件，则代表测试文件系统的性能。例如：**-filename=/opt/fiotest/fiotest.txt**  - 此处选择设备名称，则代表测试裸盘的性能。例：**-filename=/dev/vdb1** 须知： 如果在已经分区、并创建文件系统，且已写入数据的磁盘上进行性能测试，请注意filename选择指定文件，以避免覆盖文件系统和原有数据。                                                                                                                                                                              |
     | name            | 定义测试任务名称。                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                              |
        
     
   
   
   
   
 
