为啥 fio 尺寸参数会影响性能的结果

Posted

技术标签:

【中文标题】为啥 fio 尺寸参数会影响性能的结果【英文标题】:why fio size parameter can influence the result of performance为什么 fio 尺寸参数会影响性能的结果 【发布时间】:2016-04-05 06:17:44 【问题描述】:

我用 fio 测试磁盘性能有一段时间了。但就在最近,我发现了一件我无法理解的棘手事情。尺寸选项描述如下 (fio man page):

大小=整数

此作业的 I/O 总大小。 fio 将一直运行,直到传输了这么多字节,除非受到其他选项(例如运行时)的限制。除非给出 nrfiles 和 filesize 选项,否则此数量将在作业的可用文件之间分配。如果未设置,fio 将使用给定文件或设备的完整大小。如果文件不存在,则必须给出大小。也可以将大小指定为 1 到 100 之间的百分比。如果指定 size=20%,fio 将使用给定文件或设备完整大小的 20%。

只要我能理解,大小不是太小凑够就OK了,但我我的测试,我设置大小为128MB、2GB、800GB,结果不同:

size=128M, average iops = 165
size=2GB, average iops = 145
size=800GB, average iops = 78

在我看来,对于 4KB 的块,128MB 的大小足以获得足够数量的 IO 来进行测试,性能应该不受大小的影响。但是为什么size越大,性能越差。

【问题讨论】:

【参考方案1】:

您是否在测试期间禁用了文件系统缓存? 我在测试期间经常使用的几个参数 (http://linux.die.net/man/1/fio):

direct=1
invalidate=1
randrepeat=0
do_verify=0
verify_fatal=0

【讨论】:

【参考方案2】:

如果您正在测试旋转驱动器,则测试更大的容量区域意味着磁头必须寻找更远的距离才能覆盖所有数据。这需要更长的时间,而更长的寻道时间会导致 IOPS 降低。

【讨论】:

【参考方案3】:

在通往磁盘的路径中,可能有多个“最大”块大小,不超过它们是值得的。

例如,您可能认为您正在提交一个 10MByte 的块,但在幕后实际发生的是 10MByte 的块被分割成很小的 64Kbyte 大小的块,因为这是驱动程序可以接受的限制。该 10MByte I/O 无法标记为已完成,直到它的每个单独部分都已返回,因此您正在创建不需要存在的阻塞,并且您还为进行拆分的层创建了额外的工作。因此,如果您测试从 512 向上的块大小,您通常会看到吞吐量的巨大初始收益,然后在事情开始变慢之前收益递减。

不是:Linux 有时会公开一个“最佳块大小”(参见 https://www.kernel.org/doc/Documentation/ABI/testing/sysfs-block 中的“/sys/block//queue/optimal_io_size”),它可能是也可能不是磁盘真正的最佳块大小。

【讨论】:

【参考方案4】:

但是为什么尺寸越大,性能越差

您没有包含您正在运行的作业/命令行,所以下面只是一个猜测:

如果作业是不直接写入磁盘的(缓冲的)写入作业,那么简单的答案可能是“使用较大的size,在缓存已满之前可以缓存更少的总写入并拥有等待”。 Linux 可以缓存缓冲的写入(并返回它“完成”写入),但它可以做到多少取决于在给定点您有多少可用 RAM。如果您写入的内容远远多于 RAM,那么您将开始看到您的后备设备速度更快,因为当缓存已满时,新的写入无法缓冲,直到现有的写入已被降级。

【讨论】:

以上是关于为啥 fio 尺寸参数会影响性能的结果的主要内容,如果未能解决你的问题,请参考以下文章

针对文件系统和网络性能的测试

unity5怎样正确导入FBX,模型大小为啥会发生变化

磁盘性能测试工具之fio

FIO read测试结果偏离

从 fio 测试中理解 blktrace

磁盘性能压测二三事之——性能参数和指标