Могу ли я наблюдать за ходом операции синхронизации?

103

Я скопировал большой файл на USB-диск, смонтированный в системе Linux с помощью async. Это возвращает командную строку относительно быстро, но когда я печатаю, все sync, конечно, должно идти на диск, и это занимает много времени.

Я понимаю, что это будет медленно, но есть ли где-нибудь, где я могу наблюдать, как счетчик падает до нуля? Смотреть buffersв topне помогает.

mattdm
источник
Для получения дополнительной информации см .: lwn.net/Articles/572911
lanoxx

Ответы:

162

Глядя на /proc/meminfoэто покажет Dirtyчисло с течением времени, как все данные спулинга; часть из этого может пролиться Writebackтакже. Это будет сводка по всем устройствам, но в тех случаях, когда одно устройство в системе намного медленнее остальных, вы, как правило, в конечном итоге окажетесь там, где все в этой очереди связано с ним. Вы, вероятно, найдете Dirtyбольшое число, когда начнете, и syncзаканчивает примерно в то же время, когда оно приближается к 0. Попробуйте получить интерактивный дисплей:

watch -d grep -e Dirty: -e Writeback: /proc/meminfo

С обычными дисками я обычно могу проигнорировать Writeback, но я не уверен, чаще ли он задействован в пути передачи USB. Если он просто подпрыгивает вверх и вниз без четкой тенденции к нему, вы, вероятно, можете просто посмотреть на Dirtyчисло.

Грег Смит
источник
4
В моей системе обратная запись остается на уровне нескольких мегабайт до самого конца, когда Dirty опустеет, и в этот момент он тоже начнет снижаться.
Mattdm
24

Вы можете посмотреть /sys/block/<device>/statфайл для соответствующего устройства во время синхронизации. В 9- м столбце будет указано количество запросов в полете на устройстве, которое должно быть сведено к нулю после завершения синхронизации.
Не знаю, как перевести это в число байтов, но оно должно дать вам приблизительное представление о том, сколько «вещей» еще не принято.

Посмотрите файл stat.txt в документации ядра для получения дополнительной информации. (В inflightмоей системе также есть файл в этом каталоге, который, похоже, может содержать запросы на чтение и запись в полете, но я не могу найти документы для этого.)

Мат
источник
3
Просто для удобства, объединяя идею из другого ответа:watch -t -n1 'awk "{ print \$9 }" /sys/block/sdd/stat'
Mattdm
4
Для моей карты памяти USB это обычно колеблется около 150 на протяжении всей операции копирования и syncпосле нее. Это идет к 0, но только в самом конце. Это делает другой ответ более полезным для нетерпеливого наблюдения за прогрессом.
Mattdm
1
(Хотя теоретически мне нравится смотреть только на соответствующее устройство, а не на общесистемную информацию.)
mattdm
Есть ли способ получить количество записанных байтов (синхронизированных, сброшенных не в полете) или кэшированных для записи на диск? Если бы у меня был размер кэша записи на диск, я мог бы использовать его duдля вычисления реальных данных, которые синхронизируются на диске.
unfa
10

Используя ответ Грега, вы можете просто syncработать в фоновом режиме, отображая состояние блока Dirty в памяти.

Для этого просто запустите эту команду:

sync & watch -n 1 grep -e Dirty: /proc/meminfo

Это вызовет syncв фоновом режиме при выполнении watchв передней части. Когда syncкоманда будет завершена (примерно когда размер блока Dirty достигнет 0), вы получите вывод, который выглядит следующим образом:

1]  + 27260 done        sync

Это означает, что команда завершилась, и вы можете убить watchкоманду с помощью Ctrl+ C.

jflemieux
источник
Кстати: я знаю, что это старый вопрос, но он первый, который появляется в Google, когда кто-то ищет его, и я хотел добавить решение, которое нашел.
jflemieux
1
Жаль, что sync / umount не получал обновления от ядра и мог напечатать такие вещи напрямую, если бы им сказали.
MCR