В программе без функция снаперфоманс хорошо собирает образцы графов вызовов.
void main()
{
while(true)
{
printf(...);
}
}
Например, более 1000 выборок в секунду.
Я собрал отчет о производительности с таким:
sudo perf report -p <process_id> -g
Однако, когда я делаю это с помощью программы с функцией сна, perf
плохо собирает образцы графа вызовов: всего несколько образцов в секунду.
void main()
{
while(true)
{
sleep(1);
printf(...);
}
}
Я хочу собрать образцы графа вызовов, даже если моя программа находится в состоянии сна, иначе говоря. время устройства. В Windows с ВСПерф, callgraph с состоянием сна также хорошо собран.
Сбор графа вызовов для состояния сна необходим для поиска узких мест в производительности не только во время ЦП, но и во времени устройства (например, при доступе к базе данных).
Я предполагаю, что может быть опция perf
для сбора образцов, даже если моя программа находится в состоянии сна, потому что не только я, но и многие другие программисты могут этого захотеть.
Как я могу получить образцы prof, даже если моя программа находится в спящем режиме?
После публикации этого вопроса мы обнаружили, что perf -c 1
захватывает около 10 образцов в секунду. Без -c 1
perf захватывала 0,3 отсчета в секунду. 10 выборок в секунду - это намного лучше, но все же намного меньше, чем 1000 выборок в секунду.
Есть ли способ лучше?
Когда вы указываете цель профилирования, perf
будет учитывать только события, которые были сгенерированы указанной целью. Совершенно естественно, что цель sleep
не генерирует много событий производительности.
Если вы хотите видеть другие процессы (например, базу данных?) В отчетах графа вызовов, попробуйте общесистемную выборку:
-a, --all-cpus
System-wide collection from all CPUs (default if no target is specified).
(со страницы руководства perf)
Кроме того, если вы планируете потратить много времени на изучение отчетов, есть инструмент, который я не могу вам порекомендовать: ПламяГрафы. Эта визуализация может сэкономить вам много усилий.
Спасибо. Тем не менее, у меня есть вопрос. Собирает ли общесистемная выборка образец моей программы, находящейся в состоянии сна? Если нет, как я могу определить, что моя программа находится в спящем состоянии, из образцов для других процессов?
Я попробовал опцию -a, но она по-прежнему недостаточно собирает образцы моей программы.
1) Общесистемная выборка собирает все, включая вашу программу сна; 2) Это потому, что ваша программа спит == ничего не делает.
Образцы ЦП, пока ваш процесс находится в состоянии сна, в основном бесполезны, но вы можете имитировать это поведение, используя событие, которое записывает начало и конец системного вызова сна (захват стеков), а затем просто добавляет «стеки сна» вы сами выполняете «пост-обработку», дублируя стек записей несколько раз в соответствии с продолжительностью каждого сна.
В конце концов, стек не изменится.
Связанное сообщение в блоге Грегга: Анализ вне процессора brendangregg.com/offcpuanalysis.html (и с флеймеграфами тоже brendangregg.com/FlameGraphs/offcpuflamegraphs.html). Его решение не так просто, как одиночная команда perf, но оно касается профилирования «спящих» и заблокированных программ. Решение более ранней версии 2015 года с отслеживанием perf и более высокими накладными расходами на зондах sched_ * brendangregg.com/blog/2015-02-26/…