Назад | Перейти на главную страницу

Почему Resilver ZFS сканирует весь пул?

У меня есть 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, поскольку это был бы наихудший сценарий.