ZFS 副本通过 zfs send 从主本复制过来,逻辑数据一样,但物理占用却大很多。根因是副本节点的 raidZ 布局(高可用 + 条带)与 16k 块大小不适配,造成空间膨胀。

现象

ZFS 副本比主本大很多。主本数据:

root@node1:~# zfs get all vpool/vol-example
NAME                PROPERTY                    VALUE                                SOURCE
vpool/vol-example   type                        filesystem                           -
vpool/vol-example   creation                    Thu Apr 24 13:59 2025                -
vpool/vol-example   used                        3.94T                                -
vpool/vol-example   available                   6.02T                                -
vpool/vol-example   referenced                  3.94T

上面是主本数据,下面是副本数据。 副本是通过 zfs send 过来的,按道理两者应该是一样的。 但是副本的 used 是 4.75T,主本是 3.94T:

root@node2:~# zfs get all vpool/vol-example
NAME                PROPERTY                    VALUE                                SOURCE
vpool/vol-example   type                        filesystem                           -
vpool/vol-example   creation                    Sun Aug 23 10:48 2026                -
vpool/vol-example   used                        4.75T                                -
vpool/vol-example   available                   627G                                 -
vpool/vol-example   referenced                  4.75T

排查

后排查了解发现,实际逻辑数据也是一样的,都是 3.92T:

vpool/vol-example   logicalreferenced            3.92T                                -

根因

副本的占用空间为什么大?是因为副本节点的 zpool 是 raidZ 组成的。

raidZ 高可用,加条带原因和 16k 的块大小不适配,导致实际占用膨胀。

另一方面也需要看压缩,zfs 自带压缩,这个要注意。

小结

  • 逻辑数据一样(logicalreferenced 都是 3.92T),但物理占用不同;
  • 根因是副本节点的 raidZ 布局(高可用 + 条带)与 16k 块大小不适配,造成空间膨胀;
  • 排查 ZFS 空间问题时,要区分 used(物理占用)和 logicalreferenced(逻辑数据量);
  • 还要注意 zfs 自带的压缩特性对空间的影响。