更新时间:2024-04-24 GMT+08:00

怎样测试磁盘的性能

操作须知

测试性能时,如果分区的初始磁柱编号是非4KiB对齐,则对性能影响较大,请先确保分区的初始磁柱编号已经4KiB对齐,再开始测试。

测试共享云硬盘性能时,必须满足以下要求:
  • 共享云硬盘必须同时挂载至多台云服务器(弹性云服务器或者裸金属服务器)。
  • 当共享云硬盘挂载至多台弹性云服务器时,这些弹性云服务器必须位于同一个策略为“反亲和性”的云服务器组内。

    如果弹性云服务器不满足反亲和性,则共享云硬盘性能无法达到最佳。

测试方法分为以下两种:

如果测试结果不符合预期,请参考使用fio工具测试性能,测试结果不对怎么办

Windows

本文以“Windows Server 2019 标准版 64位”操作系统为例,不同操作系统的操作可能不同,本文仅供参考,具体操作步骤和差异请参考对应操作系统的产品文档。

测试性能前请先安装Iometer性能测试工具,Iometer官网地址为http://www.iometer.org/

  1. 登录云服务器。
  2. 使用“win+r”组合键打开运行窗口,并输入“msinfo32”,单击“确定”。

    弹出系统信息窗口。

  3. 选择“组件 > 存储 > 磁盘”,在右侧区域查看分区起始偏移值。

    • 如果4096能被该参数值整除,则表示已经4KiB对齐,请执行4
    • 如果4096不能被该参数值整除,则表示未4KiB对齐,如需继续测试请重新按照4KiB对齐分区。

      删除分区并重新按照4KiB对齐选取初始磁柱编号时会导致磁盘原有数据的丢失,请谨慎操作。

  4. 使用Iometer工具测试磁盘性能,具体方法请参见Iometer产品文档。

    在进行IOPS和吞吐量测试时,Iometer参数配置和fio工具的参数相同,具体请参考表1

    以下为使用Iometer工具测试磁盘性能的一个示例:

    1. 设置工作流。

    2. 设置测试时间。

      示例中测试时间为10分钟,前60秒不做计算,等待写入稳定后开始计算磁盘性能。

    3. 设置64 KB块写入,采用100%的顺序写。

    4. 查看测试结果。

Linux

CentOS 6.5等较老版本的操作系统用fdisk创建分区时,默认为非4KiB对齐选择初始磁柱编号,对性能有较大的影响,建议针对该类操作系统,在创建分区时4KiB对齐选取初始磁柱编号。

本文以“CentOS 7.2 64位”操作系统为例,不同操作系统的格式化操作可能不同,本文仅供参考,具体操作步骤和差异请参考对应操作系统的产品文档。

测试性能前请先安装fio性能测试工具。

  1. 登录云服务器并切换为root用户。
  2. 进行性能测试之前,请执行以下步骤,确认磁盘分区的初始磁柱编号是否已经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对齐,请执行3进行性能测试。
    • 如果start对应的初始磁柱编号不能被8整除,则表示未4KiB对齐,如需继续测试请删除原有分区,重新按照4KiB对齐选择初始磁柱编号。

      删除分区并重新按照4KiB对齐选取初始磁柱编号会导致磁盘原有数据的丢失,请谨慎操作。

  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
      • 使用fio工具进行裸盘性能测试时,不能在已创建文件系统的磁盘上测试,因为fio性能测试会破坏文件系统,导致磁盘变为只读,需要删除后重新购买。
      • 请尽量不要在保存业务数据的磁盘上进行测试。如果需要,请按照以下建议操作:
        • 在测试开始前对磁盘数据进行备份,防止误操作造成数据丢失。
        • 在测试命令中指定filename参数为某个文件,例如-filename=/opt/fiotest/fiotest.txt

      测试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

      定义测试任务名称。