2

每个人

最近,我用fio做了一些测试来测试我的磁盘性能。我将fio配置为使用direct io和O_SYNC,以下是我的配置

[global]
invalidate=0    # mandatory
direct=1
sync=1
thread=1
norandommap=1
runtime=10000
time_based=1

[write4k-rand]
stonewall
group_reporting
bs=4k
size=1g
rw=randwrite
numjobs=1
iodepth=1

但是,当我在 fio 运行时通过 iostat 监控磁盘性能时,我看到了以下输出。

avg-cpu:  %user   %nice %system %iowait  %steal   %idle
           0.12    0.00    0.08    3.81    0.00   95.98

Device:         rrqm/s   wrqm/s     r/s     w/s   rsec/s   wsec/s avgrq-sz avgqu-sz   await  svctm  %util
sda               0.00    39.50    0.00  176.00     0.00  1648.00     9.36     1.02    5.81   5.65  99.50

wrqm/s 为 39.50。如果stop fio,wrqm/s为0。为什么我用O_SYNC做direct io的时候还有io merges?请帮我。

谢谢:-)

4

1 回答 1

1

在 Linux 上,做直接 I/O 并不意味着“做这个精确的 I/O”——它是绕过 Linux 页面缓存的提示。在撰写开放手册页时,关于以下内容O_DIRECT

尽量减少进出该文件的 I/O 的缓存影响。

这意味着像 Linux I/O 调度程序之类的东西仍然可以自由地通过 I/O 处理合并、重新排序(您使用 fiosync=1是停止重新排序的原因)等O_DIRECT

此外,如果您正在对文件系统中的文件执行 I/O,那么所述文件系统忽略O_DIRECT提示并回退到缓冲 I/O是合法的。

请参阅https://www.kernel.org/doc/Documentation/block/queue-sysfs.txt中的不同参数,nomerges了解如何教调度程序避免合并/重新排列,但请注意,您无法控制拆分请求太大。

说了以上所有,看起来在您的场景中并没有发生那么多 I/O 合并(由 wrqm/s 给出),但仍然有些奇怪。是 9.36,由于该avgrq-sz值在 512 字节扇区中,我们得到 4792.32 字节作为提交到磁盘的平均请求大小。该值非常接近fio正在使用的 4096 字节块大小。由于您不能对磁盘执行非扇区大小的 I/O 并假设磁盘的块大小为 512 字节,这表明合并 4KBytes + 512 字节(我假设其余部分是噪声),但由于它是平均值,因此可能存在同时做大(r)I / O的东西fio正在做小的 I/O,而平均值只是介于两者之间。因为 I/O 发生在文件系统中的文件上,这可能是因为文件系统元数据正在更新......

于 2017-02-18T08:23:57.693 回答