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 |
|
如果本地没有安装过NDK,需要下载NDK:https://developer.android.google.cn/ndk/downloads?hl=zh-cn;然后设定NDK的环境变量:
1 |
|
编译代码
在编译之前,先通过./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
以及输出一些调试信息,而真正让fio
运行的是jobfile
,用于指定运行时的测试参数,包括如下几个部分:
- I/O的类型: 指定读写模式,比如是顺序读还是随机读等,比如是否使用直接I/O(
direct I/O
) - 读写块大小: 指定读写块大小,比如是4k还是64k
- 读写的总文件大小: 指定文件大小,比如是1G还是10G
- I/O引擎: 使用共享内存的方式还是普通的读写操作
- I/O深度: 对于使用异步I/O引擎的情况,指定I/O队列的大小
- 目标文件与设备: 指定测试需要执行的文件或者设备
- 线程或进程: 指定测试需要执行的线程数量
比如如果我们需要测试某个磁盘的性能可以使用直接模式,具体命令如下:
1 |
|
测试完成后,fio
会生成报告, 包括I/O
带宽,读写的速度以及I/O
延迟等:
1 |
|