Получать образцы Linux prof, даже если моя программа находится в спящем состоянии?

В программе без функция снаперфоманс хорошо собирает образцы графов вызовов.

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 выборок в секунду.

Есть ли способ лучше?

Связанное сообщение в блоге Грегга: Анализ вне процессора brendangregg.com/offcpuanalysis.html (и с флеймеграфами тоже brendangregg.com/FlameGraphs/offcpuflamegraphs.html). Его решение не так просто, как одиночная команда perf, но оно касается профилирования «спящих» и заблокированных программ. Решение более ранней версии 2015 года с отслеживанием perf и более высокими накладными расходами на зондах sched_ * brendangregg.com/blog/2015-02-26/…

osgx 04.01.2019 09:48
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
91
2

Ответы 2

Когда вы указываете цель профилирования, perf будет учитывать только события, которые были сгенерированы указанной целью. Совершенно естественно, что цель sleep не генерирует много событий производительности.

Если вы хотите видеть другие процессы (например, базу данных?) В отчетах графа вызовов, попробуйте общесистемную выборку:

    -a, --all-cpus
       System-wide collection from all CPUs (default if no target is specified).

(со страницы руководства perf)

Кроме того, если вы планируете потратить много времени на изучение отчетов, есть инструмент, который я не могу вам порекомендовать: ПламяГрафы. Эта визуализация может сэкономить вам много усилий.

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

Hyunjik Bae 19.12.2018 02:18

Я попробовал опцию -a, но она по-прежнему недостаточно собирает образцы моей программы.

Hyunjik Bae 19.12.2018 03:16

1) Общесистемная выборка собирает все, включая вашу программу сна; 2) Это потому, что ваша программа спит == ничего не делает.

emmrk 19.12.2018 10:53

Образцы ЦП, пока ваш процесс находится в состоянии сна, в основном бесполезны, но вы можете имитировать это поведение, используя событие, которое записывает начало и конец системного вызова сна (захват стеков), а затем просто добавляет «стеки сна» вы сами выполняете «пост-обработку», дублируя стек записей несколько раз в соответствии с продолжительностью каждого сна.

В конце концов, стек не изменится.

Другие вопросы по теме