Измерение пикового использования диска процессом
Я пытаюсь сравнить инструмент, который разрабатываю, с точки зрения времени, памяти и использования диска. я знаю /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 МБ / час.