Відповіді:
Файл /proc/<pid>/io
представляє те, що вам потрібно. Це трохи сценарій роботи, щоб отримати результат, подібний до iotop
. Перегляньте документацію на ядро Linux на /proc/<pid>/io
значення файлу:
рчар
Лічильник вводу-виводу: прочитані символи Кількість байтів, через які це завдання було прочитано зі сховища. Це просто сума байтів, яку цей процес передав для читання () та pread (). Він включає такі речі, як tty IO, і на нього не впливає, чи потрібен був фактичний IO фізичного диска (читання може бути задоволено з кеш-сторінки)
wchar
Лічильник вводу / виводу: символи записані Кількість байтів, викликаних цим завданням, або повинні спричинити запис на диск Тут застосовуються подібні застереження, як і у rchar.
[...]
read_bytes
Лічильник вводу / виводу: байти читають Спроба підрахувати кількість байтів, які цей процес насправді спричинив вилучення із рівня зберігання. Зроблено на рівні submit_bio (), тому це точно для файлових систем, що підтримуються блоком.
write_bytes
Лічильник вводу / виводу: байти, написані Спроба підрахувати кількість байтів, які цей процес спричинив надсилання до рівня зберігання. Це робиться під час розмивання сторінок.
Тепер ви можете використовувати цей невеликий bash
сценарій:
#!/bin/bash
if [ "$(id -u)" -ne 0 ] ; then
echo "Must be root" 2>&1
exit 1
fi
delay=2
lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)
while :; do
echo "-----"
listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^rchar /proc/$p/io 2>/dev/null; done)
echo "$lista" | while read -r pida xa bytesa; do
[ -e "/proc/$pida" ] || continue
echo -en "$pida:\t"
bytesb=$(echo "$listb" | awk -v pid=$pida '$1==pid{print $3}')
echo "$((($bytesb - $bytesa) / $delay)) b/s"
done | sort -nk2 | tail
sleep $delay
listb=$lista
done
Він створює два списки із затримкою на 2 секунди ( $delay
: можна збільшити або зменшити) між ними, а потім порівнює списки та обчислює різниці. 10 процесів з найбільшим входом / виводом друкуються з їх смугою вводу / виводу за останні 2 секунди. Якщо ви хочете написати I / O замість того, щоб прочитати I / O, просто відредагуйте grep
команду у списках wchar
замість rchar
:
lista=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)
listb=$(for p in $(pgrep "."); do echo -n "$p "; grep ^wchar /proc/$p/io 2>/dev/null; done)