Общая стоимость ввода-вывода процесса

Вопрос или проблема

Я знаю, что 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, вы можете воспользоваться несколькими инструментами и методами. Вот несколько наиболее эффективных способов:

  1. Использование pidstat:
    pidstat — это утилита, которая позволяет отслеживать статистику процессов в реальном времени. Для получения информации о вводе-выводе, вы можете использовать следующую команду:

    pidstat -d -e <команда>

    Здесь <команда> — это процесс, который вы хотите отслеживать. pidstat будет собирать информацию о I/O, и когда процесс завершится, он выведет отчет.

  2. Использование iotop в пакетном режиме:
    Утилита iotop также может быть использована для отслеживания I/O. С помощью параметра --batch вы можете запустить её в неинтерактивном режиме, чтобы сохранить результаты в файл. Пример команды приведен ниже:

    sudo iotop --batch -qqq --accumulated | fgrep --line-buffered '% <ваша_команда> ' | tee ~/лог_вашей_команды.log

    Замените <ваша_команда> на имя вашего процесса. Это позволит вам сохранить вывод в файл, а также автоматически отфильтровать результаты по вашему процессу. В результате последний вывод в файле будет содержать общий расход I/O для этого процесса.

  3. Извлечение данных из /proc:
    Если вы хотите получить I/O статистику непосредственно перед и после выполнения процесса, вы можете использовать данные из системы файлов /proc. Для этого выполните следующие шаги:

    • Перед запуском процесса используйте:
      cat /proc/[pid]/io

      Замените [pid] на ID вашего процесса. Сохраните эти значения в переменные окружения.

    • После завершения процесса, снова выполните команду, чтобы получить текущие значения.
    • Разница между этими двумя значениями даст вам общее количество операций ввода-вывода, выполненных процессом.
  4. Пример скрипта для автоматизации:
    Вы можете создать простой скрипт, который будет автоматизировать этот процесс. Вот пример:

    #!/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, что обеспечит более глубокую аналитику и управление работой программ.

Оцените материал
Добавить комментарий

Капча загружается...