1. 背景
本系列文章整体脉络回顾,
- Linux Block Driver - 1 介绍了一个只有 200 行源码的 Sampleblk 块驱动的实现。
- Linux Block Driver - 2 中,在 Sampleblk 驱动创建了 Ext4 文件系统,并做了一个
fio
顺序写测试。测试中我们利用 Linux 的各种跟踪工具,对这个fio
测试做了一个性能个性化分析。 - Linux Block Driver - 3 中,利用 Linux 跟踪工具和 Flamegraph 来对文件系统层面上的文件 IO 内部实现,有了一个概括性的了解。
- Linux Block Driver - 4 里,在之前同样的
fio
顺序写测试下,分析 Sampleblk 块设备的 IO 性能特征,大小,延迟,统计分布,IOPS,吞吐等。 - Linux Block Driver - 5 中,使用
blktrace
跟踪了fio
顺序写测试的 IO 操作,并对跟踪结果和 IO 流程做了详细总结。
本文将继续之前的实验,围绕这个简单的 fio
测试,探究 Linux 块设备驱动的运作机制。除非特别指明,本文中所有 Linux 内核源码引用都基于 4.6.0。其它内核版本可能会有较大差异。
2. 准备
阅读本文前,可能需要如下准备工作,
- 参考 Linux Block Driver - 1 中的内容,加载该驱动,格式化设备,装载 Ext4 文件系统。
- 按照 Linux Block Driver - 2 中的步骤,运行
fio
测试。 - 按照 Linux Block Driver - 5 中的内容,使用
blktrace
和blkparse
跟踪 IO 操作,并尝试解释跟踪结果。
本文将在与前文完全相同 fio
测试负载下,使用 blktrace
在块设备层面对该测试做进一步的分析。
3. bio 拆分问题
在 Linux Block Driver - 5 中,我们发现,每次 IO,在块设备层都会经历一次 bio 拆分操作。
$ blkparse sampleblk1.blktrace.0 | grep 2488 | head -n6
253,1 0 1 0.000000000 76455 Q W 2488 + 2048 [fio]
253,1 0 2 0.000001750 76455 X W 2488 / 2743 [fio] >>> 拆分
253,1 0 4 0.000003147 76455 G W 2488 + 255 [fio]
253,1 0 53 0.000072101 76455 I W 2488 + 255 [fio]
253,1 0 70 0.000075621 76455 D W 2488 + 255 [fio]
253,1 0 71 0.0000910