Знайте, який процес виконує введення / виведення без іотопу


12

У Linux я хочу знати, який процес використовує пропускну здатність мого диска вводу / виводу.

Я знаю, що можу використовувати, iotopале у мене є машина, на якій з різних причин iotopнеможливо встановити.

Як я можу отримати цю інформацію вручну? (Як iotopсаме протікає?)

Відповіді:


15

Файл /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)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.