V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
gridsah
V2EX  ›  程序员

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

  •  
  •   gridsah · 207 天前 · 1096 次点击
    这是一个创建于 207 天前的主题,其中的信息可能已经有所发展或是发生改变。

    帖接上回 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 里,各位如果要冷数据传输到群晖的速度的话我再去测,这个操作有点费时间。

    各位有没有思路?

    10 条回复    2023-10-05 16:06:11 +08:00
    kokutou
        1
    kokutou  
       207 天前 via Android
    是不是硬件有问题。。。
    gridsah
        2
    gridsah  
    OP
       207 天前
    @kokutou #1 你还真别说..... 我把 zpool 里的一个盘格成了 ext4 ,冷备盘往这个盘里拷数据,写性能一样....

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

    第二个问题,sysstat 包中的 iostat 报告的 I/O 不对。还是没有头绪。
    oldshensheep
        5
    oldshensheep  
       206 天前   ❤️ 1
    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
        6
    gridsah  
    OP
       206 天前
    @oldshensheep #5 我注意到了,但是 zpool iostat 显示负载消失之后,physical I/O 展示的负载依旧和负载消失前的值一样,并且,一直都显示有负载,关键这个值还在跳动,就像是真的有这样的负载一样。我查了一晚上文档,没有头绪。
    地铁、老头、看手机.jpg
    oldshensheep
        7
    oldshensheep  
       206 天前   ❤️ 1
    iostat 和 zpool iostat 的行为是一样的,你要用 iostat 1 来表示每秒刷新,而不是用 watch iostat 。
    不然的话和 zpool iostat 一样显示的是自启动以来的平均值
    gridsah
        8
    gridsah  
    OP
       206 天前
    @oldshensheep #7 zpool iostat 显示的是实时负载吧?
    我看 zpool 没有负载之后 zpool iostat 1 显示的一直是 0 值。
    oldshensheep
        9
    oldshensheep  
       206 天前   ❤️ 1
    因为你加了 1 ,1 代表每秒刷新一次,并且显示的是之前秒内的平均值

    你用 iostat 1 就是和 zpool iostat 1 一样了
    gridsah
        10
    gridsah  
    OP
       206 天前
    @oldshensheep #9 额,原来是这么回事。感谢解答。
    我已经准备上 btrfs 的灵车了 😂😂
    ( PVE 还继续用 ZFS
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3725 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 00:53 · PVG 08:53 · LAX 17:53 · JFK 20:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.