iotop, що показує 1,5 Мб / с запису диска, але всі програми мають 0,00 Б / с


18

Я не розумію iotopвихід: він показує ~ 1,5 Мб / с запису диска (праворуч вгорі), але всі програми мають 0,00 Б / с. Чому?

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

Відео було зроблено, коли я видаляв вміст папки з кількома мільйонами файлів за допомогою 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
Дуже приємна відповідь, дякую. Чи порадили б ви більш надійним способом прослідкувати еволюцію результатів?
Rui F Ribeiro

1
@RuiFRibeiro Ви можете дивитися, який файл rm -rзараз обробляється, використовуючи straceйого, але це не дасть вам дуже корисної оцінки відсотка завершення, оскільки порядок обходу в кожному каталозі дещо непередбачуваний. Якщо в цій файловій системі відбувається лише одна велика операція, і не задіяно занадто багато жорстких посилань, перегляд df -iпоказує, скільки файлів оброблено.
Жиль "ТАК - перестань бути злим"
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.