请教各位 Linux 下 OpenZFS 的奇怪的 I/O 表现

222 天前
 gridsah

帖接上回 https://www.v2ex.com/t/977732 https://www.v2ex.com/t/977930

我在 Debian12 (6.1 kernel) 上装了 OpenZFS (zfs-kmod-2.1.12-2~bpo12+1),功能看起来没有什么问题。

系统正常启动,池的创建和销毁,SLOG 和 cache 的添加、删除,ZFS 属性变更,都没啥问题。

建好 zpool (4x8T raidz1),加入 slog 和 cache ,创建对应 dataset ,接上我的冷备盘,用 ro 参数挂载冷备盘的 ext4 分区开始往 zpool 搬数据 (rsync)。冷备盘和 zpool 的磁盘型号相同,硬盘盒是世特力 2 盘位的硬盘底座。

第一个奇怪的问题出现了,我从冷备盘往系统盘 (Intel S3710 200G) 拷数据,可以正常跑满冷备盘的读带宽 280M/s ,但是我往 dataset 同步数据时候 rsync 显示的速度只有 20M/s 以下 (17-19M/s)。倒是,命令启动的瞬间可以跑满冷备盘的读带宽。而且在 zpool dataset 之间转移数据性能表现看起来是正常的。

我以为是 async I/O 没开,zfs set sync=disabled <zpool>,I/O 速度没变。从这里开始感觉有点奇怪了,然后我使用 zfs set sync=always <zpool> 让所有 I/O 先打在 SLOG 上,I/O 速度也没变。这里测完我怀疑 OpenZFS 对这个版本的内核有兼容问题。

但这套硬件在 FreeBSD 13.2 上正常的速度是,async I/0 可以长时间维持在至少 100M/s (1G 网口) 的速度,上限我没测。sync I/O 在两条傲腾 16G 的加持下,可以长时间维持在 55M/s 。

rsync 跑了 8h 之后数据只同步了 750G 。这个写入性能显然不对。

也肯定不是我 rsync 参数写的有问题,因为 rsync 的官方文档也是我翻译的 https://note.lishouzhong.com/article/translation/sitemap-index.html

第二个奇怪的问题是,我用 zpool iostat -v 1 看到 I/O 表现可以和 rsync 显示的值对应上。但是我从 watch iostat 看到的 I/O 表现是,我打断 rsync 的传输之后,iostat 依旧显示硬盘有 I/O 而且和刚才 rsync 的传输速度接近,并且 I/O 一直不会回归正常 (这个正常是指相对于系统盘显示的只有几 K/s 的速度)。

而且哪怕 SLOG 在 zpool iostat -v 1 显示没有 I/O ,它在 iostat 也显示有 I/O 操作,I/O 速度和 SLOG 正常的工作速度相同。并且只要有一次 I/O ,iostat 就显示 SLOG 一直有 I/O 。cache 也一样,一直显示有写入操作。而且速度看起来像是真的,因为那个数字一直在小范围上下波动。

总结起来就是,iostat 显示的 I/O 指标有问题,并且看起来像是真的; zpool iostat 显示的 I/O 指标和期望相同,没有问题。

至于读性能的话,已经拷进 zpool 的数据可以以跑满 1G 网口的速度被传输到群晖上。但我可以确定我用于测试的,传往群晖数据都在内存的 ARC 里,各位如果要冷数据传输到群晖的速度的话我再去测,这个操作有点费时间。

各位有没有思路?

1120 次点击
所在节点    程序员
10 条回复
kokutou
222 天前
是不是硬件有问题。。。
gridsah
222 天前
@kokutou #1 你还真别说..... 我把 zpool 里的一个盘格成了 ext4 ,冷备盘往这个盘里拷数据,写性能一样....

这让我想起来 Gen10 的板载 raid 卡有 bug 来着,所有的 3.5 寸硬盘都接在这个 raid 卡上。
gridsah
222 天前
这 20M/s 的速度让我有一个可怕的想法.....
是不是我脑残地把 usb 3.0 的线插到了 usb 2.0 的接口上.....
等我去翻翻惠普的产品说明......
gridsah
222 天前
果然,我把数据线插到了 usb 2.0 的接口上。
Gen10 背面 4 个 usb 接口长得一样,两两排布,左边的是 3.0 右边的是 2.0 。
现在第一个问题解决了。

第二个问题,sysstat 包中的 iostat 报告的 I/O 不对。还是没有头绪。
oldshensheep
222 天前
iostae 的问题其实 openzfs 的官方文档上有写的
zpool iostat Displays logical I/O statistics for the given pools/vdevs. Physical I/O statistics may be observed via iostat

https://openzfs.github.io/openzfs-docs/man/master/8/zpool-iostat.8.html
gridsah
221 天前
@oldshensheep #5 我注意到了,但是 zpool iostat 显示负载消失之后,physical I/O 展示的负载依旧和负载消失前的值一样,并且,一直都显示有负载,关键这个值还在跳动,就像是真的有这样的负载一样。我查了一晚上文档,没有头绪。
地铁、老头、看手机.jpg
oldshensheep
221 天前
iostat 和 zpool iostat 的行为是一样的,你要用 iostat 1 来表示每秒刷新,而不是用 watch iostat 。
不然的话和 zpool iostat 一样显示的是自启动以来的平均值
gridsah
221 天前
@oldshensheep #7 zpool iostat 显示的是实时负载吧?
我看 zpool 没有负载之后 zpool iostat 1 显示的一直是 0 值。
oldshensheep
221 天前
因为你加了 1 ,1 代表每秒刷新一次,并且显示的是之前秒内的平均值

你用 iostat 1 就是和 zpool iostat 1 一样了
gridsah
221 天前
@oldshensheep #9 额,原来是这么回事。感谢解答。
我已经准备上 btrfs 的灵车了 😂😂
( PVE 还继续用 ZFS

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/978894

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX