我有一台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
调用来创建文件,然后使用issueopen
和write
调用将随机数据写入打开的文件。最后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;您提供的fio
和dd
命令没有测试相同的东西。您需要了解一些事情,例如文件是否已经以正确的大小存在,所写数据的可压缩性以及是否通过写入太少的数据而不检查是否已全部写回来考虑内核缓冲之类的事情。到磁盘。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句