Hard-Drive
為什麼 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 是相互獨立的,所以一個 resilver 不應該需要對其他 vdev 進行任何掃描。為什麼 zfs 在重新同步時會掃描所有已使用的磁碟空間?
重新同步是一個 vdev 操作;正如您暗示的那樣,僅該 vdev 中的儲存設備用於重建新設備。我不確定為什麼它引用了 zpool 的完整大小,但我懷疑開發人員從清理函式中藉用了程式碼,或者它只是引用了完整的 zpool 大小,因為那將是最壞的情況。
重新同步(和清理)涉及遍歷池的整個 B 樹,並重新同步失去磁碟上的塊。
如果不遍歷樹中的每一個 txg,它就無法知道失去的磁碟上會存在哪些塊,因此它會掃描整個元數據世界以查找池。
它不一定要讀取所有數據,只要有足夠的元數據來確定它是否真的需要讀取相應的數據。您可能會看到進度資訊比正在讀取的實際數據量上升得更快,因為它實際上是在計算它已讀取的元數據引用的數據量。