为什么ZFS重新启动程序扫描整个池?

我有一个zpool,我刚更换了一个失败的磁盘,并启动了一个到新磁盘的重新同步。

我不明白的是,为什么zpool status表示要扫描129TB,当vdev的大小是〜30TB。 当我查看iostat -nx 1我可以看到vdev中的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是相互独立的,所以一个人的应变不应该需要任何其他的扫描。 为什么zfs在重新同步时扫描所有使用的磁盘空间?

恢复是一个vdev操作; 因为只暗示该vdev中的存储设备用于重build新设备。 我不确定它为什么会引用zpool的全部大小,但我怀疑开发人员是从scrub函数借用的代码,或者只是引用了完整的zpool大小,因为这是最糟糕的情况。

复原(和擦洗)包括游走池中的整个B-Tree,以及重新擦银块,这些块会丢在丢失的磁盘上。

没有遍历树中的每一个txg,它都不知道丢失的磁盘上会有哪些块,因此它会扫描整个池的元数据Universe。

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