мониторинг производительности для подмножества выполнения процесса

Я собираюсь собрать статистику приложения Linux для небольшого подмножества его выполнения программы. Это подмножество можно определить как первые n инструкций или первые n циклов.

Для определенного подмножества нас интересуют такие статистические данные, как точность предсказания ветвлений, частота попаданий в кеш и IPC ядра.

Похоже, что инструмент perf лучше всего подходит для такого мониторинга. Однако способ указать подмножество в perf - это запустить команду, которая дает информацию о подмножестве.

Пример: если я хочу собирать данные за первые n секунд, мне нужно выполнить следующую команду.

perf stat -p PID sleep n

Здесь я должен запустить программу, а затем прикрепить к этой программе perf, используя ее PID. Perf собирает данные для процесса с pid PID до тех пор, пока не будет запущена команда сна. Однако с момента начала выполнения моей программы до момента, когда перфоманс был присоединен к процессу, могло быть выполнено x инструкций. Поскольку x случайный, нет абсолютно никакого способа узнать, какие инструкции были профилированы perf.

Я был бы полезен предложениями, которые позволят мне контролировать выполнение программы.

  1. в течение первых n секунд, или
  2. из определенной точки выполнения программы (имя некоторой функции или указатель инструкции)

person prathmesh.kallurkar    schedule 20.08.2014    source источник
comment
Можете взломать исходный код программы?   -  person Manuel Selva    schedule 17.09.2014
comment
Удалось ли вам это сделать?   -  person emotionull    schedule 07.11.2014
comment
@emotionull Я ответил на вопрос. Посмотрим, поможет ли это   -  person prathmesh.kallurkar    schedule 08.11.2014


Ответы (1)


Мы использовали простой способ решения этой проблемы.

Назовем отслеживаемую программу M, а x секунд - это время, за которое необходимо собрать статистику производительности.

Мы написали программу P, которая разветвляет M, а затем спит на x секунд. После пробуждения ото сна программа P убивает себя и всех своих потомков.

if(fork()!=0)
then
     sleep x seconds
     kill me
else
     execute monitored program
endif

Запустите perf (служебную программу для сбора данных о производительности) для программы P. Статистика отражает характеристики программ P и M. Поскольку программа P не выполняет каких-либо тяжелых операций, это не сильно повлияет на статистику производительности.

Следует отметить, что продолжительность мониторинга программы должна быть достаточно большой, чтобы затмить статистику программы P.

person prathmesh.kallurkar    schedule 08.11.2014
comment
Спасибо. Вы знаете, как это сделать для первых n инструкций вместо секунд? - person emotionull; 08.11.2014
comment
Неа. Но вы можете написать сценарий, который использует двоичную сортировку по временному диапазону, чтобы получить желаемое количество инструкций. Это приблизительный подход. Посмотрим, поможет ли это - person prathmesh.kallurkar; 09.11.2014