共计 3787 个字符,预计需要花费 10 分钟才能阅读完成。
概述
Fio(Flexible I/O Tester)是一款由 Axboe 开发的一款开源磁盘 I / O 性能测试工具,目前支持 Linux 及 Windows 平台,目前已发布的最新版本为 3.38。Fio 允许你生成许多线程或进程,执行指定的特定类型的 I / O 操作来模拟不同的 I / O 负载场景。Fio 接受多个全局参数,每个参数都由线程继承,除非提供给它们的参数覆盖了给定的设置。
主要特性
- 支持多种 I / O 引擎:fio 支持 40+ 种不同类型的 I / O 引擎,如 sync、mmap、libaio、posixaio、SG v3、splice等,这些引擎允许在不同的平台和场景下进行精确的 IO 测试。
- 灵活的配置选项:fio 提供了丰富的配置选项,可以定制各种测试模式,包括测试文件的读写模式(如随机读、随机写、顺序读、顺序写等)、块大小、测试时间、IO 队列深度等。
- 多线程支持:fio 是一个多线程的 IO 生成工具,可以生成多种 IO 模式,以测试磁盘设备的性能。
- 详细的性能报告:fio 测试结果包含了丰富的性能数据,如 IOPS、带宽、延迟等,帮助用户深入了解存储系统的性能表现。
应用场景
- 评估存储系统(如磁盘、SSD、RAID 阵列等)的 I / O 性能。
- 评估文件系统的性能。
- 测试服务器和存储设备的压力承受能力。
- 在产品发布前进行性能验证和调优。
安装 FIO
Linux 平台安装(在线安装)
# yum install fio
Linux 平台安装(源码包方式)
下载 fio 源码 / 安装包 https://github.com/axboe/fio/releases
# ./configure
# make
# make install
编译安装后,可以直接在 Linux 命令行上执行:fio - v 命令查看 Fio 是否安装成功,同时也可以判断已安装的版本是否符合预期。
# fio -v
Windows 平台安装(安装程序方式)
双击运行下载的文件即可:fio-3.38-x64.msi
所有的步骤均为默认,默认的安装路径为:C:\Program Files\fio 安装完成后,打开一个 cmd 窗口,执行:
fio -v
压测参数详解
运行 fio 通常是最简单的部分 - 你只需要将作业文件 (或作业文件) 作为参数:
$ fio [options] [jobfile] ...
基本参数
- –filename:指定测试文件的名称或路径,支持文件系统或裸设备。例如,-filename=/dev/sdb 表示测试 /dev/sdb 设备。
- –direct:是否使用 directIO,即绕过系统缓存进行测试。例如,-direct= 1 表示使用 directIO。
- –rw:指定读写模式,包括顺序读(read)、顺序写(write)、随机读(randread)、随机写(randwrite)、混合读写(randrw)等。
- –bs:单次 I / O 操作的块文件大小,单位为 KB、MB 等。例如,-bs=4k 表示块大小为 4KB。
- –size:测试文件的大小,单位为 GB、MB 等。例如,-size=5G 表示测试文件大小为 5GB。
- –numjobs:测试任务的数量,即并发测试的线程数或进程数。例如,-numjobs=30 表示启动 30 个测试任务。
- –runtime:测试时间,单位为秒。如果不指定,则测试将持续进行直到达到指定的文件大小。
高级参数
- –ioengine:指定 I / O 引擎,如 libaio(Linux 本地异步 I /O)、psync 等。例如,-ioengine=libaio。
- –iodepth:队列深度,即 I / O 请求的并发数。在异步模式下,此参数控制 CPU 可以同时发出的 I / O 请求数量。
- –rwmixwrite:在混合读写模式下,写操作所占的百分比。例如,-rwmixwrite=30 表示写操作占 30%。
- –group_reporting:汇总每个进程或线程的信息,以便更清晰地查看测试结果。
- –lockmem:限制测试过程中使用的内存量。例如,-lockmem=1g 表示只使用 1GB 内存进行测试。
- –zero_buffers:用 0 初始化系统缓冲区,以避免缓存对测试结果的影响。
使用文件指定参数
除了在命令行环境下直接制定参数外,你还可以事先准备好一个 fio 文件,用于定义任务名称和参数,然后使用 fio 直接解析此文件并执行:
文件格式和一个示例:
[global]
filename=/opt/testfile
direct=1
size=1G
iodepth=32
runtime=60
time_based
[read]
rw=randread
bs=4k
[write]
rw=randwrite
bs=4k
然后你可以执行如下命令来执行一次磁盘 I / O 压测:
sudo fio /opt/testfile
Fio 压测实例
随机写
Linux 环境下测试 /dev/sdb 设备的随机写性能,使用 directIO,块大小为 4KB,使用默认的 I / O 引擎,测试文件大小为 5GB,并发测试线程数为 8,并生成详细的测试报告:
fio --filename=/dev/sda --direct=1 --rw=randwrite --bs=4k --size=5G --numjobs=8 --group_reporting --name=test-rand-writ
顺序读
Linux 环境下测试 /dev/sda 设备的顺序读性能,使用 directIO,块大小为 1MB,使用的 I / O 引擎为 bibaio,测试文件大小为 5GB,并发测试线程数为 8,并生成详细的测试报告:
fio --filename=/dev/sda --direct=1 --rw=read --bs=1M --size=5G -ioengine=libaio --numjobs=16 --group_reporting --name=test-seq-read
读写混合
Linux 环境下测试 /dev/sda 设备的混合读写性能,读操作占 70%,写操作占 30%,使用 directIO,块大小为 4KB,使用的 I / O 引擎为 mmap,测试文件大小为 5GB,并发测试线程数为 8,并生成详细的测试报告:
fio --filename=/dev/sda --direct=1 --rw=randrw --rwmixread=70 --bs=4k --size=5G –ioengine=psync --numjobs=8 --group_reporting --name=test-randrw
Windows 环境演示
Windows 下测试 D 分区的顺序读性能,使用 directIO,块大小为 1MB,使用的 I / O 引擎为 windowsaio,测试文件大小为 5GB,并发测试线程数为 8,并生成详细的测试报告。
fio --filename=d: --direct=1 --rw=read --bs=1M --size=5G -ioengine=windowsaio --numjobs=8 --group_reporting --name=test-seq-read
输出结果
测试结果解读
磁盘 I / O 测试的核心指标
- –read/write bandwidth: 表示读 / 写的带宽,通常以 MB/s(兆字节 / 秒)为单位。
- –iops: 表示每秒可以完成的输入 / 输出操作数。
- –lat: 表示平均延迟,即完成一个 IO 操作所需的平均时间,通常以毫秒(ms)或微秒(μs)为单位。
- –clat: 客户端延迟,从客户端发起请求到收到响应的时间。
- –slat: 服务器端延迟,服务器处理请求的时间。
- –latency (lat): 表示完成一次输入 / 输出操作所需的平均时间。单位通常是毫秒 (ms) 或微秒 (μs)。
具体测试结果中的关键部分
- –job=<job_name>: 每个作业名称,标识特定的测试配置。
- –groupid=<group_name>, 2024-10-11 22:30:00 (local), 2024-10-11 22:30:00 (UTC): 测试开始的时间戳。
- –read: 结果中通常会有读取操作的结果。
- –write: 结果中通常会有写入操作的结果。
- –bw=<value>: 表示带宽。
- –iops=<value>: 表示每秒输入 / 输出操作数。
- –bw_min=, bw_max=, bw_agg=: 分别表示最小带宽、最大带宽和聚合带宽。
- –iops_min=, iops_max=, iops_agg=: 分别表示最小 IOPS、最大 IOPS 和聚合 IOPS。
- –run_time=<value>: 表示测试运行的时间长度。
- –lat nsecnsec=<value>: 表示延迟,单位为纳秒 (ns)。
- –clat nsecnsec=<value>: 表示客户端延迟,即从客户端发出请求到接收到响应的时间
- –clat min=, clat max=, clat mean=, clat stdev=: 分别表示客户端延迟的最小值、最大值、平均值和标准差。
- –slat nsecnsec=<value>: 表示服务器端延迟,即服务器处理请求的时间。
- –slat min=, slat max=, slat mean=, slat stdev=: 分别表示服务器端延迟的最小值、最大值、平均值和标准差。
- –lat nsecnsec=<value>: 表示总的延迟,包含客户端和服务器端的延迟。
- –lat min=, lat max=, lat mean=, lat stdev=: 分别表示总延迟的最小值、最大值、平均值和标准差。