![为什么 ZFS 重新同步要扫描整个池?](https://linux22.com/image/657242/%E4%B8%BA%E4%BB%80%E4%B9%88%20ZFS%20%E9%87%8D%E6%96%B0%E5%90%8C%E6%AD%A5%E8%A6%81%E6%89%AB%E6%8F%8F%E6%95%B4%E4%B8%AA%E6%B1%A0%EF%BC%9F.png)
我有一个 zpool,我刚刚替换了一个故障磁盘,并开始重新同步到新磁盘。
我不明白的是,为什么zpool status
说要扫描 129TB,而虚拟设备的大小约为 30TB。当我查看时,iostat -nx 1
我可以看到虚拟设备中的 5 个磁盘正在大量读取,而新磁盘也大量写入。因此 zfs 不会像它所说的那样扫描所有数据。
# zpool status tank3 |head
pool: tank3
state: ONLINE
status: One or more devices is currently being resilvered. The pool will
continue to function, possibly in a degraded state.
action: Wait for the resilver to complete.
scan: resilver in progress since Thu Apr 30 09:59:15 2015
61.2T scanned out of 129T at 3.03G/s, 6h23m to go
946G resilvered, 47.34% done
问题
我想说的是,每个 vdev 都是相互独立的,因此一个 vdev 的重新同步不需要扫描其他 vdev。为什么 zfs 在重新同步时会扫描所有已使用的磁盘空间?
答案1
重新同步是一个 vdev 操作;正如您所暗示的,只有该 vdev 中的存储设备用于重建新设备。我不确定它为什么引用 zpool 的完整大小,但我怀疑开发人员借用了清理函数中的代码,或者它只是引用了完整的 zpool 大小,因为那将是最糟糕的情况。
答案2
重新镀银(和清理)涉及遍历池的整个 B 树,并重新镀银丢失磁盘上的块。
如果不遍历树中的每个 txg,它就无法知道哪些块位于丢失的磁盘上,因此它会扫描池的整个元数据世界。
不一定读所有数据,只有足够的元数据才能确定是否真的需要读取相应的数据。您可能会看到进度信息比实际读取的数据量上升得更快,因为它实际上计算的是数据量提到通过它所读取的元数据。