iotop показывает 1,5 МБ / с записи на диск, но все программы имеют 0,00 B / с.

18

Я не понимаю iotopвывод: он показывает ~ 1,5 МБ / с записи на диск (вверху справа), но все программы имеют 0,00 B / с. Почему?

введите описание изображения здесь

Видео было принято , как я удалить содержимое папки с несколькими миллионами файлов с использованием perl -e 'for(<*>){((stat)[9]<(unlink))}' , на Kubuntu 14.04.3 LTS x64.

iotopбыл запущен с помощью sudo iotop.

Франк Дернонкур
источник

Ответы:

22

Информация, отображаемая iotop, не собирается одинаково для отдельных процессов и для системы в целом. «Фактические» глобальные цифры не являются суммой цифр для каждого процесса (вот что такое «общее»).

Вся информация собирается из файловой системы proc .

  • Для каждого процесса, iotop считывает данные из , в частности, и значение. Это число байтов , переданных в и системных вызовов (включая варианты , такие как , , , и т.д.)./proc/PID/iorcharwcharreadwritereadvwritevrecvsend
  • Глобальные «реальные» значения считываются из /proc/vmstat, в частности, pgpginи pgpgoutзначение. Они измеряют данные, которыми обмениваются ядро ​​и оборудование (точнее, это данные, перемешанные на уровне блочных устройств в ядре).

Существует много причин, по которым данные для процесса и данные уровня блочного устройства различаются. Особенно:

  • Кэширование и буферизация означают, что ввод-вывод, происходящий на одном уровне, может не происходить в одно и то же время или столько же раз на другом уровне. Например, данные, прочитанные из кэша, учитываются как чтение из процесса, который обращается к нему, но нет соответствующего чтения с аппаратного обеспечения (что уже произошло ранее, возможно, от имени другого процесса).
  • Данные уровня процесса включают в себя данные, передаваемые по каналам, сокетам и другим устройствам ввода / вывода, которые не затрагивают базовый диск или другое блочное устройство.
  • Данные уровня процесса учитывают только содержимое файла, а не метаданные.

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

Я не думаю, что Linux предлагает какой-либо способ отслеживания обновлений метаданных файлов. Вы можете отслеживать ввод-вывод /sys/fsдля каждой файловой системы через записи для некоторых файловых систем. Я не думаю, что вы можете учесть ввод / вывод метаданных в отношении определенных процессов, это было бы очень сложно сделать в общем случае, так как несколько процессов могут вызывать чтение или изменение одних и тех же метаданных.

Жиль "ТАК - перестань быть злым"
источник
1
Довольно хороший ответ, спасибо. Вы бы посоветовали более надежный способ следить за развитием производства?
Руи Ф. Рибейро
1
@RuiFRibeiro Вы можете посмотреть, какой файл rm -rв настоящее время обрабатывается, используя straceего, но это не даст вам очень полезной оценки процента выполнения, так как порядок обхода в каждом каталоге несколько непредсказуем. Если в этой файловой системе выполняется только одна крупная операция и не слишком много жестких ссылок, наблюдение df -iпокажет, сколько файлов было обработано.
Жиль "ТАК - перестань быть злым"