ZFS池缓慢顺序读取

我有一个关于这个问题的相关问题,但它太复杂,太大了,所以我决定我应该把问题分解成NFS和本地问题。 我也尝试过在zfs-discuss邮件列表上询问这个问题,但没有取得太大的成功。

在同一台服务器上的NFS / CIFS目录之间慢速复制

大纲:我如何设置和我的期望

  1. 我有一个4个磁盘的ZFS池。 2TB REDconfiguration为2个带条纹的镜像(RAID 10)。 在Linux上,zfsonlinux。 没有caching或日志设备。
  2. 数据在镜像之间保持平衡(对于ZFS很重要)
  3. 每个磁盘可以以147MB /秒的速度并行读取(raw w / dd),总吞吐量达到588MB / sec。
  4. 根据类似的4TB RED磁盘的基准testing结果,我预计每个磁盘的写入速度为115MB / sec,读取速度为138MB / sec,重写顺序数据的速度为50MB / sec。 我预计不会低于100MB /秒的读取或写入,因为现在任何磁盘都可以这样做。
  5. 我认为在负载读取或写入顺序数据的情况下,在所有4个磁盘上都会看到100%的IO利用率。 而且在100%的利用率下磁盘将会超过100MB /秒。
  6. 我认为这个池可以让我在单个磁盘上进行2次写入,2次重写和4次读取 – 我错了吗?
  7. 新的我认为在同一个池上的ext4 zvol与ZFS的速度大致相同

我实际得到的

我发现游泳池的读取性能没有我预期的那么高

bonnie ++基准testing池在几天前

版本1.97 ------顺序输出------  - 顺序input -   - 随机 - 
并发性1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block---查询 - 
机器尺寸K /秒%CP K /秒%CP K /秒%CP K /秒%CP K /秒%CP /秒%CP
 igor 63G 99 99 232132 47 118787 27 336 97 257072 22 92.7 6

bonnie ++在一个单独的4TB RED驱动器上,它自己在一个zpool

版本1.97 ------顺序输出------  - 顺序input -   - 随机 - 
并发性1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block---查询 - 
机器尺寸K /秒%CP K /秒%CP K /秒%CP K /秒%CP K /秒%CP /秒%CP
 igor 63G 101 99 115288 30 49781 14 326 97 138250 13 111.6 8

据此,根据单个4TB RED驱动器的结果(它们是双倍的),读取和重写速度是合适的。 但是,我期望的读取速度大约是550MB / sec(4TB驱动器速度的4倍),我希望至less可以达到400MB / sec。 相反,我看到大约260MB /秒

bonnie ++从刚才的游泳池,同时收集下面的信息。 与以前不太一样,没有什么变化。

版本1.97 ------顺序输出------  - 顺序input -   - 随机 - 
并发性1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block---查询 - 
机器尺寸K /秒%CP K /秒%CP K /秒%CP K /秒%CP K /秒%CP /秒%CP
 igor 63G 103 99 207518 43 108810 24 342 98 302350 26 256.4 18

在写入期间zpool iostat 。 对我来说似乎很好。

                                                 容量操作带宽
池分配空闲读写写读写
 -------------------------------------------- -----  - ---- ----- ----- ----- -----
 pool2 1.23T 2.39T 0 1.89K 1.60K 238M
  镜子631G 1.20T 0 979 1.60K 120M
     ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469  -   -  0 1007 1.60K 124M
     ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX  -   -  0 975 0 120M
  镜子631G 1.20T 0 953 0 117M
     ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536  -   -  0 1.01K 0 128M
     ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE  -   -  0 953 0 117M

重写期间zpool iostat 。 似乎对我来说, 我想

                                                 容量操作带宽
池分配空闲读写写读写
 -------------------------------------------- -----  - ---- ----- ----- ----- -----
 pool2 1.27T 2.35T 1015 923 125M 101M
  镜子651G 1.18T 505 465 62.2M 51.8M
     ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469  -   -  198 438 24.4M 51.7M
     ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX  -   -  306 384 37.8M 45.1M
  镜子651G 1.18T 510 457 63.2M 49.6M
     ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536  -   -  304 371 37.8M 43.3M
     ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE  -   -  206 423 25.5M 49.6M

这是我想知道发生了什么

zpool iostat

                                                 容量操作带宽
池分配空闲读写写读写
 -------------------------------------------- -----  - ---- ----- ----- ----- -----
 pool2 1.27T 2.35T 2.68K 32 339M 141K
  镜子651G 1.18T 1.34K 20 169M 90.0K
     ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469  -   -  748 9 92.5M 96.8K
     ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX  -   -  623 10 76.8M 96.8K
  镜子651G 1.18T 1.34K 11 170M 50.8K
     ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536  -   -  774 5 95.7M 56.0K
     ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE  -   -  599 6 74.0M 56.0K

iostat -x在同一个读操作。 请注意IO%如何不在100%。

设备:rrqm / s wrqm / sr / sw / s rkB / s wkB / s avgrq-sz avgqu -sz await r_await w_await svctm%util
 sdb 0.60 0.00 661.30 6.00 83652.80 49.20 250.87 2.32 3.47 3.46 4.87 1.20 79.76
 sdd 0.80 0.00 735.40 5.30 93273.20 49.20 251.98 2.60 3.51 3.51 4.15 1.20 89.04
 sdf 0.50 0.00 656.70 3.80 83196.80 31.20 252.02 2.23 3.38 3.36 6.63 1.17 77.12
 sda 0.70 0.00 738.30 3.30 93572.00 31.20 252.44 2.45 3.33 3.31 7.03 1.14 84.24

zpool和testing数据集设置:

  • 一时closures
  • 压缩closures
  • ashift是0(autodetect – 我的理解是,这是确定的)
  • zdb说磁盘都是ashift = 12
  • 模块 – 选项zfs zvol_threads = 32 zfs_arc_max = 17179869184
  • sync =标准

编辑 – 2015年10月30日

我做了更多的testing

  • 数据集bonnie ++ w / recordsize = 1M = 226MB写入,392MB读取好多了
  • 数据集dd w /logging大小= 1M =写入260MB,392MB读取好得多
  • zvol w / ext4 dd bs = 1M = 128MB写入,107MB读取为什么这么慢?
  • 数据集2并行处理= 227MB写入,396MB读取
  • dd direct io在数据集和zvol上没有什么不同

随着logging容量的增加,我的performance更加开心。 几乎池中的每个文件都超过1MB。 所以我会像这样离开。 磁盘还没有得到100%的利用率,这让我想知道它是否还可以更快。 而现在我想知道为什么zvolperformance如此糟糕,因为这是我(轻微)使用的东西。

我很乐意提供评论/答复中所要求的任何信息。 在我的另一个问题中也发布了大量的信息: 在同一台服务器上的NFS / CIFS目录之间慢速复制

我完全意识到,我可能只是不明白的东西,这可能不是一个问题。 提前致谢。

要说清楚,问题是: 为什么ZFS池不如我预期的那么快? 也许还有什么不对吗?

我设法让速度非常接近我期待的数字。

我正在寻找400MB /秒,并pipe理392MB /秒 。 所以我说这个问题解决了。 随着后来增加一个caching设备,我pipe理458MB /秒的读取(caching我相信)。

这个起初只是通过将ZFS数据集的logging值增加到1M

 zfs set recordsize=1M pool2/test 

我相信这种改变只会减less磁盘活动,从而提高大型同步读取和写入的效率。 正是我所要求的。

改变后的结果

  • bonnie ++ = 226MB写入,392MB读取
  • dd = 260MB写入,392MB读取
  • 并行2个进程= 227MB写入,396MB读取

2.当我添加caching设备(120GB SSD)时,我的pipe理更好。 写得慢一点,我不知道为什么。

 Version 1.97 ------Sequential Output------ --Sequential Input- --Random- Concurrency 1 -Per Chr- --Block-- -Rewrite- -Per Chr- --Block-- --Seeks-- Machine Size K/sec %CP K/sec %CP K/sec %CP K/sec %CP K/sec %CP /sec %CP igor 63G 208325 48 129343 28 458513 35 326.8 16 

caching设备的技巧是在/etc/modprobe.d/zfs.conf中设置l2arc_noprefetch=0 。 它允许ZFScachingstream/顺序数据。 只有在你的caching设备比你的数组快时,才能这样做。

在受益于我的数据集的logging更改后,我认为这可能是一个类似的方法来处理糟糕的zvol性能。

我碰到严重的人提到他们使用volblocksize=64k获得了良好的性能,所以我试了一下。 没有运气。

 zfs create -b 64k -V 120G pool/volume 

但后来我读了ext4(我正在testing的文件系统)支持像stridestripe-width这样以前从未使用过的RAID选项。 所以我用这个网站来计算所需的设置: https ://busybox.net/~aldot/mkfs_stride.html并再次格式化zvol。

 mkfs.ext3 -b 4096 -E stride=16,stripe-width=32 /dev/zvol/pool/volume 

我跑了bonnie++做一个简单的基准,结果非常好。 我不幸的是,我没有结果,但他们至less比我记得的5-6倍快。 我再次更新这个答案,如果我再次基准。

你的结果是完全合理的,而你的期望不是:你夸大了由RAID1给出的读取性能改进(以及扩展为RAID10)。 重点是双向镜像给出的单个磁盘的读取速度/ IOP 最多为 2倍,但是真实世界的性能可以是1x-2x之间的任何值。

让我们以一个例子来澄清。 想象一下,有一个双向镜像系统,每个磁盘能够达到100 MB / s(连续)和200 IOPS。 如果队列深度为1(最大单个,未完成的请求),则此arrays对单个磁盘没有任何优势:RAID1将两个磁盘队列上的IO请求拆分,但不会将一个请求拆分为两个磁盘(至less,我看到的任何实现都以这种方式performance)。 另一方面,如果你的IO队列更大(例如:你有4/8个未完成的请求),总的磁盘吞吐量将明显高于单个磁盘。

对于RAID0也可以做类似的事情,但是在这种情况下,决定平均改进的因素不仅是队列大小,而且IO请求的大小也是这样的 :如果平均IO大小低于块大小,则不会被分割在两个(或更多)磁盘上,但它将由单个服务。 Bonnie ++logging库增加的结果显示了这种确切的行为:条带化可以从更大的IO大小中获益。

现在应该清楚,将RAID10arrays中的两个RAID级别组合起来不会导致线性性能缩放,但会为其设置上限 。 我很确定,如果你运行多个dd / bonnie ++实例(或者使用fio直接操作IO队列),你的结果会更符合你原来的期望,因为你将会以更完整的方式对你的IOarrays征税(多个顺序/随机IO请求),而不是单独加载单个顺序的IO请求。