-1

我买了一张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()”等函数。

4

1 回答 1

1

我只是注意到fio你指定的工作似乎有点缺陷:

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

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

以上是要求尝试要求同步 ioengine 使用iodepth大于 1 的值。这通常没有意义,并且iodepthfio 文档的部分对此提出了警告

iodepth =int

要针对文件保持运行的 I/O 单元数。请注意, 将 iodepth 增加到 1 以上不会影响同步ioengine (使用 verify_async 时的小度数除外)。甚至异步引擎也可能会施加操作系统限制,导致无法达到所需的深度。[重点补充]

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

另请注意,正在写入的数据可能不够随机,无法破坏压缩,从而有助于实现人为的高 I/O 速度......

无论如何,你的主要问题:

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

您的示例显示您正在告诉 fio 使用执行常规调用的ioenginewrite。考虑到这一点,理论上您应该能够通过以下方式实现类似的速度:

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

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

于 2018-12-04T07:18:28.477 回答