Измерение пикового использования диска процессом

Я пытаюсь сравнить инструмент, который разрабатываю, с точки зрения времени, памяти и использования диска. я знаю /usr/bin/time дает мне в основном то, что я хочу для первых двух, но для использования диска я пришел к выводу, что мне придется свернуть свой собственный скрипт bash, который периодически извлекает содержимое "записанных байт" /proc/<my_pid>/io, Основываясь на этом сценарии, вот что я придумал:

"$@" &
pid=$!
status=$(ps -o rss -o vsz -o pid | grep $pid)
maxdisk=0
while [ "${#status}" -gt "0" ];
do
    sleep 0.05
    delta=false
    disk=$(cat /proc/$pid/io | grep -P '^write_bytes:' | awk '{print $2}')
    disk=$(disk/1024)
    if [ "0$disk" -gt "0$maxdisk" ] 2>/dev/null; then
        maxdisk=$disk
        delta=true
    fi
    if $delta; then
        echo disk: $disk
    fi
    status=$(ps -o rss -o vsz -o pid | grep $pid)
done
wait $pid
ret=$?
echo "maximal disk used: $maxdisk KB"

К сожалению, я сталкиваюсь с двумя проблемами:

  • Во-первых, я передаю выходные данные этого скрипта вместе с инструментом, который я хотел бы сравнить с файлом, и иногда кажется, что эти потоки мешают, что приводит к тому, что в нижней части этот файл.
  • Вторая проблема заключается в том, что я не знаю, что делать с процессами, которые удаляют временные файлы как часть своего процесса. В этом случае я думаю, что справедливым эталоном будет запись максимального использования чистого диска (т. Е. Максимума записанных байтов - стертых байтов), но я не знаю, где можно найти вторую часть этой разницы.

Как я могу решить эти проблемы?

3 ответа

Решение

Вы можете посмотреть на filetop от BCC - Инструменты для анализа ввода-вывода Linux на основе BPF, создания сетей, мониторинга и многого другого:

tools / filetop: файл читает и пишет по имени файла и процессу. Топ для файлов.

Этот скрипт работает, отслеживая vfs_read() а также vfs_write() функции, использующие динамическую трассировку ядра, которая использует явные вызовы чтения и записи. Если файлы читаются или пишутся с использованием других средств (например, через mmap()), то они не будут видны при использовании этого инструмента.

Брендан Грегг дает хорошие доклады и демонстрации о Linux Performance Tools, они весьма поучительны.

В конце концов я обнаружил похожий вопрос: как измерить чистое изменение используемого дискового пространства в результате активности определенного процесса в Linux?,

Судя по полученным ответам, эта проблема кажется сложной, из-за сложности отслеживания всех типов изменений, которые могут быть инициированы данным процессом.

Там также упоминается Dtrace, но, насколько я понимаю, он является собственностью Sun (или, я полагаю, Oracle сейчас?) И поэтому доступен по умолчанию только в Solaris. В конце концов я нашел этот репозиторий Github, стремясь восполнить этот пробел для пользователей Linux.

Вы можете думать об этом по-другому, совсем не беспокоиться об удаленных файлах, используя несколько временных меток в своих записях, давая вам:

  • Диск пишет дельта со временем. например, 8 ГБ / день. Не имеет значения, все ли это в /tmp. Каждый раз, когда запускается новое среднее значение, сохраненное на диск, со счетчиком, чтобы сохранить скользящее среднее. Таким образом, если каждый час вашего процесса с ошибками составляет 2 ГБ, затем 1 ГБ, затем 0 ГБ, каждый час, то есть 1 ГБ / час (для периода времени)
  • Для каждого снимка вы выбираете самый высокий показатель, в данном случае 2 ГБ на первый час работы. Если вы запускаете скрипт каждый час, и он всегда равен 0 ГБ, он сообщит о 2 ГБ в первый час. Затем, если в крошечных играх он поднимется и опустит 5 ГБ, вы увидите, что "пик" покажет, что в 3 часа ночи, в среднем, 333 МБ / час.
Другие вопросы по тегам