Есть ли способ измерить прогресс ext4lazyinit?

17

Я задал вопрос о ext4lazyinit здесь . Из всего, что я прочитал и понял, он просто позволяет вам начать использовать жесткий диск, не создавая все inode для вашей файловой системы.

Единственный способ , что вы знаете или может мера контроля ext4lazyinitв iotop. Есть ли способ получить его прогресс в процентах?

Shirish
источник
2
проверить это обсуждение патча
Krzysztof Stasiak
Вы пробовали утилиты bar [1] или pv [2]? [1]: [ archlinux.org/packages/community/any/bar/] [2]: [ archlinux.org/packages/community/x86_64/pv/]
mattia.b89
@ mattia.b89 ext4lazyinit - это не пользовательская программа, это фоновый процесс ядра. Проверьте информацию в ответе на вопрос, указывающий на первоначальный вопрос Шириша.
Остин Хеммельгарн
Кроме того, я склонен согласиться с оценкой Теда Тсо в обсуждении патча, которую @KrzysztofStasiak связал, если вы находитесь в ситуации, когда вам нужно ждать, пока это не закончится, вам, вероятно, не следует использовать его.
Остин Хеммельгарн
@KrzysztofStasiak Не могли бы вы дать ему ответ, я думаю , что это самый близкий к нему ответ, FWIW Тед Цо является синонимом ext *, поэтому, какими бы ни были его убеждения, они важны.
Шириш

Ответы:

1

Проверьте это обсуждение патча . Вы можете инициализировать систему без lazyinit, но не можете измерить ее. Если у вас есть время подождать, просто подождите. Вы можете попробовать патч из обсуждения, но в соответствии с Patchwork он имеет состояние "отклонено".

Кшиштоф Стасяк
источник
1

Кажется, я нашел способ приблизить прогресс ext4lazyinit.

TL; DR: см. Сценарий ниже.

Этот метод предполагает, что диск никогда не был отключен (и система не была перезагружена) с самого первого момента монтирования раздела, и что вы записали ровно столько данных, сколько используется на нем (поэтому удаление не требуется) или модификация файлов).

Шаг 1 : Сравните размер раздела в fdisk (в килобайтах) с количеством блоков в 1K, показанных в df. Вычтите (количество блоков 1K) из (размер раздела в килобайтах), чтобы получить (приблизительный размер таблицы inode).

РЕДАКТИРОВАТЬ: Пример, fdisk:

Sector size (logical/physical): 512 bytes / 4096 bytes
(...omitted...)
Device     Start         End     Sectors  Size Type
/dev/sdd1   2048 11720978398 11720976351  5.5T Linux filesystem

ДФ:

Filesystem              1K-blocks       Used  Available Use% Mounted on
/dev/mapper/workbackup 5813233164 1217095176 4596121604  21% /mnt/backup_work

11720976351 секторов * 512 байт / сектор / 1024 = 5860488175,5 КБ (почти 5,5 ТБ, как говорит fdisk). Минус df 5813233164 равен 47255011,5 кБ (около 45 ГиБ) для приблизительного размера таблицы inode.

Шаг 2 : Получить (всего килобайт записано в раздел):

awk '{ print $3"\t"$10 }' /proc/diskstats

Выберите правильную строку для вашего раздела и преобразуйте его в килобайты.

РЕДАКТИРОВАТЬ: пример:

sdb     260040
sdb1    260040
sdd     2530109116
sdd1    2530108940

Используя sdd1 в моем случае, общее количество записанных килобайт = 2530108940 секторов * 512 байт / сектор / 1024 = 1265054470 килобайт (почти 1,2 ТиБ).

Шаг 3 : Требуется, только если вы уже записали какие-либо данные в файловую систему. Вычтите (число ИСПОЛЬЗОВАННЫХ 1K-блоков, показанное в df) из (общее количество килобайт, записанных в раздел), чтобы получить (приблизительно килобайт, записанное в таблицу inode).

РЕДАКТИРОВАТЬ: пример: примерный килобайт записан в таблицу inode = 1265054470 (из шага 2) - 1217095176 (см. Вывод df в шаге 1) = 47959294 кБ (45,7 ГиБ)

Шаг 4 : Разделите (приблизительно килобайт, записанный в таблицу inode) на (приблизительный размер таблицы inode в килобайтах) и умножьте на 100, чтобы получить прогресс в процентах.

РЕДАКТИРОВАТЬ: пример: приблизительный прогресс = 47959294 / 47255011,5 * 100% = 101,5%

скрипт

Или написать это как частичный скрипт (где я отказываюсь писать скрипт для вызова fdisk по соображениям безопасности):

let sectorsize=$(cat /sys/block/sda/queue/hw_sector_size)
let partsize=$2*$sectorsize/1024
let fssize=$(df -- "$3" | tail -n -1 | awk '{print $2}')
let approxinodetablesize=$partsize-$fssize
let tkw=$(awk "/$1/"' {print $10}' /proc/diskstats | head -n 1)*$sectorsize/1024
let used=$(df -- "$3" | tail -n -1 | awk '{print $3}')
let tkw_inodetable=$tkw-$used
echo "Approximate progress: $(bc -l <<< "$tkw_inodetable*100.0/$approxinodetablesize") %"

Вызов с $ 1 = "имя раздела" (например, sdd1), $ 2 = "секторы раздела в соответствии с fdisk", $ 3 = "точка монтирования без косой черты"

Результаты теста

Я только один раз проверил свой метод. Настроить:

  • 6 ТБ раздел

  • шифрование с использованием cryptsetup

  • файловая система, созданная с параметрами по умолчанию, за исключением -m 0

  • 279 ГБ файлов, записанных в раздел до завершения ext4lazyinit.

Результат : чтение 99,7% на момент завершения :-)

РЕДАКТИРОВАТЬ: тот же диск, после записи почти другого ТиБ данных на него, теперь дает оценку 101,5%. Я думаю, что достаточно точен, чтобы быть полезным.

theaviatrix
источник
было бы лучше иметь пример, поэтому у нас есть представление о том, на что именно мы будем смотреть.
Шириш
@shirish Спасибо за ваше предложение.
theaviatrix