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 自带的压缩特性对空间的影响。