为什么用O_DIRECT和O_SYNC写入仍导致io合并?

时间:2016-12-22 03:03:00

标签: linux io iostat

大家

最近,我用fio做了一些测试来测试我的磁盘性能。我将fio配置为使用直接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。如果停止fio,则wrqm / s为0.当我用O_SYNC进行直接io时,为什么还有io合并?请帮帮我。

谢谢: - )

1 个答案:

答案 0 :(得分:0)

在Linux上,进行直接I / O并不意味着“做这个精确的I / O” - 它意味着绕过Linux的页面缓存。在撰写本文时,open man page说明了O_DIRECT

  

尝试最小化I / O与此文件之间的缓存效果。

这意味着像Linux I / O调度程序这样的东西仍然可以自由地做关于合并,重新排序(你使用fio的sync=1是什么停止重新排序)和O_DIRECT我/ O。

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