Что означает вывод "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 будут менее точными.

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