【问题标题】:how to achieve disk write speed as high as fio does? [closed]如何实现与fio一样高的磁盘写入速度? [关闭]
【发布时间】:2019-05-02 09:32:07
【问题描述】:

我买了一张Highpoint的HBA卡,里面有4个三星960PRO。正如官网所说,这张卡可以执行7500MB/s的写入和13000MB/s的读取。

当我在 ubuntu 16.04 系统中使用 fio 测试这张卡时,我得到了大约 7000MB/s 的写入速度,这是我的测试参数:

sudo fio -filename=/home/xid/raid0_dir0/fio.test -direct=1 -rw=write -ioengine=sync -bs=2k -iodepth=32 -size=100G -numjobs=1 -runtime=100 -time_base=1 -group_reporting -name=test-seq-write

我在卡里做了一个raid0,做了一个xfs文件系统,想知道如果我想使用诸如“open(),read(),write之类的函数,如何达到fio执行的磁盘写入速度()”或我的控制台应用程序中的“fopen(),fread(),fwrite()”等函数。

【问题讨论】:

  • 也许这更适合Super User SE,因为这个问题与编程无关?
  • 最简单的方法是阅读和理解工具的来源(在这种情况下为fio)。然后你可以在你自己的代码中使用类似的技术。
  • ^_^,这是我的第一个想法,但消化源代码确实需要很长时间。

标签: linux benchmarking disk solid-state-drive disk-io


【解决方案1】:

我会注意到您指定的 fio 工作似乎有点缺陷:

-direct=1 -rw=write -ioengine=sync -bs=2k -iodepth=32

(为了简单起见,我们假设破折号实际上是双的)

以上是要求尝试要求同步 ioengine 使用大于 1 的iodepth。这通常没有意义,iodepth section of the fio documentation warns about this:

iodepth=int

要针对文件保持运行的 I/O 单元数。注意 增加 iodepth 超过 1 不会影响 同步 ioengines (使用 verify_async 时的小度数除外)。甚至异步 引擎可能会施加操作系统限制,导致所需深度不 达到。 [强调]

您没有发布 fio 输出,因此我们无法判断您是否曾达到大于 1 的 iodepth。 7.5GByte/s 对于这样的工作来说似乎很高,我不禁想到你的文件系统悄悄地在你背后做了缓冲,但谁知道呢?我不能说更多,因为恐怕你 fio run 的输出不可用。

另请注意data fio was writing might not have been random enough to defeat compression,从而有助于实现人为的高 I/O 速度...

不管你的主要问题:

如何实现和fio一样高的磁盘写入速度?

您的示例表明您正在告诉 fio 使用 ioengine that does regular write calls。考虑到这一点,理论上您应该能够通过以下方式达到类似的速度:

  1. 预分配文件并仅写入分配的部分(因此您不会进行扩展写入)
  2. 满足使用O_DIRECT 的所有要求(必须满足严格的内存对齐和大小限制)
  3. 确保您的 write 操作正在以正好 2048 字节(或更大,只要它们是 2 的幂)的块写入缓冲区。
  4. 尽快提交您的writes :-)

如果由于某种原因您无法每次都提交“大”对齐的缓冲区,您可能会发现不使用 O_DIRECT(因此允许缓冲 I/O 进行合并)会更好。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-29
    • 1970-01-01
    • 2011-03-12
    • 2014-03-09
    • 2014-01-05
    • 2017-02-27
    相关资源
    最近更新 更多