У меня есть zpool, где я только что заменил неисправный диск и начал перенос данных на новый диск.
Я не понимаю, почему zpool status
говорит, что хочет просканировать 129 ТБ, когда размер vdev составляет ~ 30 ТБ. Когда я смотрю на iostat -nx 1
тогда я вижу, что 5 дисков в vdev получают тяжелые чтения, а новый диск - тяжелые записи. Таким образом, 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 сканирует все используемое дисковое пространство при переносе обновлений?
Восстановление серебра (и очистка) включает обход всего B-дерева пула и повторное серебрение блоков, которые были бы на отсутствующем диске.
Без обхода каждого отдельного txg в дереве он не может знать, какие блоки могли бы быть на отсутствующем диске, поэтому он сканирует всю вселенную метаданных для пула.
Это не обязательно читать все данные, только метаданные, достаточные для определения, действительно ли нужно читать соответствующие данные или нет. Вероятно, вы увидите, что информация о прогрессе увеличивается быстрее, чем фактический объем считываемых данных, поскольку на самом деле он учитывает объем данных. упомянутый по прочитанным метаданным.
Перенос обновлений - это операция vdev; поскольку вы подразумевали, что только устройства хранения в этом vdev используются для восстановления нового устройства. Я не уверен, почему он цитирует полный размер zpool, но я подозреваю, что разработчики позаимствовали код из функций scrub или что он просто цитирует полный размер zpool, поскольку это был бы наихудший сценарий.