fio是一个广泛使用的磁盘性能测试工具,功能强大,可以用于测试磁盘性能,也可以通过I/O重放来模拟用户的实际请求,其主要有如下几个特点:
支持多种文件系统,包括NTFS,ext4,btrfs,xfs等
支持多种IO模式,包括randwrite,read,write,dd,trim,flush,discard等
fio可以测试不同类型的IO,包括随机写,连续写,顺序写,随机读,连续读,顺序读等
另外
fio还支持I/O限制,可以限制IO带宽,IO延迟,IO吞吐量等 这篇文章,我们将介绍如何移植fio到Android平台,以及常见的使用方法。首先来看看如何通过交叉编译移植fio。
编译准备
首先到fio的官方网站https://github.com/axboe/fio下载源码:
1 | git clone https://github.com/axboe/fio |
如果本地没有安装过NDK,需要下载NDK:https://developer.android.google.cn/ndk/downloads?hl=zh-cn;然后设定NDK的环境变量:
1 | export NDK_HOME=/path/to/ndk |
编译代码
在编译之前,先通过./configure --help看看编译配置具体有哪些参数:
1 | ./configure --help |
具体需要哪些选项,我们可以根据需要来进行选择与配置。为了便于编译,我们写一个简单的编译脚本:
1 |
|
执行上述脚本发现没在配置阶段会提示错误: 交叉编译工具使用的是
gcc, 而看NDK的工具都是 clang
的,需要修改下配置:
- 由于当前NDK都采用
clang, 但fio源码配置文件默认是gcc的编译器,因此需要修改下configure文件:
1 | diff --git a/configure b/configure |
修改完后,再次编译还是会提示错误:
1 | In file included from engines/io_uring.c:29: |
看代码是由于重复定义导致了, fio的源码里有一个地方重新定义了,
因此需要针对Android平台做判断, 照例修改下
configure的配置即可:
1 | /* |
找到生成 CONFIG_NVME_URING_CMD的地方,增加对
Android的判断即可:
1 | @@ -2656,7 +2656,7 @@ if test "$libzbc" != "no" ; then |
这一次编译正常了,可以看到有生成可执行文件,将其push到Android设备,可以正常执行。
如何使用fio
fio的命令主要有两个部分,一部分是参数,一部分是测试的配置文件。
1 | fio [options] [jobfile] ... |
参数用于设置fio以及输出一些调试信息,而真正让fio运行的是jobfile,用于指定运行时的测试参数,包括如下几个部分:
I/O的类型: 指定读写模式,比如是顺序读还是随机读等,比如是否使用直接I/O(
direct I/O)读写块大小: 指定读写块大小,比如是4k还是64k
读写的总文件大小: 指定文件大小,比如是1G还是10G
I/O引擎: 使用共享内存的方式还是普通的读写操作
I/O深度: 对于使用异步I/O引擎的情况,指定I/O队列的大小
目标文件与设备: 指定测试需要执行的文件或者设备
线程或进程: 指定测试需要执行的线程数量 比如如果我们需要测试某个磁盘的性能可以使用直接模式,具体命令如下:
1 | fio -direct=1 -iodepth=1 -thread -rw=randwrite -ioengine=psync -bs=16k -size=10G -numjobs=10 -runtime=1000 -group_reporting -name=fio-test |
测试完成后,fio会生成报告,
包括I/O带宽,读写的速度以及I/O延迟等:
1 | Jobs: 10 (f=10): [w(10)][85.7%][w=1829MiB/s][w=117k IOPS][eta 00m:01s] |