Что означает вывод "perf stat"?
Я использую "perf stat
"Команда для статистики некоторых событий:
[root@root test]# perf stat -a -e "r81d0","r82d0" -v ./a
r81d0: 71800964 1269047979 1269006431
r82d0: 26655201 1284214869 1284214869
Performance counter stats for './a':
71,800,964 r81d0 [100.00%]
26,655,201 r82d0
0.036892349 seconds time elapsed
(1) я знаю 71800964
это счет "r81d0
", но в чем смысл 1269047979
а также 1269006431
?
(2) Что означает "[100.00%]
"?
Я пыталсяperf stat --help
", но не могу получить объяснения этих значений.
1 ответ
[root@root test]# perf stat -a -e "r81d0","r82d0" -v ./a
r81d0: 71800964 1269047979 1269006431
r82d0: 26655201 1284214869 1284214869
Это вывод из подробного параметра, как определено в файле tools / perf / builtin-stat.c ядра:
391 /*
392 * Read out the results of a single counter:
393 * aggregate counts across CPUs in system-wide mode
394 */
395 static int read_counter_aggr(struct perf_evsel *counter)
408 if (verbose) {
409 fprintf(output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
410 perf_evsel__name(counter), count[0], count[1], count[2]);
411 }
отсчет от struct perf_counts_values
определяется как http://lxr.free-electrons.com/source/tools/perf/util/evsel.h?v=3.18#L12 с массивом из трех значений uint64_t, названным как val
, ena
, run
Три count
значения заполняются ядром и читаются из fd, открываются perf_event_open()
Системный вызов. Есть связанная часть man perf_event_open
: http://man7.org/linux/man-pages/man2/perf_event_open.2.html
read_format
This field specifies the format of the data returned by
read(2) on a perf_event_open() file descriptor.
PERF_FORMAT_TOTAL_TIME_ENABLED
Adds the 64-bit time_enabled field. This can be used
to calculate estimated totals if the PMU is
overcommitted and multiplexing is happening.
PERF_FORMAT_TOTAL_TIME_RUNNING
Adds the 64-bit time_running field. This can be used
to calculate estimated totals if the PMU is
overcommitted and multiplexing is happening. ...
perf stat
включает все флаги ВРЕМЕНИ, если scale
правда -
298 if (scale)
299 attr->read_format = PERF_FORMAT_TOTAL_TIME_ENABLED |
300 PERF_FORMAT_TOTAL_TIME_RUNNING;
Итак, первый счетчик - это необработанный счетчик событий; секунда пропорциональна времени, когда это событие было собрано, а последняя пропорциональна общему времени выполнения. Это нужно, когда вы спрашиваете perf
статистика по большому количеству событий, которые нельзя отслеживать одновременно (аппаратное обеспечение обычно имеет до 5-7 мониторов производительности). В таком случае в ядре perf будет запускать подмножества требуемого события для некоторых частей выполнения; и подмножества будут изменены несколько раз. С ena
а также run
считает, что perf может оценить, насколько неточным был мониторинг событий в случае мультиплексирования.
Performance counter stats for './a':
71,800,964 r81d0 [100.00%]
26,655,201 r82d0
И в вашем случае два события были отображены одновременно без необходимости мультиплексирования; ваш ena
а также run
счетчики рядом. А также print_aggr
Функция печатает их соотношение:
1137 val += counter->counts->cpu[cpu].val;
1138 ena += counter->counts->cpu[cpu].ena;
1139 run += counter->counts->cpu[cpu].run;
Print_noise будет выводиться в случае -r N
возможность перезапустить задачу N раз для получения статистики (man: --repeat=<n>
повторите команду и напечатайте среднее значение + стандартное отклонение (максимум: 100)
1176 print_noise(counter, 1.0);
И есть [100.00%]
принтер:
1178 if (run != ena)
1179 fprintf(output, " (%.2f%%)",
1180 100.0 * run / ena);
Он не будет печатать 100%, если время выполнения и время ena равны, а ваше событие r82d0 равно. У вашего события r81d0 немного другой ход и ena, поэтому 100% выводится в одну строку.
я знаю это perf stat -d
может быть неточным, потому что требует слишком много событий; и будет не 100% мультиплексирование, а что-то вроде 53%. Это означает, что "это событие было засчитано только в 53% времени выполнения программы в некоторых случайных его частях"; и если вы программируете несколько отдельных этапов вычислений, события с низким отношением прогон /ena будут менее точными.