2017-02-15 27 views
2

Точнее, как первичный инструмент ассоциирует события PMU с функциями , я уже понял, что, когда подсистема ядра выполняет запись счетчиков событий, она также записывает счетчик программ (ПК), чтобы он мог связывать счетчик с функцией.Как перфорировать события для функций?

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

Я читал в некоторых источниках, что эта выборка бывает только тогда, когда ЦУП счетчики переполнения, но это может быть очень грубым, если я не устанавливая счетчики переполнить очень быстро

, что я здесь отсутствует?

ответ

4

perf record является statistical profiling tool, она либо программы аппаратного блока монитора событий производительности (ЦУП) переполнение после некоторого числа отсчетов (например, с помощью -e cycles -c 1000000 записи -1000000, чтобы противостоять и включить циклы подсчета; с -F или без FREQ/период аргумента будет автонастройка), при переполнении прерывания perf перепрограммирует его для следующего подсчета. Таким образом, он будет иметь несколько сотен или несколько тысяч событий в секунду. Или он может использовать прерывание таймера OS (-e task-clock) для получения периодических выборок. На каждом образце (или на прерывании от аппаратного PMU) perf записывает текущий ПК (EIP) и/или callstack; и он не записывает текущее значение счетчика (проверьте полный дамп данных, хранящихся в файлах perf.data, с perf script or perf script -D или code of sample event dumping - есть sample->ip, но не текущий счет PMU).

perf report будет анализировать perf.data, чтобы весь записанный на нем ПК был записан. Он будет подсчитывать, сколько раз каждый ПК отбирался для построения гистограммы [PC] -> sample_count. Каждый ПК будет связан с точной функцией, которой он принадлежит (перфективный отчет будет анализировать карту памяти, так как события mmap записываются также в perf.data, открывают каждую используемую бинарную таблицу, находят таблицу символов каждого бинарного файла).

Фактический код perf report в linux/tools/perf/builtin-report.c: cmd_report/__cmd_report ->perf_session__process_events -> какой-то магии ->process_sample_event записать все упомянутые в perf.data ip значений (ПК) с hist_entry_iter__add(&iter, &al, rep->max_stack, rep); в гистограмме с hist_iter__report_callback:

hist_entry__inc_addr_samples(he, evsel->idx, al->addr); 
. . . (perf/util/annotate.c) __symbol__inc_addr_samples 
    611   h->addr[offset]++; 

Затем он выдает собранную гистограмму с report__browse_hists ->perf_evlist__tty_browse_hists ->hists__fprintf_nr_sample_events(hists, rep, evname, stdout);.

Каждый образец уже связан с точной функцией (и бит неточной инструкцией внутри него из-за неподходящего характера процессоров и неточного события переполнения PMU), и это как statistical profiling works. Когда ваша программа работает в течение короткого времени (меньше секунды) и/или у вас слишком низкая частота дискретизации, у вас может быть несколько образцов, записанных в perf.data. Но если у вас более нескольких сотен выборок, вы можете найти большинство функций cpu-heavy (они, вероятно, имеют pareto rule и работают примерно на несколько десятков процентов времени выполнения программы. Если вы хотите увидеть более мелкие функции (около нескольких процентов времени работы) , используйте тысячи или десятки или тысячи образцов и сделайте некоторые статистические оценки (вы не получите правильный процент функции, которая работает в течение 0,1% времени, когда у вас есть 100 или 1000 выборок).

+0

Вау очень большое спасибо. i didn ' t ожидаем такой подробный ответ. – Strudle

+0

Итак, в принципе, счетчик игнорируется, и он просто пробуждает появление ПК во время событий переполнения.Я вижу, как это работает, когда событие представляет собой циклы процессора и с достаточным количеством выборок. Но как это работает, когда событие пропускает кеш, например. Гарантировано ли, что события ovewflow в промахах кеша также будут хорошим приближением – Strudle

+0

В основном в отсчете выборки равен нулю на irq. Все события работают с использованием одного модуля PMU, они только настраивают его для разных идентификаторов событий. Кэш промахивается к ближайшим кэшам (каждое ядро ​​имеет собственные кеши L1 и L2) может быть зарегистрировано почти точно (но в некоторых случаях архитектура может зависеть от USE загруженного значения, от команд LOAD). События Offcore/uncore не так просты, как в каком-то ресурсе, который совместно используется ядрами и использует глобальные PMU; чтобы связать их с особыми синтетическими событиями локального ПМУ, можно использовать для корреляции счетчиков и маршрутных прерываний (но я полностью неправильно понимаю эту часть). – osgx