Hard-Drive

為什麼 ZFS 重新同步器會掃描整個池?

  • June 12, 2015

我有一個 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 是相互獨立的,所以一個 resilver 不應該需要對其他 vdev 進行任何掃描。為什麼 zfs 在重新同步時會掃描所有已使用的磁碟空間?

重新同步是一個 vdev 操作;正如您暗示的那樣,僅該 vdev 中的儲存設備用於重建新設備。我不確定為什麼它引用了 zpool 的完整大小,但我懷疑開發人員從清理函式中藉用了程式碼,或者它只是引用了完整的 zpool 大小,因為那將是最壞的情況。

重新同步(和清理)涉及遍歷池的整個 B 樹,並重新同步失去磁碟上的塊。

如果不遍歷樹中的每一個 txg,它就無法知道失去的磁碟上會存在哪些塊,因此它會掃描整個元數據世界以查找池。

它不一定要讀取所有數​​據,只要有足夠的元數據來確定它是否真的需要讀取相應的數據。您可能會看到進度資訊比正在讀取的實際數據量上升得更快,因為它實際上是在計算它已讀取的元數據引用的數據量。

引用自:https://serverfault.com/questions/686765