Вы должны использовать perf record -e <event-name> ...
для выборки событий каждые 1 мс. Кажется, вы пытаетесь прочитать файл perf.data
и упорядочить его в удобочитаемые данные. Вам следует использовать perf report
, если вы не знаете об этом. Команда perf report
читает файл perf.data
и создает краткий профиль выполнения. Ссылка ниже должна помочь вам -
Анализ проб с отчетом о проверке
Вы можете изменить вывод perf report
в соответствии с вашими требованиями. Вы также можете использовать perf report -F
для указания нескольких столбцов в формате CSV.
Однако, кроме того, perf stat
имеет механизм сбора информации в формате csv с помощью команды perf stat -x
.
Редактировать # 1:
(Я использую Linux-Kernel 4.14.3 для оценки.)
Так как вы хотите, чтобы количество событий на выборку было взято, есть несколько вещей, которые нужно отметить. Чтобы подсчитать количество событий на выборку, вам нужно знать период выборки. Период выборки дает вам количество событий, после которых счетчик производительности будет переполнен, и ядро запишет выборку. По сути, в вашем случае,
sampling period = number of events per sample
Теперь есть два способа указать этот период выборки. Либо вы указываете это, либо вы не указываете это.
Если при выполнении perf record
вы указываете период выборки .. что-то вроде этого: -
perf record -e <some_event_name> -c 1000 ...
Здесь -c 1000 означает, что период выборки равен 1000. В этом случае вы намеренно заставляете систему записывать 1000 событий для выборки, поскольку период выборки установлен вами.
С другой стороны, если вы не укажете период выборки, система попытается записать события с частотой по умолчанию 1000 выборок / сек . Это означает, что система автоматически изменит период выборки, если необходимо, чтобы поддерживать частоту 1000 выборок / сек. В таком случае, чтобы определить период выборки, необходимо соблюдать файл perf.data
.
В частности, вам нужно открыть файл perf.data
с помощью команды:
perf script -D
Вывод будет очень хорошо выглядеть так: -
0 0 0x108 [0x38]: PERF_RECORD_FORK(1:1):(0:0)
0x140 [0x30]: event: 3
.
. ... raw event: size 48 bytes
. 0000: 03 00 00 00 00 00 30 00 01 00 00 00 01 00 00 00 ......0.........
. 0010: 73 79 73 74 65 6d 64 00 00 00 00 00 00 00 00 00 systemd.........
. 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
0 0 0x140 [0x30]: PERF_RECORD_COMM: systemd:1/1
0x170 [0x38]: event: 7
.
. ... raw event: size 56 bytes
. 0000: 07 00 00 00 00 00 38 00 02 00 00 00 00 00 00 00 ......8.........
. 0010: 02 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
. 0020: 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 ................
. 0030: 00 00 00 00 00 00 00 00 ........
Вы можете увидеть различные типы записей, такие как PERF_RECORD_FORK
и PERF_RECORD_COMM
и даже PERF_RECORD_MMAP
. Вам нужно специально искать записи, которые начинаются с PERF_RECORD_SAMPLE внутри файла. Как это:
14 173826354106096 0x10d40 [0x28]: PERF_RECORD_SAMPLE(IP, 0x1): 28179/28179: 0xffffffffa500d3b5 period: 3000 addr: 0
... thread: perf:28179
...... dso: [kernel.kallsyms]
perf 28179 [014] 173826.354106: cache-misses: ffffffffa500d3b5 [unknown] ([kernel.kallsyms])
Как вы можете видеть, в этом случае период равен 3000, т.е. количество событий, собранных между предыдущим событием выборки и этим событием выборки, составляет 3000. (т.е. число событий в выборке равно 3000). Обратите внимание, что, как я уже упоминал выше, это период может быть настроен. Поэтому вам нужно собрать все записи PERF_RECORD_SAMPLE из файла perf.data
.