ZFS池慢速顺序读取


10

关于这个问题,我有一个相关的问题,但是它太复杂,太大了,所以我决定将问题分为NFS和本地问题。我也曾尝试在zfs-discuss邮件列表中询问此问题,但收效甚微。

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

大纲:我的设置方式和期望

  1. 我有一个带有4个磁盘的ZFS池。2TB RED配置为2条带区镜像(RAID 10)。在Linux上,为zfsonlinux。没有缓存或日志设备。
  2. 跨镜像平衡数据(对于ZFS很重要)
  3. 每个磁盘可以并行方式以147MB /秒读取(原始w​​ / dd),从而提供588MB /秒的组合吞吐量。
  4. 我预计基于相似的4TB RED磁盘的基准,每个磁盘的顺序数据写入速度约为115MB /秒,读取速度为138MB /秒,并且每秒写入速度为50MB /秒。我期望读写速度不低于100MB /秒,因为这些天任何磁盘都可以做到。
  5. 我以为在负载读取或写入顺序数据的情况下,所有4个磁盘上的IO利用率都会达到100%。而且磁盘将以超过100MB /秒的速度输出,而利用率为100%。
  6. 我以为该池将使我在单个磁盘上获得大约2倍的写入,2倍的重写和4倍的读取性能- 我错了吗?
  7. NEW我以为在同一池上的ext4 zvol与ZFS的速度差不多

我实际上得到了什么

我发现该池的读取性能未达到我的预期

几天前池中的bonnie ++基准

版本1.97 ------顺序输出-------顺序输入--随机-
并发1-每Chr--块--重写--每Chr--块--寻求-
机器尺寸K /秒%CP K /秒%CP K /秒%CP K /秒%CP K /秒%CP /秒%CP
伊戈尔63G 99 99 232132 47 118787 27 336 97 257072 22 92.7 6

单个4TB RED驱动器上的bonnie ++本身在zpool中

版本1.97 ------顺序输出-------顺序输入--随机-
并发1-每Chr--块--重写--每Chr--块--寻求-
机器尺寸K /秒%CP K /秒%CP K /秒%CP K /秒%CP K /秒%CP /秒%CP
伊戈尔63G 101 99 115288 30 49781 14 326 97 138250 13 111.6 8

据此,基于单个4TB RED驱动器(它们是两倍)的结果,读取和重写速度是适当的。但是,我期望的读取速度约为550MB /秒(是4TB驱动器速度的4倍),我至少希望约为400MB /秒。相反,我看到的速度约为260MB /秒

bonnie ++从现在开始,同时收集以下信息。与以前不太一样,没有任何变化。

版本1.97 ------顺序输出-------顺序输入--随机-
并发1-每Chr--块--重写--每Chr--块--寻求-
机器尺寸K /秒%CP K /秒%CP K /秒%CP K /秒%CP K /秒%CP /秒%CP
伊戈尔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 505465 62.2M 51.8M
    ata-WDC_WD20EFRX-68AX9N0_WD-WMC300004469--198438 24.4M 51.7M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4MLK57MVX--306384 37.8M 45.1M
  镜子651G 1.18T 510457 63.2M 49.6M
    ata-WDC_WD20EFRX-68AX9N0_WD-WCC1T0429536--304371 37.8M 43.3M
    ata-WDC_WD20EFRX-68EUZN0_WD-WCC4M0VYKFCE--206423 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
标准偏差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和测试数据集设置:

  • 一次休息
  • 压缩已关闭
  • ashift为0(自动检测-我的理解是这样还可以)
  • zdb表示磁盘全部偏移= 12
  • 模块-选项zfs zvol_threads = 32 zfs_arc_max = 17179869184
  • 同步=标准

编辑-2015年10月30日

我做了更多测试

  • 数据集bonnie ++ w / recordsize = 1M =写入226MB,读取392MB 更好
  • 带记录大小的数据集dd = 1M =写入260MB,读取392MB 更好
  • zvol w / ext4 dd bs = 1M = 128MB写入,107MB读取为什么这么慢?
  • 数据集2并行处理=写入227MB,读取396MB
  • dd direct io在数据集和zvol上没有区别

随着记录容量的增加,我对性能更加满意。池中几乎每个文件都超过1MB。所以我就这样离开。磁盘仍然没有达到100%的利用率,这使我怀疑它是否仍然可以更快。现在我想知道为什么zvol性能如此糟糕,因为这是我(轻度)使用的东西。

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

我完全意识到,我可能只是不了解某些内容,而这可能根本不是问题。提前致谢。

明确地说,问题是:为什么ZFS池没有我期望的那么快?也许还有其他问题吗?


1
我怀疑没有调整,您是否为磁盘调整了档位?任何zfs.conf设置?时间开/关?任何奇怪的同步设置?
ewwhite

@ewwhite我已经为问题添加了一些细节,谢谢
Ryan Babchishin

参见:tomshardware.com/reviews/red-wd20efrx-wd30efrx-nas,3248-5.html WD Red驱动器的搜索时间很糟糕。它们可以正常运行,但是在实际使用情况下,它们将必须寻找,并且您的IO​​统计信息显示足够的IO操作/秒,因此寻找时间几乎肯定会影响您的性能。创建一个zvol并用于dd查看获得什么样的性能。您可能还想尝试直接IO,因为您要达到流式传输速度,其中来自缓存的双重缓冲会影响性能。FWIW,理论总原始4磁盘读取性能的3/4是好的。
安德鲁·亨利

(空间不足)您还拥有足够的磁盘,单线程IO操作可能不足以使磁盘完全繁忙。那可以解释你的%util数字。
安德鲁·亨利

@AndrewHenle谢谢。听起来很合理。我现在将调查。
Ryan Babchishin

Answers:


10

我设法使速度非常接近预期的数字。

我一直在寻找400MB /秒并管理392MB /秒。所以我说这是解决的问题。随着后来添加的缓存设备,我管理了458MB /秒的读取(我相信已缓存)。

1.这起初是通过增加ZFS数据集简单地实现recordsize值,以1M

zfs set recordsize=1M pool2/test

我相信此更改只会导致磁盘活动减少,从而使大型同步读取和写入更为有效。正是我要的。

变更后的结果

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

2.添加缓存设备(120GB SSD)时,我的管理甚至更好。写有点慢,我不确定为什么。

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

缓存设备的窍门是l2arc_noprefetch=0/etc/modprobe.d/zfs.conf中进行设置。它允许ZFS缓存流/顺序数据。仅当您的缓存设备比您的阵列快时才这样做,例如我的。

从数据集中的记录大小更改中受益后,我认为这可能是解决zvol性能较差的类似方法。

我遇到了一些苛刻的人,提到他们使用取得了不错的效果volblocksize=64k,所以我尝试了一下。没运气。

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

但是后来我读到ext4(我正在测试的文件系统)支持RAID和strideand的选项stripe-width,而我以前从未使用过。因此,我使用此站点来计算所需的设置:https : //busybox.net/~aldot/mkfs_stride.html并再次格式化zvol。

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

我跑来bonnie++做一个简单的基准测试,结果非常好。不幸的是,我没有结果,但是据我所知,它们的写入速度至少快5-6倍。如果我再次进行基准测试,我将再次更新此答案。


1
如果我能再给您+1的机会,让它在将近一年后回来并写出如此详细的答案,我会的。谢谢!
杰德·丹尼尔斯

0

您的结果是完全合理的,而您的期望却不是:您高估了RAID1(以及扩展为RAID10)带来的读取性能改进。关键是,两路镜像最多可为单个磁盘提供2倍的读取速度/ IOP,但实际性能可能介于1倍至2倍之间。

让我们用一个例子来阐明。想象一下,有一个带有2路镜像的系统,每个磁盘具有100 MB / s(顺序)和200 IOPS的能力。队列深度为1(最多单个未完成请求)时,该阵列将比单个磁盘没有优势:RAID1将IO请求拆分到两个磁盘的队列中,但不会将单个请求拆分成两个磁盘(至少,我看到的任何实施都以这种方式运行)。另一方面,如果您的IO队列更大(例如:您有4/8个未完成的请求),则总磁盘吞吐量将明显高于单个磁盘。

对于RAID0可以做类似的事情,但是在这种情况下,决定平均改进的不仅是队列大小的函数,而且取决于IO请求大小:如果您的平均IO大小小于块大小,则不会条带化放在两个(或更多)磁盘上,但将由一个磁盘提供服务。Bonnie ++记录大小增加的结果表明了此确切行为:更大的IO大小带来了很大的好处。

现在应该清楚,将RAID10阵列中的两个RAID级别组合在一起不会导致线性性能扩展,但是会为其设置上限。我非常确定,如果您运行多个dd / bonnie ++实例(或用于fio直接操作IO队列),您的结果将与最初的预期更加一致,这仅仅是因为您将以更完整的方式对IO数组进行赋值(多个单独的顺序/随机IO请求),而不是单独加载单个顺序的IO请求。


我的期望与我得到的期望几乎相同-400MB /秒。我获得392MB /秒。似乎合理。非常合理 我还并行运行了多个dd和bonnie ++进程,但根本看不到性能提高。您尚未解释zvol性能为何如此差。
Ryan Babchishin

仅使用Bonnie ++且记录大小较大(> = 1MB / s)时,您可以获得392 MB / s,我向您解释了原因。基于ZVOL的EXT4是我从未测试过的配置,因此我将其留给其他人评论。
shodanshok
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.