存储设备与总线性能测试工具 Fio

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/engrossment/article/details/100033300

本博客前面介绍的读写性能测试工具 Bonnie:https://blog.csdn.net/engrossment/article/details/83833287 以及 Bonnie++:https://blog.csdn.net/engrossment/article/details/84137801

Fio是一款 IO 性能测试工具,可用于测试CPU、网络及存储等多种设备的性能数据,它是一款工具,也是一个测试框架,支持用户编写自己的测试插件。Github 仓库地址:https://github.com/axboe/fio

交叉编译

在 x86 PC 上编译:

HOST# ./configure
HOST# make

即可得到可执行程序 fio,运行使用即可。

交叉编译在 ARM 平台使用的 fio,以下以广州创龙 TL5728-EasyEVM 为例:

TARGET# source ~/57x/ti-processor-sdk-linux-rt-am57xx-evm-04.03.00.05/linux-devkit/environment-setup
TARGET# ./configure
TARGET# make CROSS_COMPILE=arm-linux-gnueabihf-
TARGET# file fio

最后可以看到生成的 fio 可执行程序的属性。Fio 的跨平台特性做得非常好。

Fio常用参数介绍

  • Fio 命令格式

fio  -filename=str  -ioengine=str  -iodepth=int   -iodepth_batch=int  -iodepth_low=int  -iodepth_batch_complete=int  -direct=int  -rw=str  -bs=str  -size=str  -numjobs=int  -thread  -group_reporting  -allow_mounted_write=int  -name=str  -userspace_reap  -ramp_time=int

  • filename

filename=str,待测试的储存设备节点。e.g.:-filename=/dev/sda。

  • ioengine

ioengine=libaio,I/O测试引擎,定义测试任务向设备发起I/O的方式。

  • I/O深度

iodepth=int,异步I/O引擎使用的队列深度值,默认值为1。

Fio工具中iodepth配置的是整个测试任务所有线程的总队列深度值,如果线程数量numjobs配置成4,队列深度iodepth配置成128,那么,每个线程使用的队列深度为128/4=32。

  • iodepth_batch

iodepth_batch=int,一次提交的I/O数量,默认值是iodepth。

  • iodepth_batch_complete

iodepth_batch_complete=int,定义了一次检索多少个I/O数量,默认值为1。

  • iodepth_low

iodepth_low=int,设置下次开始填充I/O阀值,默认值是iodepth。

libaio引擎调用io_setup准备可以存放iodepth个I/O请求的队列。在压力测试进行过程中,系统会生成特定的I/O请求,往I/O请求队列里面扔,当队列里面的I/O请求个数达到iodepth_batch值的时候,就调用io_submit批次提交请求,然后调用io_getevents开始处理已经完成的I/O。由于处理超时时间设置为0,所以完成多少个就处理多少个,最多可以处理iodepth_batch_complete值个。随着处理,I/O队列里面的请求数就减少,当I/O数目降到iodepth_low值的时候,就重新填充,保证OS可以看到至少iodepth_low数目的I/O请求在排队。

如果I/O引擎是异步的,需要指定测试需要保持的队列深度,默认对于每个文件来说是1,可以设置一个更大的值降低填队列充次数,提高I/O请求处理效率。

  • I/O操作模式

direct=int,是否采用non-buffered io方式操作I/O。

参数为1,则标明采用non-buffered io方式操作I/O,同O_DIRECT效果一样,不使用I/O缓存,直接读写I/O。参数为0,则标明采用buffered io。

  • I/O操作类型

rw=str,向文件发起的I/O操作类型,rw=read为顺序读,rw=write为顺序写。

  • bs(Block Size)

bs=int,I/O单元的大小。

可以是一个孤立的值,也可以是一个范围。单次I/O的block size,默认值为4k。如果是单个值的话,将会对读写都生效。如果是一个逗号,再跟一个int值的话,则是仅对于写有效。

bs = 8k读写都使用8k的块。

bs = 4k,8k读使用4k的块,写使用8k的块。

bs = ,8k写采用8k的块,读采用默认的值(4k)。

  • size

size=int,每个线程读/写数据量。如果线程数numjobs配成4,size配成1G,那么总测试数量=4 * 1G = 4G。

size选项一定要给出,可以是一个固定值,也可以给出一个1到100的百分比。e.g.: size=20%,Fio每个线程将会使用设备的20%的空间进行测试。

  • 线程/进程数

numjobs=int,创建大量的线程/进程来执行同一件事。

Fio默认使用进程测试,如果配置thread,则使用线程。

  • thread

thread,Fio使用线程测试模式。

  • group_reporting

group_reporting,以报告形式打印总测试结果。

  • name

name=str,任务名称,可随机命名,不可缺。

  • allow_mounted_write

allow_mounted_write=int,设置为1,允许对储存设备进行写入数据,设置为0,不允许进行写入测试。

  • userspace_reap

提高异步I/O收割的速度。

  • ramp_time

ramp_time=int,单位秒,设定在记录任何性能信息之前要运行特定负载的时间。这个用来等性能稳定后,再记录日志结果,以免开始测试时虚高数据也统计到性能中。

测试命令实例

考虑到不同数据总线、存储外设的特点不同,需使用不一样的测试配置。

适用于 Micro SD、eMMC、NAND 的数据读取带宽(吞吐量)测试如下。写入测试把 -rw 配置为 write 即可。

TARGET#  fio  -filename=/dev/mmcblk0  -ioengine=libaio  -iodepth=1   -iodepth_batch=1  -iodepth_low=1  -iodepth_batch_complete=1  -direct=1  -rw=read  -bs=1024K  -size=100M  -numjobs=1  -thread  -group_reporting  -name=read_job  -userspace_reap  -ramp_time=1

适用于 USB、SATA、PCIe 的数据读取带宽(吞吐量)测试如下。写入测试把 -rw 配置为 write 即可。其中 USB、PCIe 总线测试可以通过转接线、转接板转为外接性能强劲的 SSD 固态硬盘,进行测试。

TARGET#  fio  -filename=/dev/sda  -ioengine=libaio  -iodepth=128   -iodepth_batch=128  -iodepth_low=128  -iodepth_batch_complete=128  -direct=1  -rw=read  -bs=1024K  -size=1G  -numjobs=4  -thread  -group_reporting  -name=read_job  -userspace_reap  -ramp_time=1

2019年8月27日

展开阅读全文

没有更多推荐了,返回首页