Вопрос или проблема
Я знаю, что iotop
позволяет мне в реальном времени измерять полосу диска, используемую любым или всеми процессами. iotop -a
измеряет накопленную полосу диска, что ближе к тому, что мне нужно.
Однако, когда запускаемый мной процесс завершается, он слишком быстро исчезает в iotop, и я не могу увидеть, сколько всего операций ввода/вывода использовал процесс с момента его начала. Есть ли способ записать общее использование ввода/вывода процесса по завершении и, возможно, сохранить это в файл для дальнейшего анализа?
Обратите внимание, что я ищу ответы исключительно для Linux, в частности для Ubuntu.
Попробуйте pidstat. Используйте его так: pidstat -d -e команда
pidstat
может предоставлять статистику для задач Linux. Параметр -d
указывает pidstat
собирать статистику ввода-вывода. pidstat
остановится и распечатает отчет, как только команда завершится.
iotop
имеет опцию --batch
, которую вы можете использовать для обработки не интерактивно. Это позволит вам, например:
sudo iotop --batch -qqq --accumulated | fgrep --line-buffered '% dd ' | tee ~/dd.log
Это даст выход, похожий на:
19804 be/4 user 0.00 B 0.00 B 0.00 % 0.00 % dd if=/dev/zero of=/tmp/log.1 bs=1M count=10000
19804 be/4 user 0.00 B 755.18 M 0.00 % 30.99 % dd if=/dev/zero of=/tmp/log.1 bs=1M count=10000
19804 be/4 user 0.00 B 1029.48 M 0.00 % 50.96 % dd if=/dev/zero of=/tmp/log.1 bs=1M count=10000
Последняя строка, соответствующая вашей строке fgrep(1)
(в этом примере ищем команду dd
), это ваша итоговая накопленная строка.
Кроме того, выход сохраняется в ~/dd.log
для вашего последующего анализа по мере необходимости. (вы также можете поменять местами порядок tee
и fgrep
, если хотите сохранить ВСЕ выходные данные iotop в файл лога, а не только данные, специфичные для dd
в примере)
Если приложение является единичным процессом, который вы можете запустить, и вы хотите получить счетчики ввода/вывода процесса в конце, то этот ответ может быть полезен:
Это работает, сохраняя счетчики ввода/вывода процесса оболочки из /proc/[pid]/io/
в переменную окружения перед запуском процесса, а затем вычитая их после завершения процесса.
Ответ или решение
Для определения общего I/O расхода процесса в Linux, особенно в Ubuntu, вы можете воспользоваться несколькими инструментами и методами. Вот несколько наиболее эффективных способов:
-
Использование pidstat:
pidstat
— это утилита, которая позволяет отслеживать статистику процессов в реальном времени. Для получения информации о вводе-выводе, вы можете использовать следующую команду:pidstat -d -e <команда>
Здесь
<команда>
— это процесс, который вы хотите отслеживать.pidstat
будет собирать информацию о I/O, и когда процесс завершится, он выведет отчет. -
Использование iotop в пакетном режиме:
Утилитаiotop
также может быть использована для отслеживания I/O. С помощью параметра--batch
вы можете запустить её в неинтерактивном режиме, чтобы сохранить результаты в файл. Пример команды приведен ниже:sudo iotop --batch -qqq --accumulated | fgrep --line-buffered '% <ваша_команда> ' | tee ~/лог_вашей_команды.log
Замените
<ваша_команда>
на имя вашего процесса. Это позволит вам сохранить вывод в файл, а также автоматически отфильтровать результаты по вашему процессу. В результате последний вывод в файле будет содержать общий расход I/O для этого процесса. -
Извлечение данных из /proc:
Если вы хотите получить I/O статистику непосредственно перед и после выполнения процесса, вы можете использовать данные из системы файлов/proc
. Для этого выполните следующие шаги:- Перед запуском процесса используйте:
cat /proc/[pid]/io
Замените
[pid]
на ID вашего процесса. Сохраните эти значения в переменные окружения. - После завершения процесса, снова выполните команду, чтобы получить текущие значения.
- Разница между этими двумя значениями даст вам общее количество операций ввода-вывода, выполненных процессом.
- Перед запуском процесса используйте:
-
Пример скрипта для автоматизации:
Вы можете создать простой скрипт, который будет автоматизировать этот процесс. Вот пример:#!/bin/bash # Запуск процесса <ваша_команда> & pid=$! # Получение начальных значений I/O read io_before < /proc/$pid/io # Ожидание завершения процесса wait $pid # Получение конечных значений I/O read io_after < /proc/$pid/io # Вычисление разницы echo "I/O stats before: $io_before" echo "I/O stats after: $io_after"
Эти методы позволяют вам эффективно отслеживать I/O расходы ваших процессов в Ubuntu, что обеспечит более глубокую аналитику и управление работой программ.