linux perf record: разница между параметрами count (-c) и Frequency (-F)

Я пытаюсь понять, что на самом деле делают параметры -c и -F команды perf record, но не могу объяснить, что вижу. Я запускаю эти команды:

perf record -a -F <frequency> sleep 1

а также

perf record -a -c <count> sleep 1

пробуя разные значения частоты и количества. Я получаю следующие результаты: следующие

В первой таблице я задаю частоту, а во второй - количество. Как частота и количество влияют на количество событий? Я думал, что количество событий не зависит от частоты и количества, но, очевидно, это не так. Что на самом деле делает perf?


person S. Rinco    schedule 23.11.2018    source источник
comment
Как вы получили образцы и события в своей таблице?   -  person Zulan    schedule 23.11.2018
comment
Очень вероятно, что он получен с помощью perf report.   -  person Arnabjyoti Kalita    schedule 24.11.2018
comment
Да, я использовал отчет о производительности   -  person S. Rinco    schedule 26.11.2018


Ответы (1)


Count и frequency — это два основных переключателя, которые настраивают частоту дискретизации при использовании perf record (который выполняет внутреннюю выборку).

Подсчитать

Когда вы запускаете perf record -c <number>, вы указываете период выборки (где «число» — это период выборки). То есть для каждого «номерного» появления события будет записана выборка. Образец будет записан, когда счетчик производительности, отслеживающий количество событий, переполнится.

Я предполагаю, что вы получаете количество событий с помощью perf report. Обратите внимание, что perf report никогда не будет сообщать фактическое количество событий, а только приблизительное. Количество событий будет меняться по мере того, как вы будете настраивать период выборки. perf report будет читать только файл perf.data, сгенерированный perf record, и на основе размера сгенерированного файла делает предположение о количестве записанных сэмплов (зная размер семпла, записанного в памяти). Фактическое количество зарегистрированных событий получается с помощью -

Number of events = Fixed Sample Period * Number of samples collected

где Фиксированный период выборки — это то, что вы указали с помощью perf record -c.

Частота

Это наоборот, чтобы выразить период выборки, то есть указать среднюю скорость выборки в секунду (частоту), что вы можете сделать, используя запись perf -F. Таким образом, perf record -F 1000 будет записывать около 1000 выборок в секунду, и эти выборки будут генерироваться при переполнении аппаратного/PMU-счетчика, соответствующего событию. Это означает, что ядро ​​будет динамически регулировать период выборки, чтобы убедиться, что процесс sampling придерживается частоты выборки.

Вот период выборки обновляется динамически.

Чем выше частота выборки, тем выше количество собранных проб (почти пропорционально).

Изменение периода выборки можно увидеть, выполнив команду -

sudo perf report -D -i perf.data | fgrep RECORD_SAMPLE

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

person Arnabjyoti Kalita    schedule 24.11.2018
comment
То, что вы объяснили, верно, но не объясняет результаты, которые я получил. Что я ожидаю увидеть с опцией -F, так это то, что количество выборок прямо пропорционально частоте, а #samples/частота — это общее время выполнения программы. Количество событий должно быть постоянным. С опцией -c количество выборок x должно быть очень близко к количеству событий, наблюдаемых с опцией -F. Чтобы воспроизвести это, мне пришлось передать событие (например, циклы -e) и использовать значение count достаточно высокое. Я думаю, что perf использует минимальное значение, если вы передаете очень маленькое число, не сообщая вам об этом. - person S. Rinco; 26.11.2018
comment
Привет @Arnabjyoti Kalita, твое объяснение великолепно. Но знаете ли вы, почему, когда система находится в относительном бездействии, количество сэмплов, собираемых perf, неверно. Например, я запускаю семплирование с частотой 100 Гц и запускаю его на 10 секунд. Я ожидаю, что у него будет 1000 образцов, но на самом деле я могу получить только 200. Есть какие-нибудь мысли по этому поводу? Я действительно смущен этой проблемой. (когда система полностью загружена, она может получить около 1000 образцов) Спасибо! Я использую эту команду: sudo perf record -F 100 -a -g -- sleep 10; - person Richard Li; 05.07.2019
comment
@RichardLi Не делите частоту на частоту системного тикера, обычно это 100 Гц для Linux. См. brendangregg.com/perf.html. - person Lewis Chan; 31.05.2021
comment
В многопоточной программе частота дискретизации оценивается отдельно для всех потоков или глобально? - person nnnmmm; 31.05.2021