Слишком большой perf.data со слишком малым количеством событий - PullRequest
1 голос
/ 05 апреля 2020

Записал некоторые статистические данные, используя:

perf record -a -F 20 -o perf.data -e major-faults sleep 1800

и получил perf.data ~ 1 ГБ с выборками: 355, количество событий: 7592:

# Total Lost Samples: 0
#
# Samples: 355  of event 'major-faults'
# Event count (approx.): 7592

Почему несколько образцов заняли много места? Есть ли инструмент, чтобы заглянуть внутрь perf.data, чтобы узнать, что он на самом деле содержит?

Используя команду:

perf report -i perf.data -D

Я нашел эти события в perf .data: (вырезать шестнадцатеричные дампы каждого события)

0 0 0x63a0 [0x30]: PERF_RECORD_COMM: gmain:1000/1010
0x63d0 [0x38]: event: 7
0 0 0x63d0 [0x38]: PERF_RECORD_FORK(1004:1004):(1:1)
0x6408 [0x30]: event: 3
0 0 0x6408 [0x30]: PERF_RECORD_COMM: cron:1004/1004
0x6438 [0x70]: event: 10
0 0 0x6438 [0x70]: PERF_RECORD_MMAP2 1004/1004: [0x5586d93d0000(0xb000) @ 0 fd:01 3285696 93896821003936]: r-xp /usr/sbin/cron

Но я не просил perf записать эти события с помощью селектора -e. Как избежать записи этого?

1 Ответ

1 голос
/ 06 апреля 2020

Как уже упоминал @osgx, инструмент для поиска в файле perf.data - perf script. perf script -D выводит необработанные события из файла perf.data в шестнадцатеричном формате.

Файл perf.data содержит все события, сгенерированные модулями мониторинга производительности, а также некоторые метаданные. Файл perf.data на диске обычно начинается с структуры perf_header приведенной ниже формы -

struct perf_header {
    char magic[8];      /* PERFILE2 */
    uint64_t size;      /* size of the header */
    uint64_t attr_size; /* size of an attribute in attrs */
    struct perf_file_section attrs;
    struct perf_file_section data;
    struct perf_file_section event_types;
    uint64_t flags;
    uint64_t flags1[3];
};

Основная часть файла perf.data включает в себя события perf, которые могут включать любые типы событий упомянутые здесь , которые содержат метаданные о каждом из событий, такие как 32-битный идентификатор процесса и идентификатор потока, указатель инструкции, информация об используемом процессоре и т. д. c. Хранение этих метаданных зависит от передаваемых флагов, например PERF_SAMPLE_PID или PERF_SAMPLE_TID et c. Посмотрите на perf_event_open manpage . Вы можете отключить запись некоторых метаданных и уменьшить размер данных каждого события, записываемого в файл.

PERF_RECORD_COMM, PERF_RECORD_FORK и PERF_RECORD_MMAP et c. являются событиями боковой полосы, записанными ядром, чтобы помочь в дальнейшей постобработке и детальном анализе. Они включены по умолчанию в исходном коде ядра, который можно увидеть здесь .

struct perf_event_attr {

                ........
                mmap           :  1, /* include mmap data     */
                comm           :  1, /* include comm data     */
                freq           :  1, /* use freq, not period  */
                inherit_stat   :  1, /* per task counts       */
                enable_on_exec :  1, /* next exec enables     */
                task           :  1, /* trace fork/exit       */

Наличие 1 в этих полях означает, что они включены по умолчанию, и отключить ведение журнала этих события, вы должны сделать их 0 в исходном коде и перекомпилировать только модуль perf пользовательского пространства ядра . Если установлено значение 0, эти события не будут записываться, как видно здесь .

Нет никаких параметров командной строки или параметров с perf record, которые позволили бы отключить эти события .

...