为什么 ZFS 重新同步要扫描整个池?

为什么 ZFS 重新同步要扫描整个池?

我有一个 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,它就无法知道哪些块位于丢失的磁盘上,因此它会扫描池的整个元数据世界。

不一定所有数据,只有足够的元数据才能确定是否真的需要读取相应的数据。您可能会看到进度信息比实际读取的数据量上升得更快,因为它实际上计算的是数据量提到通过它所读取的元数据。

相关内容