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


103

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

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


Для получения дополнительной информации см .: 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.


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

1
Жаль, что sync / umount не получал обновления от ядра и мог напечатать такие вещи напрямую, если бы им сказали.
MCR
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.