Знайте, какой процесс выполняет I / O без iotop

В Linux я хочу знать, какой процесс использует мой дисковый ввод-вывод.

Я знаю, что могу использовать iotop но у меня есть машина, где по разным причинам iotop нельзя установить.

Как я могу вручную получить эту информацию? (Как происходит сам iotop ?)

One Solution collect form web for “Знайте, какой процесс выполняет I / O без iotop”

Файл в /proc/<pid>/io представляет то, что вам нужно. Это небольшая работа по созданию сценариев, чтобы получить выход, похожий на iotop . См. Документацию ядра Linux в значениях /proc/<pid>/io :

rchar

Счетчик ввода / вывода: чтение chars Количество байтов, которые эта задача вызвала для чтения из хранилища. Это просто сумма байтов, которые этот процесс передал read () и pread (). Он включает в себя такие вещи, как tty IO, и на него не влияет то, требуется ли фактический физический диск IO (чтение могло быть выполнено из pagecache)

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 секунды. Если вы хотите писать ввод-вывод вместо чтения ввода-вывода, просто отредактируйте команду 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) 
  • Усреднение по многим строкам данных
  • Git Bash для Ubuntu / Linux и Windows требует перезагрузки ssh-agent
  • Сценарий оболочки для проверки наличия одного или нескольких файлов с определенным расширением?
  • Опция ls -e недоступна в linux
  • передать параметры скрипту bash, используя атрибуты шеф-повара
  • Инструменты и стратегии для анализа устаревшего приложения на основе сценариев оболочки
  • sed повторяет последнюю строку в потоке
  • scp (v4) копирование с удаленного на несколько локальных имен файлов
  • Цитирование и побег
  • Как включить команду Diff в скрипт bash с подсказкой
  • Как ожидать от PID от вызванного процесса?
  • Linux и Unix - лучшая ОС в мире.