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

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

void main()
{
    while(true)
    {
        printf(...);
    }
}

Например, более 1000 сэмплов в секунду.

Я собрал отчет о перфекте следующим образом:

sudo perf report -p <process_id> -g

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

void main()
{
    while(true)
    {
        sleep(1);
        printf(...);
    }
}

Я хочу собирать выборки графа вызовов, даже если моя программа находится в состоянии ожидания или, как известно.время устройства.В Windows с VSPerf callgraph с состоянием сна также хорошо собирается.

Сбор графика вызовов для состояния сна необходим для нахождения узкого места производительности не только во времени ЦП, но и во времени устройства (например, при доступе к базе данных).

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

Как я могу получить проф сэмплы, даже если моя программа находится в спящем состоянии?


После публикации этого вопроса мы обнаружили, что perf -c 1 захватывает около 10 выборок в секунду.Без -c 1, перфорация захватывает 0,3 образца в секунду.10 сэмплов в секунду сейчас намного лучше, но все равно намного меньше, чем 1000 сэмплов в секунду.

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

Ответы [ 2 ]

0 голосов
/ 19 декабря 2018

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

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

0 голосов
/ 18 декабря 2018

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

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

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

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

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

...