You need to enable JavaScript to run this app.
导航

测试本地盘性能

最近更新时间2024.03.04 14:32:46

首次发布时间2023.12.14 11:09:40

本文介绍如何在Linux实例中使用FIO工具测试本地盘存储性能,包括IO延迟、IOPS和吞吐量。

背景信息

推荐使用FIO工具测试本地盘性能,FIO是一个对硬件进行压力测试和验证的I/O工具,是一款Linux平台上较为推荐的本地盘性能测试工具。
FIO分为两种运行方式,本文中测试示例均使用fio jobfile方式,即通过一个job文件来描述待访真的IO负载,一个job文件可以控制产生任意数目的线程和文件,典型的job文件包含一个global段(定义共享参数)和一个或多少job段(描述具体要产生的job)。

前提条件

您已经创建了待测试的本地盘实例。本地盘相关介绍及其标准性能数据请参见本地盘,如何创建实例请参见通过向导购买实例

注意

建议您只在新购买的无数据的ECS实例上使用工具测试本地盘性能,避免造成数据丢失。

操作步骤

  1. 登录Linux实例

  2. FIO官网下载安装包并传输到实例。数据上传操作请参见本地数据上传

    1. 执行以下命令解压缩安装包。
      tar -zxvf fio-*.tar.gz
    2. 执行以下命令,安装FIO。
      cd fio-*
      ./configure
      make
      make install
      
    3. 依次执行以下命令,安装libaio。
      sudo yum -y install libaio
      sudo yum -y install libaio-devel
      
  3. 执行以下命令查看存储设备是否已经4KiB对齐。如果不是4KiB对齐,则对性能影响较大。
    fdisk -lu
    如果返回的Start值能够被8整除则表示4KiB对齐。

  4. 执行以下命令,切换路径。
    cd /tmp

  5. 运行本地盘性能测试命令,命令示例请参见测试命令示例

  6. 若压测时出现NMI watchdog: BUG: soft lockup - xxx错误,可根据在Linux操作系统中调整use_threaded_interrupts参数指引,开启中断线程化提高实时性能和响应性。

测试命令示例

以下测试命令适用于NVMe SSD本地盘和SATA HDD本地盘。

说明

  • 本示例中,使用的设备名为/dev/your_device,请您根据实际情况替换。例如需要测试的本地盘为/dev/vdb,则将以下示例命令中的/dev/your_device替换为/dev/vdb。
  • 命令示例中的参数取值仅供参考,请您根据实际情况替换。参数介绍请参见FIO参数说明

测试IOPS

  • 随机读

    fio --group_reporting=1 --direct=1 --iodepth=32 --rw=randread --ioengine=libaio --bs=4k --size=100% --numjobs=8 --runtime=600 --filename=/dev/your_device --name=test
    
  • 随机写

    fio --group_reporting=1 --direct=1 --iodepth=32 --rw=randwrite --ioengine=libaio --bs=4k --size=100% --numjobs=8 --runtime=600 --filename=/dev/your_device --name=test
    

测试吞吐量

  • 顺序读

    fio --group_reporting=1 --direct=1 --iodepth=128 --rw=read --ioengine=libaio --bs=128k --size=100% --numjobs=1 --runtime=600 --filename=/dev/your_device --name=test
    
  • 顺序写

    fio --group_reporting=1 --direct=1 --iodepth=128 --rw=write --ioengine=libaio --bs=128k --size=100% --numjobs=1 --runtime=600 --filename=/dev/your_device --name=test
    

测试访问时延

  • 随机读

    fio --group_reporting=1 --direct=1 --iodepth=1 --rw=randread --ioengine=libaio --bs=4k --size=100% --numjobs=1 --runtime=600 --filename=/dev/your_device --name=test
    
  • 随机写

    fio --group_reporting=1 --direct=1 --iodepth=1 --rw=randwrite --ioengine=libaio --bs=4k --size=100% --numjobs=1 --runtime=600 --filename=/dev/your_device --name=test
    

FIO参数说明

参数说明

group_reporting

测试结果显示模式。
如果指定该参数,测试结果会汇总每个进程的统计信息,而不是以不同任务来统计信息。

direct

是否使用direct I/O,取值:

  • 1(默认):使用direct I/O,忽略I/O缓存,数据直写。
  • 0:不使用direct I/O。
iodepth测试时的IO队列深度,例如-iodepth=128表示FIO控制请求中的I/O最大个数为128。

rw

测试时的读写策略,取值:

  • randwrite:随机写。
  • randread:随机读。
  • read:顺序读。
  • write:顺序写。
  • randrw:混合随机读写。
ioengine测试时FIO选择哪种I/O引擎。通常选择libaio,更符合日常应用模式。
bsI/O单元的块大小(block size),默认值:4 KiB。
读取和写入的值可以以read、write格式单独指定,其中任何一个都可以为空以将该值保留为其默认值。

size

测试文件的大小。FIO会将指定的文件大小全部读/写完成,然后才停止测试,除非受到其它选项(例如运行时)的限制。
如果未指定该参数,FIO将使用给定文件或设备的完整大小;也可以将大小作为1到100之间的百分比给出,例如指定size=20%,FIO将使用给定文件或设备完整大小的20%空间。

numjobs测试的并发线程数,默认值:1。

runtime

测试时间,即FIO运行时长。
如果未指定该参数,则FIO会持续将上述size指定大小的文件,以每次bs值为块大小读/写完。

filename待测试的对象路径,路径可以是存储设备名称或者一个文件地址。本文中的FIO测试全部是以整盘为测试对象,不含文件系统,即裸盘测试。同时为了避免误测试到其他盘导致数据被破坏,本示例地址为/dev/your_device,请您正确替换。
name测试任务名称,可以随意设定,例如本示例的test

有关各参数的更多说明,请参见FIO文档