Чому не читається з / dev / zero count як IO_RBYTES?


25

Я спорожняю жорсткий диск на деяких ОС Linux 4.x за допомогою цієї команди:

sudo sh -c 'pv -pterb /dev/zero > /dev/sda'

І я відкрив ще одну десятку і почав sudo htopі помітив це:

  PID USER      PRI  NI CPU%   RES   SHR   IO_RBYTES   IO_WBYTES S   TIME+  Command
 4598 root       20   0 15.5  1820  1596        4096    17223823 D  1:14.11 pv -pterb /dev/zero

Значення для IO_WBYTESздається цілком нормальним, але IO_RBYTESзалишається на рівні 4 KiB і ніколи не змінюється.

Наприклад, я запустив кілька інших програм

dd if=/dev/zero of=/dev/zero
cat /dev/zero > /dev/zero

і був здивований, побачивши, що жоден з них не створює багато IO_RBYTESабо IO_WBYTES.

Я думаю, що це не характерно для будь-якої програми, але чому б не читати /dev/zeroі записувати, щоб /dev/{zero,null}рахувати як байти вводу / виводу?


5
Мені цікаво, чому ти вважаєш, що вони повинні вважатися введенням / виведенням?
marcelm

1
@marcelm Я думаю, що будь-який вхід / висновок повинен вважатися входом / виходом, включаючи файли R / W, мережеві введення / виведення та багато іншого.
iBug

але ці операції виконують введення-виведення на апаратне забезпечення (диск та мережева карта відповідно) та мають пройти через деяку шину вводу-виводу (наприклад, PCI-express), і все це може бути значним вузьким місцем. Пишемо, скажімо, /dev/nullне закінчуйте взаємодії з таким обладнанням і не засмічують шини вводу / виводу. Доведено до крайності; читаються / записуються в / з пам'яті також I / O? Звичайно, для цих речей немає чіткого розмежування, і все залежить від того, яку точку зору ви сприймаєте в цих речах, і наскільки корисна ця перспектива виявляється для вас.
marcelm

1
Зауважте, мій перший коментар мав на меті змусити вас (та інших) задуматися над цими перспективами та з'ясувати, чому ви сприймаєте свою точку зору. Я не маю на увазі підкреслити, що ти помилився; Я навіть не думаю, що ситуація така чорно-біла. Але особисто я був би набагато більше зацікавлений статистикою вводу / виводу до фактичного обладнання (що може бути дуже вузьким місцем), ніж до /dev/{null,zero}(що зазвичай не є вузьким місцем). Це просто моя точка зору :)
marcelm

1
@marcelm Але я спочатку думав, що будь-який read(2)і write(2)вважається введенням / виводом , що є дуже розумним у власному розумінні.
iBug

Відповіді:


54

Вони рахуються як введення / виведення, але не типу, що вимірюється полями, які ви дивитесь.

В htop, IO_RBYTESі IO_WBYTESпоказати read_bytesі write_bytesполя з /proc/<pid>/io, і ці поля вимірювання байтів , які проходять через блок шари. /dev/zeroне включає блок-шар, тому читання з нього не відображаються там.

Щоб побачити введення / вивід з /dev/zero, потрібно подивитися на поля rcharта wcharполя /proc/<pid>/io, які відображаються htopяк RCHARі WCHAR:

rchar : символи, прочитані

Кількість байтів, через які це завдання було прочитано зі сховища. Це просто сума байтів, до якої цей процес перейшов read(2)і подібні системні виклики. Він включає такі речі, як термінал вводу / виводу, і це не впливає на те, чи потрібен був фактичний фізичний диск вводу-виводу (читання, можливо, було задоволено з кеш-сторінки).

wchar : символи написані

Кількість байтів, які це завдання спричинило або повинно спричинити запис на диск. Тут застосовуються подібні застереження, як і у rchar.

Дивіться man 5 procта man 1 htopдля деталей.


Так це rcharі wcharвважає байти від дзвінків до read(2)і write(2), правда?
iBug

Так, правильно.
Стівен Кітт

9
Поговоріть про оманливі фрази на описі rchar . Все, що пройшло, read()напевно, не "читається зі сховища "!
ilkkachu

2
@ilkkachu storageвони означають "будь-яку мислиму шину", незалежно від того, чи є зберігання фізичним чи віртуальним, або mmap'd, або віртуальним сокетом, або в кеш-пам'яті L1 - це просто все, що перебуває поза картографічною пам'яттю цієї програми, включаючи спільну
cat
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.