在 Android 可以用来测试 emmc io 性能的工具有很多, 比如 fio, iozone, dd 等。 看了大半天的 fio, iozone, 感觉用起来比较复杂,相对来说还是使用 dd 简单方便。接下来我们就以 dd 为主介绍一下如何测试 emmc 的 io 性能。
1. 页面缓存
在开始之前,我们先了解一下页面缓存的概念。简单的说就是系统会把读取过的部分文件缓存到内存中,以此加快热点文件的读取速度,提高磁盘的 IO 速度。
具体的原理见 Linux内核文件Cache机制。
为了测试 emmc 的真实读写性能,我们需要先把页面缓存给清理:
1 | echo 1 > /proc/sys/vm/drop_caches |
我们先看看页面缓存的例子:
1 | KKHi3751V810:/ # busybox dd if=/dev/block/mmcblk0 of=/dev/null bs=1M count=1024 |
连续执行两次同样参数的 dd 命令, 从 /dev/block/mmcblk0 (也就是我们的 emmc) 块设备中读取内容, 写到 /dev/null 。/dev/null 是一个虚拟设备,写入这个路径并不会保存,我们可以认为这个设备的写入速度无限大, 也就是写入速度不会成为这个命令的瓶颈, 我们这个命令主要是为了测试 emmc 的读取速度。可以看到第一次执行的结果是 203.8MB/s, 第二次执行的结果是 1.8GB/s。从这个数据来看,页面缓存极大的提高了热点文件的读取速度。然后我们用 echo 1 > /proc/sys/vm/drop_caches
命令清除一下页面缓存,再执行同样的 dd 命令,发现速度跟第一次差不多了。
2. 写入性能测试
我们分为两种情况来测试
2.1 写入块设备
cache 分区一般是用来存放 OTA 升级包的,正常状态下挂载失败也不影响系统的正常运行,所以我们拿 cache 分区来作写入测试,先找到 cache 对应的块设备文件
1 | KKHi3751V810:/ #ls -l /dev/block/platform/soc/f9830000.emmc/by-name/cache < |
cache 分区的块设备文件为 /dev/block/mmcblk0p18。
写入测试:
1 | KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches |
输入文件为 /dev/zero,是一个虚拟设备,我们可以认为这个设备的读取速度无限大,也就是读取速度不会影响到写入的速度。
bs=1M : 一次写入 1M
count=1024 : 写入 1024 次,也就是写入的数据总量为 1G
conv=fsync : dd 结束前,把数据同步到 emmc,如果没加这个参数的话,数据可能还在缓存之中。为了确保数据准确,一定要加这个参数。
重复测试几次,速度基本在 42M/s 左右。
2.2 写入文件
1 | KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches |
重复测试几次,速度基本在 33M/s 左右。相对直接写块设备文件慢了 10M/s 左右。这可能是文件系统带来的影响。
3. 读取测试
3.1 读取块设备
直接用我们上面介绍清除缓存的例子就行,这里就不再重复了。
从上面的例子得到的数据为 203M/s 左右。
3.1 读取文件
1 | KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches |
直接拿测试写入速度时生成的文件,重复测试几次,速度基本上在 208MB/s 左右。
4. 对比iozone
Android 系统源码中并没有 iozone,我们得自己人官网上下载编译,我下载时最新版本为 iozone3_489, 这个版本已经有 Android.mk 在代码里面了, 将源码放到 Android 系统源码里面 mm 即可。
随机读写测试:
1 | KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches |
从结果来看,随机读速度为 199299 kB/s , 大概为 200M/s。 随机写速度为 71520 kB/s, 大概为 70M/s。
重复测试几次结果差不多,读的速度基本跟 dd 的一致。写入的比 dd 的快了将近一倍。
5. 对比fio
5.1 写入文件速度
1 | KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches |
4个线程的平均写入速度为 bw=83067KB/s,大概是 80M/s, 比 dd 也快了一倍多。
5.2 读取文件速度
1 | KKHi3751V810:/ # echo 1 > /proc/sys/vm/drop_caches |
4个线程的平均读速度为 bw=171813KB/s, 大概为 170M/s。
综合对比 dd, iozone, fio 这几个工具发现,读的速度基本上差不多,但写速度差距比较大,可能跟设置的参数有关。
为了简单起见,我们只采用 dd 的结果作为参考数据即可。
参考文章:
[IO测试工具之fio详解]:https://www.cnblogs.com/raykuan/p/6914748.html
[emmc读写速度性能分析]:https://blog.csdn.net/jekenzhuang/article/details/81142178
[dd命令的conv=fsync,oflag=sync/dsync]:https://blog.csdn.net/menogen/article/details/38059671
[页面缓存:内存和文件之间的那些事]:https://linux.cn/article-9528-1.html
[在 Linux 上如何清除内存的 Cache、Buffer 和交换空间]:https://linux.cn/article-5627-1.html
[iozone的使用]:http://wowothink.com/b871283/
[eMMC读写性能和稳定性验证]:http://wowothink.com/7ffb6593/