fio工具

本文详细介绍了FIO工具在硬件存储性能测试中的应用,包括安装方法、参数解释以及实例演示。重点讲解了如何通过调整参数如直接IO、队列深度和IO引擎来评估磁盘性能,以及如何监控关键指标如IOWait%和磁盘队列长度等。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

IO 工具是一款用于测试硬件存储性能的辅助工具,兼具灵活性、可靠性。磁盘的 I/O 是衡量硬件性能的最重要的指标之一,而 FIO 工具通过模拟 I/O负载对存储介质进行压力测试,并将存储介质的 I/O 数据直观的呈现出来。

根据实际业务的场景,一般将 I/O 的表现分为四种场景,随机读、随机写、顺序读、顺序写。FIO 工具允许指定具体的应用模式,配合多线程对磁盘进行不同深度的测试。

1、安装fio工具包到待测试服务器上

方法一:rpm -i ./fio-2.12-1.fc25.x86_64.rpm

如果报错依赖包告警,可以强制安装rpm -ivh ./fio-2.12-1.fc25.x86_64.rpm --nodeps --force

image.png

方法二:在fio官网下载fio-2.1.10.tar文件,解压后./configure、make、make install

2、fio参数解释

nameFIO 运行任务的名称 (可选)

filename=/dev/sdc1

测试设备名称,通常选择设备名/dev/sdc或挂载点下的文件。

-direct=1

使用direct IO,测试过程绕过OS自带的buffer,结果更加真实。

-rw=read

IO模型:

·  read - 顺序读                           ·  write - 顺序写                    ·  trim - 顺序裁剪

·  randread - 随机读                    ·  randwrite - 随机写            ·  randtrim - 随机裁剪

·  rw, readwrite - 混合顺序读写   ·  randrw - 混合的随机读写   ·  trimwrite - 顺序的裁剪 + 顺序写

-bs=4K

单次IO大小

-size=100G

指定单个线程读写的数据量

-iodepth

IO队列深度

-ioengine

指定IO引擎的方式:

libaio - Linux 原生的异步 I/O,这也是通常我们这边用的最多的测试盘吞吐和延迟的方法

psync是使用同步方式,用多线程模拟同时批量给内核提交IO请求,线程中一个IO提交完成后才能提交下一个IO

libaio采用Kernel Native AIO可以达到单次批量给内核提交IO请求的目的,相比psync的多线程,libaio的开销更小,性能更好,更加合适评估内核块子系统的性能

·  sync - 也就是最通常的 read / write 操作

·  vsync - 使用 readv / writev,主要是会将相邻的 I/O 进行合并

·  psync - 对应的 pread / pwrite

·  pvsync / pvsync2 - 对应的 preadv / pwritev,以及 preadv2 / p writev2

-thread  

使用pthread_create创建线程,另一种是fork创建进程。进程的开销比线程要大,一般都采用thread测试。

-numjobs=1

每个任务的线程数

-name=sqe_100read_4k

指定的任务名称

-runtime

测试时间/s

-group_reporting

显示结果中汇总每个进程的信息,不会输出每个线程的信息,易于查看。

-runtime=1000

测试时间为1000秒,如果不设置则一直将100g文件分4k每次,写完为止

3、实例

对硬盘施压时,需要先定位施压的硬盘,比如sdb

fio --name=test --filename=/dev/sdb --ioengine=libaio --direct=1 --bs=1024k --iodepth=192 --rw=randread --runtime=604800 --time_based

FIO任务名称test,测试设备sdb,引擎方式libaio,使用direct绕过buffer,大小为1024k,IO队列深度192,随机读,测试时间604800

如果压力不够,可以修改队列

cat /sys/block/sdb/queue/nr_requests

echo 1024 > /sys/block/sdb/queue/nr_requests

查看压力情况

iostat -x 1 /dev/sdb

[tecs@host-69 ~]$ fio -name=test -filename=/dev/sdi -ioengine=libaio -direct=1 -bs=8k -iodepth=16 -rw=randread -runtime=604800 -time_based
[root@host-69 tecs]# iostat -x 1 /dev/sdi
Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdi               0.00     0.00  258.00    0.00  2064.00     0.00    16.00    16.01   62.00   62.00    0.00   3.88 100.10

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           2.23    0.00    1.76    0.00    0.00   96.01

Device:         rrqm/s   wrqm/s     r/s     w/s    rkB/s    wkB/s avgrq-sz avgqu-sz   await r_await w_await  svctm  %util
sdi               0.00     0.00  266.00    0.00  2128.00     0.00    16.00    16.00   61.45   61.45    0.00   3.76 100.00

以上各列的含义如下:

rrqm/s: 每秒对该设备的读请求被合并次数,文件系统会对读取同块(block)的请求进行合并

wrqm/s: 每秒对该设备的写请求被合并次数

r/s: 每秒完成的读次数

w/s: 每秒完成的写次数

r*B/s: 每秒读数据量(*B为单位)

w*B/s: 每秒写数据量(*B为单位)

avgrq-sz:平均每次IO操作的数据量(扇区数为单位),每个请求平均大小,单位是扇区数,一般在200~400之间算是正常和理想的状态,如果这个值比较小,比方说只在100左右,

这里可以测试一下看fio哪个参数可以影响avgrq-sz

avgqu-sz: 平均等待处理的IO请求队列长度(肯定约低越好)

await: 平均每次IO请求等待时间(包括等待时间和处理时间,毫秒为单位)

svctm: 平均每次IO请求的处理时间(毫秒为单位)

%util: 采用周期内用于IO操作的时间比率,即IO队列非空的时间比率(越低越好,越高性能约差)

 %user:在用户级别运行所使用 CPU 的百分比。

   %nice:nice操作所使用 CPU 的百分比。

   %system:在系统级别(kernel)运行所使用 CPU 的百分比。

   %iowait:CPU等待硬件 I/O 时,所占用 CPU 百分比。

   %steal:管理程序维护另一个虚拟处理器时,虚拟CPU的无意识等待时间百分比。

   %idle:CPU 空闲时间的百分比。

 重点关注参数

1、iowait% 表示CPU等待IO时间占整个CPU周期的百分比,如果iowait值超过50%,或者明显大于%system、%user以及%idle,表示IO可能存在问题。

2、avgqu-sz 表示磁盘IO队列长度,即IO等待个数。

3、await 表示每次IO请求等待时间,包括等待时间和处理时间

4、svctm 表示每次IO请求处理的时间

5、%util 表示磁盘忙碌情况,一般该值超过80%表示该磁盘可能处于繁忙状态。

如果压力不够,可以修改队列

cat /sys/block/sdb/queue/nr_requests

echo 1024 > /sys/block/sdb/queue/nr_requests

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值