我用fio作为SSD的基准。但是,当指定fsync=1(在每个write())参数后将脏缓冲区同步到磁盘时,我对报告的延迟感到困惑。

$ fio --name=test_seq_write --filename=test_seq --size=2G --readwrite=write --fsync=1
test_seq_write: (g=0): rw=write, bs=4K-4K/4K-4K/4K-4K, ioengine=sync, iodepth=1
fio-2.1.3
Starting 1 process
test_seq_write: Laying out IO file(s) (1 file(s) / 2048MB)
Jobs: 1 (f=1): [W] [100.0% done] [0KB/31968KB/0KB /s] [0/7992/0 iops] [eta 00m:00s]
test_seq_write: (groupid=0, jobs=1): err= 0: pid=10994: Thu Oct 26 09:09:19 2017
  write: io=2048.0MB, bw=35647KB/s, iops=8911, runt= 58831msec
    clat (usec): min=2, max=1099, avg= 9.42, stdev=18.19
     lat (usec): min=2, max=1099, avg= 9.56, stdev=18.28

这里,iops是8911,所以延迟应该大约在100us左右。但是,报告的延迟是9us。我很好奇fio是否包括fsync的时间?我在看医生报告,但没有找到解释。

最佳答案

(哦,天哪,如果你有选择的话,请不要使用旧版本的fio——自从fio 2.1.3以来已经修复了这么多的错误,你继续使用它真的是在伤害自己(而且不需要太多时间)。看看我们现在发布的fio版本:build newer fio versions
以下答案适用于fio 3.4及以上版本。关于fio 3.5和更新版本,请参见ahttps://github.com/axboe/fio/releases
fsync是对常规I/o的一个单独的fio操作(有关它们排队的位置,请参见later answer to this question),因此应该对它们进行计数。[更新]但是,fio显式地将非读、写或修剪的I/O从统计数据收集中排除(请参见https://github.com/axboe/fio/blob/0bcf41cdc22dfee6b3f3b2ba9a533b4b103c70c2/io_u.c#L2170)。
所以
fio是否包含fsync的时间[在I/O延迟统计信息中]?
无fio不包括延迟统计中的fsync时间。fsync将影响总带宽,但这将是未分配的。
注意:fsync是一个繁重的操作,因为在Linux上它可以确保:
I/O已经被“磁盘”确认为已被接收,而且不只是在Linux的页面缓存中。
与整个文件关联的元数据已刷新到磁盘。由于复杂的原因,这可能意味着您最终也要等待刷新其他文件的数据/元数据。。。
“磁盘”已确认I/O已达到其上的稳定存储(即,它不只是在“磁盘”缓存中,无法承受失去电源)。
当基准测试时,您通常更希望确保只有1个。因为至少这样,您就更接近于测试磁盘的速度(而不是Linux的缓存),而其他几点则与确保数据完整性有关。如果这也是您的情况,我建议您对fio使用https://github.com/axboe/fio/blob/0bcf41cdc22dfee6b3f3b2ba9a533b4b103c70c2/io_u.c#L1823并停止使用fsync,因为这样每个I/O都将绕过Linux的页面缓存,并且在磁盘确认收到I/O之前不会返回。因此,每个I/O都将在其时间内具有“磁盘延迟”,但如前所述,这并不意味着点2或3。另外请注意,并非所有文件系统都支持此选项(这很遗憾)。
[原始推测]
然而,也有可能是这样的情况:写I/o完成得很快,fsync完成得很快,但是每次提交之间的空间是非零的(本质上是由于fio必须工作)。I/O也是如此->I/O完成->执行非I/O工作->执行I/O等,因此您无法根据达到的IOPs推断I/O延迟(只能给它一个上限)。
备注:您可以使用现代fio版本(direct=1http://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-write-lat-loghttp://fio.readthedocs.io/en/latest/fio_doc.html#log-file-formats(log_avg_msec必须为0/unset))打开每个I/O日志记录,但请注意,fsync也可以免除此日志记录。请确保将日志保存在不会干扰测试的地方,并注意每个I/O日志的增长速度非常快,因此在这种模式下最好不要执行太多I/O操作。
PPS:这个问题最好发送到fio邮件列表(http://fio.readthedocs.io/en/latest/fio_doc.html#cmdoption-arg-log-avg-msec)。

关于linux - 基准延迟测试说明,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/46952571/

10-10 23:57