为什么fio seq_writes比dd快得多?

阿拉文·萨西什(Aravindh Sathish)

我有一台zfs服务器,在其中运行了一些愚蠢的测试只是为了理解,这使我感到困惑。

上下文:-FreeBSD 11.2,启用压缩的ZFS,SAS HDD,RAIDz2、768GB内存。

这两个命令都直接在FreeBSD服务器上运行。

# time dd if=/dev/random of=./test_file bs=128k count=131072 
131072+0 records in
131072+0 records out
17179869184 bytes transferred in 135.191596 secs (127077937 bytes/sec)
0.047u 134.700s 2:15.19 99.6%   30+172k 4+131072io 0pf+0w

# #The result file size:
# du -sh test_file 
  16G   test_file

这表明我能够在135秒内处理16GiB文件中的随机数据,并获得大约吞吐量。117 MiB /秒。

现在,我尝试使用fio

# fio --name=seqwrite --rw=write --bs=128k --numjobs=1 --size=16G --runtime=120 --iodepth=1 --group_reporting
seqwrite: (g=0): rw=write, bs=(R) 128KiB-128KiB, (W) 128KiB-128KiB, (T) 128KiB-128KiB, ioengine=psync, iodepth=1
fio-3.6
Starting 1 process
seqwrite: Laying out IO file (1 file / 16384MiB)
Jobs: 1 (f=1): [W(1)][100.0%][r=0KiB/s,w=2482MiB/s][r=0,w=19.9k IOPS][eta 00m:00s]
seqwrite: (groupid=0, jobs=1): err= 0: pid=58575: Wed Jul 25 09:38:06 2018
  write: IOPS=19.8k, BW=2478MiB/s (2598MB/s)(16.0GiB/6612msec)
    clat (usec): min=28, max=2585, avg=48.03, stdev=24.04
     lat (usec): min=29, max=2586, avg=49.75, stdev=25.19
   bw (  MiB/s): min= 2295, max= 2708, per=99.45%, avg=2464.33, stdev=124.56, samples=13
   iops        : min=18367, max=21664, avg=19714.08, stdev=996.47, samples=13
---------- Trimmed for brevity -------------
Run status group 0 (all jobs):
  WRITE: bw=2478MiB/s (2598MB/s), 2478MiB/s-2478MiB/s (2598MB/s-2598MB/s), io=16.0GiB (17.2GB), run=6612-6612msec

现在,我的吞吐量达到了2478 MiB / s。同时使用相同的16 GiB文件和随机数据。

为什么会有如此大的差异?我的理解是dd命令必须使用create调用来创建文件,然后使用issueopenwrite调用将随机数据写入打开的文件。最后close是文件。我选择了128 K的块大小来与ZFS默认记录大小匹配。

fio测试应该仅测量write呼叫,但其他所有条件都相同。为什么吞吐量有如此大的差异?

更让我感到困惑的是,如果我要求fio创建可压缩率为50%的文件,那么吞吐量将降至847 MiB / s。我知道在压缩中涉及CPU工作会导致吞吐量下降,但我希望通过将近一半的数据写入量,可以消除这种影响。有什么想法为什么影响如此之大?

用于以50%可压缩性运行fio的命令:

 fio --name=seqwrite --rw=write --bs=128k --numjobs=1 --size=16G --runtime=60 --iodepth=1 --buffer_compress_percentage=50 --buffer_pattern=0xdeadbeef --group_reporting
安农

我将重新整理您的问题,以突出显示某些上下文:

为什么是

fio --name=seqwrite --rw=write --bs=128k --numjobs=1 --size=16G --runtime=120 --iodepth=1 --group_reporting

比...快

time dd if=/dev/random of=./test_file bs=128k count=131072 

在具有768GB RAM的FreeBSD 11.2系统上,将SAS HDD和ZFS配置为启用压缩的RAIDZ2?

主要区别在于,fio会在对其进行时序测试之前预先制作文件:

seqwrite: Laying out IO file (1 file / 16384MiB)

dd可能会进行文件扩展写操作(这将导致元数据更新)。另外,您有太多的RAM(768G),而要写入的数据却很少(16G),因此您的写入很有可能被保存在RAM中(直到更晚才真正写入磁盘)。这可能是在fio文件已经预先制作并且每个I / O只需修改很少的文件元数据情况下。您至少可以告诉fio不要说它已经完成,直到使用作业在工作结束时从内核写回所有写入的数据为止end_fsync=1

(注意:当您看到完成延迟远低于磁盘可以执行的操作时,有一个微妙的提示:正在缓冲I / O:

clat(usec):最小值= 28,最大值= 2585,平均值= 48.03,标准偏差= 24.04

您的旋转磁盘能否真正在28微秒内完成I / O?如果没有的话,它可能会缓冲在某个地方)

最后,fio默认在后续块中重用相同的模式由于正在进行压缩,因此可以进一步提高fio吞吐量(但这取决于ZFS记录大小)。要检查这一点,请让fio将其缓冲区设为不可压缩(依次打开refill_buffers),然后查看吞吐量是否下降(在您的情况下这样做)。

TLDR;您提供fiodd命令没有测试相同的东西。您需要了解一些事情,例如文件是否已经以正确的大小存在,所写数据的可压缩性以及是否通过写入太少的数据而不检查是否已全部写回来考虑内核缓冲之类的事情。到磁盘。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

为什么<比!=快得多?

来自分类Dev

为什么StringBuilder比String快得多

来自分类常见问题

为什么字典比列表快得多?

来自分类Dev

为什么PreparedStatement比Statement快得多?

来自分类Dev

为什么熊猫.isin比“ in”快得多?

来自分类Dev

为什么通过gzip传递'dd'比直接复制要快得多?

来自分类Dev

Android:为什么本机代码比Java代码快得多

来自分类Dev

为什么EnumerateFiles比计算大小要快得多

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

Python清单:为什么.sort()比sorted()快得多?

来自分类Dev

为什么批处理模式比parfor快得多?

来自分类Dev

为什么ifstream :: read比使用迭代器快得多?

来自分类Dev

为什么strcmp比我的函数快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么Python中的这段代码比C ++快得多?

来自分类Dev

为什么SSH感觉比HTTP快得多?

来自分类Dev

为什么strcmp比我的函数快得多?

来自分类Dev

为什么memcmp比for循环检查要快得多?

来自分类Dev

为什么在预热阶段浮点运算要快得多?

来自分类Dev

为什么子图比图快得多?

来自分类Dev

为什么wget比通过Chrome下载要快得多?

来自分类Dev

为什么认为异步代码比同步代码快得多?

来自分类Dev

为什么数组的直接索引比迭代快得多?

来自分类Dev

为什么在Image上旋转比使用BitmapEncoder快得多?

来自分类Dev

为什么memcpy到堆栈上的内存比堆上的内存快得多?

来自分类Dev

为什么2 ** 100比math.pow(2,100)快得多?

来自分类Dev

为什么plt.imshow比plt.pcolor快得多?

来自分类Dev

为什么用余弦函数计算比用Secant Trig函数计算快得多?

Related 相关文章

  1. 1

    为什么<比!=快得多?

  2. 2

    为什么StringBuilder比String快得多

  3. 3

    为什么字典比列表快得多?

  4. 4

    为什么PreparedStatement比Statement快得多?

  5. 5

    为什么熊猫.isin比“ in”快得多?

  6. 6

    为什么通过gzip传递'dd'比直接复制要快得多?

  7. 7

    Android:为什么本机代码比Java代码快得多

  8. 8

    为什么EnumerateFiles比计算大小要快得多

  9. 9

    为什么memcmp比for循环检查要快得多?

  10. 10

    Python清单:为什么.sort()比sorted()快得多?

  11. 11

    为什么批处理模式比parfor快得多?

  12. 12

    为什么ifstream :: read比使用迭代器快得多?

  13. 13

    为什么strcmp比我的函数快得多?

  14. 14

    为什么在预热阶段浮点运算要快得多?

  15. 15

    为什么数组的直接索引比迭代快得多?

  16. 16

    为什么Python中的这段代码比C ++快得多?

  17. 17

    为什么SSH感觉比HTTP快得多?

  18. 18

    为什么strcmp比我的函数快得多?

  19. 19

    为什么memcmp比for循环检查要快得多?

  20. 20

    为什么在预热阶段浮点运算要快得多?

  21. 21

    为什么子图比图快得多?

  22. 22

    为什么wget比通过Chrome下载要快得多?

  23. 23

    为什么认为异步代码比同步代码快得多?

  24. 24

    为什么数组的直接索引比迭代快得多?

  25. 25

    为什么在Image上旋转比使用BitmapEncoder快得多?

  26. 26

    为什么memcpy到堆栈上的内存比堆上的内存快得多?

  27. 27

    为什么2 ** 100比math.pow(2,100)快得多?

  28. 28

    为什么plt.imshow比plt.pcolor快得多?

  29. 29

    为什么用余弦函数计算比用Secant Trig函数计算快得多?

热门标签

归档