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