162306a36Sopenharmony_ciperf.data format 262306a36Sopenharmony_ci 362306a36Sopenharmony_ciUptodate as of v4.7 462306a36Sopenharmony_ci 562306a36Sopenharmony_ciThis document describes the on-disk perf.data format, generated by perf record 662306a36Sopenharmony_cior perf inject and consumed by the other perf tools. 762306a36Sopenharmony_ci 862306a36Sopenharmony_ciOn a high level perf.data contains the events generated by the PMUs, plus metadata. 962306a36Sopenharmony_ci 1062306a36Sopenharmony_ciAll fields are in native-endian of the machine that generated the perf.data. 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ciWhen perf is writing to a pipe it uses a special version of the file 1362306a36Sopenharmony_ciformat that does not rely on seeking to adjust data offsets. This 1462306a36Sopenharmony_ciformat is described in "Pipe-mode data" section. The pipe data version can be 1562306a36Sopenharmony_ciaugmented with additional events using perf inject. 1662306a36Sopenharmony_ci 1762306a36Sopenharmony_ciThe file starts with a perf_header: 1862306a36Sopenharmony_ci 1962306a36Sopenharmony_cistruct perf_header { 2062306a36Sopenharmony_ci char magic[8]; /* PERFILE2 */ 2162306a36Sopenharmony_ci uint64_t size; /* size of the header */ 2262306a36Sopenharmony_ci uint64_t attr_size; /* size of an attribute in attrs */ 2362306a36Sopenharmony_ci struct perf_file_section attrs; 2462306a36Sopenharmony_ci struct perf_file_section data; 2562306a36Sopenharmony_ci struct perf_file_section event_types; 2662306a36Sopenharmony_ci uint64_t flags; 2762306a36Sopenharmony_ci uint64_t flags1[3]; 2862306a36Sopenharmony_ci}; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ciThe magic number identifies the perf file and the version. Current perf versions 3162306a36Sopenharmony_ciuse PERFILE2. Old perf versions generated a version 1 format (PERFFILE). Version 1 3262306a36Sopenharmony_ciis not described here. The magic number also identifies the endian. When the 3362306a36Sopenharmony_cimagic value is 64bit byte swapped compared the file is in non-native 3462306a36Sopenharmony_ciendian. 3562306a36Sopenharmony_ci 3662306a36Sopenharmony_ciA perf_file_section contains a pointer to another section of the perf file. 3762306a36Sopenharmony_ciThe header contains three such pointers: for attributes, data and event types. 3862306a36Sopenharmony_ci 3962306a36Sopenharmony_cistruct perf_file_section { 4062306a36Sopenharmony_ci uint64_t offset; /* offset from start of file */ 4162306a36Sopenharmony_ci uint64_t size; /* size of the section */ 4262306a36Sopenharmony_ci}; 4362306a36Sopenharmony_ci 4462306a36Sopenharmony_ciFlags section: 4562306a36Sopenharmony_ci 4662306a36Sopenharmony_ciFor each of the optional features a perf_file_section is placed after the data 4762306a36Sopenharmony_cisection if the feature bit is set in the perf_header flags bitset. The 4862306a36Sopenharmony_cirespective perf_file_section points to the data of the additional header and 4962306a36Sopenharmony_cidefines its size. 5062306a36Sopenharmony_ci 5162306a36Sopenharmony_ciSome headers consist of strings, which are defined like this: 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistruct perf_header_string { 5462306a36Sopenharmony_ci uint32_t len; 5562306a36Sopenharmony_ci char string[len]; /* zero terminated */ 5662306a36Sopenharmony_ci}; 5762306a36Sopenharmony_ci 5862306a36Sopenharmony_ciSome headers consist of a sequence of strings, which start with a 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistruct perf_header_string_list { 6162306a36Sopenharmony_ci uint32_t nr; 6262306a36Sopenharmony_ci struct perf_header_string strings[nr]; /* variable length records */ 6362306a36Sopenharmony_ci}; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ciThe bits are the flags bits in a 256 bit bitmap starting with 6662306a36Sopenharmony_ciflags. These define the valid bits: 6762306a36Sopenharmony_ci 6862306a36Sopenharmony_ci HEADER_RESERVED = 0, /* always cleared */ 6962306a36Sopenharmony_ci HEADER_FIRST_FEATURE = 1, 7062306a36Sopenharmony_ci HEADER_TRACING_DATA = 1, 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ciDescribe me. 7362306a36Sopenharmony_ci 7462306a36Sopenharmony_ci HEADER_BUILD_ID = 2, 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciThe header consists of an sequence of build_id_event. The size of each record 7762306a36Sopenharmony_ciis defined by header.size (see perf_event.h). Each event defines a ELF build id 7862306a36Sopenharmony_cifor a executable file name for a pid. An ELF build id is a unique identifier 7962306a36Sopenharmony_ciassigned by the linker to an executable. 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_cistruct build_id_event { 8262306a36Sopenharmony_ci struct perf_event_header header; 8362306a36Sopenharmony_ci pid_t pid; 8462306a36Sopenharmony_ci uint8_t build_id[24]; 8562306a36Sopenharmony_ci char filename[header.size - offsetof(struct build_id_event, filename)]; 8662306a36Sopenharmony_ci}; 8762306a36Sopenharmony_ci 8862306a36Sopenharmony_ci HEADER_HOSTNAME = 3, 8962306a36Sopenharmony_ci 9062306a36Sopenharmony_ciA perf_header_string with the hostname where the data was collected 9162306a36Sopenharmony_ci(uname -n) 9262306a36Sopenharmony_ci 9362306a36Sopenharmony_ci HEADER_OSRELEASE = 4, 9462306a36Sopenharmony_ci 9562306a36Sopenharmony_ciA perf_header_string with the os release where the data was collected 9662306a36Sopenharmony_ci(uname -r) 9762306a36Sopenharmony_ci 9862306a36Sopenharmony_ci HEADER_VERSION = 5, 9962306a36Sopenharmony_ci 10062306a36Sopenharmony_ciA perf_header_string with the perf user tool version where the 10162306a36Sopenharmony_cidata was collected. This is the same as the version of the source tree 10262306a36Sopenharmony_cithe perf tool was built from. 10362306a36Sopenharmony_ci 10462306a36Sopenharmony_ci HEADER_ARCH = 6, 10562306a36Sopenharmony_ci 10662306a36Sopenharmony_ciA perf_header_string with the CPU architecture (uname -m) 10762306a36Sopenharmony_ci 10862306a36Sopenharmony_ci HEADER_NRCPUS = 7, 10962306a36Sopenharmony_ci 11062306a36Sopenharmony_ciA structure defining the number of CPUs. 11162306a36Sopenharmony_ci 11262306a36Sopenharmony_cistruct nr_cpus { 11362306a36Sopenharmony_ci uint32_t nr_cpus_available; /* CPUs not yet onlined */ 11462306a36Sopenharmony_ci uint32_t nr_cpus_online; 11562306a36Sopenharmony_ci}; 11662306a36Sopenharmony_ci 11762306a36Sopenharmony_ci HEADER_CPUDESC = 8, 11862306a36Sopenharmony_ci 11962306a36Sopenharmony_ciA perf_header_string with description of the CPU. On x86 this is the model name 12062306a36Sopenharmony_ciin /proc/cpuinfo 12162306a36Sopenharmony_ci 12262306a36Sopenharmony_ci HEADER_CPUID = 9, 12362306a36Sopenharmony_ci 12462306a36Sopenharmony_ciA perf_header_string with the exact CPU type. On x86 this is 12562306a36Sopenharmony_civendor,family,model,stepping. For example: GenuineIntel,6,69,1 12662306a36Sopenharmony_ci 12762306a36Sopenharmony_ci HEADER_TOTAL_MEM = 10, 12862306a36Sopenharmony_ci 12962306a36Sopenharmony_ciAn uint64_t with the total memory in kilobytes. 13062306a36Sopenharmony_ci 13162306a36Sopenharmony_ci HEADER_CMDLINE = 11, 13262306a36Sopenharmony_ci 13362306a36Sopenharmony_ciA perf_header_string_list with the perf arg-vector used to collect the data. 13462306a36Sopenharmony_ci 13562306a36Sopenharmony_ci HEADER_EVENT_DESC = 12, 13662306a36Sopenharmony_ci 13762306a36Sopenharmony_ciAnother description of the perf_event_attrs, more detailed than header.attrs 13862306a36Sopenharmony_ciincluding IDs and names. See perf_event.h or the man page for a description 13962306a36Sopenharmony_ciof a struct perf_event_attr. 14062306a36Sopenharmony_ci 14162306a36Sopenharmony_cistruct { 14262306a36Sopenharmony_ci uint32_t nr; /* number of events */ 14362306a36Sopenharmony_ci uint32_t attr_size; /* size of each perf_event_attr */ 14462306a36Sopenharmony_ci struct { 14562306a36Sopenharmony_ci struct perf_event_attr attr; /* size of attr_size */ 14662306a36Sopenharmony_ci uint32_t nr_ids; 14762306a36Sopenharmony_ci struct perf_header_string event_string; 14862306a36Sopenharmony_ci uint64_t ids[nr_ids]; 14962306a36Sopenharmony_ci } events[nr]; /* Variable length records */ 15062306a36Sopenharmony_ci}; 15162306a36Sopenharmony_ci 15262306a36Sopenharmony_ci HEADER_CPU_TOPOLOGY = 13, 15362306a36Sopenharmony_ci 15462306a36Sopenharmony_cistruct { 15562306a36Sopenharmony_ci /* 15662306a36Sopenharmony_ci * First revision of HEADER_CPU_TOPOLOGY 15762306a36Sopenharmony_ci * 15862306a36Sopenharmony_ci * See 'struct perf_header_string_list' definition earlier 15962306a36Sopenharmony_ci * in this file. 16062306a36Sopenharmony_ci */ 16162306a36Sopenharmony_ci 16262306a36Sopenharmony_ci struct perf_header_string_list cores; /* Variable length */ 16362306a36Sopenharmony_ci struct perf_header_string_list threads; /* Variable length */ 16462306a36Sopenharmony_ci 16562306a36Sopenharmony_ci /* 16662306a36Sopenharmony_ci * Second revision of HEADER_CPU_TOPOLOGY, older tools 16762306a36Sopenharmony_ci * will not consider what comes next 16862306a36Sopenharmony_ci */ 16962306a36Sopenharmony_ci 17062306a36Sopenharmony_ci struct { 17162306a36Sopenharmony_ci uint32_t core_id; 17262306a36Sopenharmony_ci uint32_t socket_id; 17362306a36Sopenharmony_ci } cpus[nr]; /* Variable length records */ 17462306a36Sopenharmony_ci /* 'nr' comes from previously processed HEADER_NRCPUS's nr_cpu_avail */ 17562306a36Sopenharmony_ci 17662306a36Sopenharmony_ci /* 17762306a36Sopenharmony_ci * Third revision of HEADER_CPU_TOPOLOGY, older tools 17862306a36Sopenharmony_ci * will not consider what comes next 17962306a36Sopenharmony_ci */ 18062306a36Sopenharmony_ci 18162306a36Sopenharmony_ci struct perf_header_string_list dies; /* Variable length */ 18262306a36Sopenharmony_ci uint32_t die_id[nr_cpus_avail]; /* from previously processed HEADER_NR_CPUS, VLA */ 18362306a36Sopenharmony_ci}; 18462306a36Sopenharmony_ci 18562306a36Sopenharmony_ciExample: 18662306a36Sopenharmony_ci sibling sockets : 0-8 18762306a36Sopenharmony_ci sibling dies : 0-3 18862306a36Sopenharmony_ci sibling dies : 4-7 18962306a36Sopenharmony_ci sibling threads : 0-1 19062306a36Sopenharmony_ci sibling threads : 2-3 19162306a36Sopenharmony_ci sibling threads : 4-5 19262306a36Sopenharmony_ci sibling threads : 6-7 19362306a36Sopenharmony_ci 19462306a36Sopenharmony_ci HEADER_NUMA_TOPOLOGY = 14, 19562306a36Sopenharmony_ci 19662306a36Sopenharmony_ci A list of NUMA node descriptions 19762306a36Sopenharmony_ci 19862306a36Sopenharmony_cistruct { 19962306a36Sopenharmony_ci uint32_t nr; 20062306a36Sopenharmony_ci struct { 20162306a36Sopenharmony_ci uint32_t nodenr; 20262306a36Sopenharmony_ci uint64_t mem_total; 20362306a36Sopenharmony_ci uint64_t mem_free; 20462306a36Sopenharmony_ci struct perf_header_string cpus; 20562306a36Sopenharmony_ci } nodes[nr]; /* Variable length records */ 20662306a36Sopenharmony_ci}; 20762306a36Sopenharmony_ci 20862306a36Sopenharmony_ci HEADER_BRANCH_STACK = 15, 20962306a36Sopenharmony_ci 21062306a36Sopenharmony_ciNot implemented in perf. 21162306a36Sopenharmony_ci 21262306a36Sopenharmony_ci HEADER_PMU_MAPPINGS = 16, 21362306a36Sopenharmony_ci 21462306a36Sopenharmony_ci A list of PMU structures, defining the different PMUs supported by perf. 21562306a36Sopenharmony_ci 21662306a36Sopenharmony_cistruct { 21762306a36Sopenharmony_ci uint32_t nr; 21862306a36Sopenharmony_ci struct pmu { 21962306a36Sopenharmony_ci uint32_t pmu_type; 22062306a36Sopenharmony_ci struct perf_header_string pmu_name; 22162306a36Sopenharmony_ci } [nr]; /* Variable length records */ 22262306a36Sopenharmony_ci}; 22362306a36Sopenharmony_ci 22462306a36Sopenharmony_ci HEADER_GROUP_DESC = 17, 22562306a36Sopenharmony_ci 22662306a36Sopenharmony_ci Description of counter groups ({...} in perf syntax) 22762306a36Sopenharmony_ci 22862306a36Sopenharmony_cistruct { 22962306a36Sopenharmony_ci uint32_t nr; 23062306a36Sopenharmony_ci struct { 23162306a36Sopenharmony_ci struct perf_header_string string; 23262306a36Sopenharmony_ci uint32_t leader_idx; 23362306a36Sopenharmony_ci uint32_t nr_members; 23462306a36Sopenharmony_ci } [nr]; /* Variable length records */ 23562306a36Sopenharmony_ci}; 23662306a36Sopenharmony_ci 23762306a36Sopenharmony_ci HEADER_AUXTRACE = 18, 23862306a36Sopenharmony_ci 23962306a36Sopenharmony_ciDefine additional auxtrace areas in the perf.data. auxtrace is used to store 24062306a36Sopenharmony_ciundecoded hardware tracing information, such as Intel Processor Trace data. 24162306a36Sopenharmony_ci 24262306a36Sopenharmony_ci/** 24362306a36Sopenharmony_ci * struct auxtrace_index_entry - indexes a AUX area tracing event within a 24462306a36Sopenharmony_ci * perf.data file. 24562306a36Sopenharmony_ci * @file_offset: offset within the perf.data file 24662306a36Sopenharmony_ci * @sz: size of the event 24762306a36Sopenharmony_ci */ 24862306a36Sopenharmony_cistruct auxtrace_index_entry { 24962306a36Sopenharmony_ci u64 file_offset; 25062306a36Sopenharmony_ci u64 sz; 25162306a36Sopenharmony_ci}; 25262306a36Sopenharmony_ci 25362306a36Sopenharmony_ci#define PERF_AUXTRACE_INDEX_ENTRY_COUNT 256 25462306a36Sopenharmony_ci 25562306a36Sopenharmony_ci/** 25662306a36Sopenharmony_ci * struct auxtrace_index - index of AUX area tracing events within a perf.data 25762306a36Sopenharmony_ci * file. 25862306a36Sopenharmony_ci * @list: linking a number of arrays of entries 25962306a36Sopenharmony_ci * @nr: number of entries 26062306a36Sopenharmony_ci * @entries: array of entries 26162306a36Sopenharmony_ci */ 26262306a36Sopenharmony_cistruct auxtrace_index { 26362306a36Sopenharmony_ci struct list_head list; 26462306a36Sopenharmony_ci size_t nr; 26562306a36Sopenharmony_ci struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT]; 26662306a36Sopenharmony_ci}; 26762306a36Sopenharmony_ci 26862306a36Sopenharmony_ci HEADER_STAT = 19, 26962306a36Sopenharmony_ci 27062306a36Sopenharmony_ciThis is merely a flag signifying that the data section contains data 27162306a36Sopenharmony_cirecorded from perf stat record. 27262306a36Sopenharmony_ci 27362306a36Sopenharmony_ci HEADER_CACHE = 20, 27462306a36Sopenharmony_ci 27562306a36Sopenharmony_ciDescription of the cache hierarchy. Based on the Linux sysfs format 27662306a36Sopenharmony_ciin /sys/devices/system/cpu/cpu*/cache/ 27762306a36Sopenharmony_ci 27862306a36Sopenharmony_ci u32 version Currently always 1 27962306a36Sopenharmony_ci u32 number_of_cache_levels 28062306a36Sopenharmony_ci 28162306a36Sopenharmony_cistruct { 28262306a36Sopenharmony_ci u32 level; 28362306a36Sopenharmony_ci u32 line_size; 28462306a36Sopenharmony_ci u32 sets; 28562306a36Sopenharmony_ci u32 ways; 28662306a36Sopenharmony_ci struct perf_header_string type; 28762306a36Sopenharmony_ci struct perf_header_string size; 28862306a36Sopenharmony_ci struct perf_header_string map; 28962306a36Sopenharmony_ci}[number_of_cache_levels]; 29062306a36Sopenharmony_ci 29162306a36Sopenharmony_ci HEADER_SAMPLE_TIME = 21, 29262306a36Sopenharmony_ci 29362306a36Sopenharmony_ciTwo uint64_t for the time of first sample and the time of last sample. 29462306a36Sopenharmony_ci 29562306a36Sopenharmony_ci HEADER_SAMPLE_TOPOLOGY = 22, 29662306a36Sopenharmony_ci 29762306a36Sopenharmony_ciPhysical memory map and its node assignments. 29862306a36Sopenharmony_ci 29962306a36Sopenharmony_ciThe format of data in MEM_TOPOLOGY is as follows: 30062306a36Sopenharmony_ci 30162306a36Sopenharmony_ci u64 version; // Currently 1 30262306a36Sopenharmony_ci u64 block_size_bytes; // /sys/devices/system/memory/block_size_bytes 30362306a36Sopenharmony_ci u64 count; // number of nodes 30462306a36Sopenharmony_ci 30562306a36Sopenharmony_cistruct memory_node { 30662306a36Sopenharmony_ci u64 node_id; // node index 30762306a36Sopenharmony_ci u64 size; // size of bitmap 30862306a36Sopenharmony_ci struct bitmap { 30962306a36Sopenharmony_ci /* size of bitmap again */ 31062306a36Sopenharmony_ci u64 bitmapsize; 31162306a36Sopenharmony_ci /* bitmap of memory indexes that belongs to node */ 31262306a36Sopenharmony_ci /* /sys/devices/system/node/node<NODE>/memory<INDEX> */ 31362306a36Sopenharmony_ci u64 entries[(bitmapsize/64)+1]; 31462306a36Sopenharmony_ci } 31562306a36Sopenharmony_ci}[count]; 31662306a36Sopenharmony_ci 31762306a36Sopenharmony_ciThe MEM_TOPOLOGY can be displayed with following command: 31862306a36Sopenharmony_ci 31962306a36Sopenharmony_ci$ perf report --header-only -I 32062306a36Sopenharmony_ci... 32162306a36Sopenharmony_ci# memory nodes (nr 1, block size 0x8000000): 32262306a36Sopenharmony_ci# 0 [7G]: 0-23,32-69 32362306a36Sopenharmony_ci 32462306a36Sopenharmony_ci HEADER_CLOCKID = 23, 32562306a36Sopenharmony_ci 32662306a36Sopenharmony_ciOne uint64_t for the clockid frequency, specified, for instance, via 'perf 32762306a36Sopenharmony_cirecord -k' (see clock_gettime()), to enable timestamps derived metrics 32862306a36Sopenharmony_ciconversion into wall clock time on the reporting stage. 32962306a36Sopenharmony_ci 33062306a36Sopenharmony_ci HEADER_DIR_FORMAT = 24, 33162306a36Sopenharmony_ci 33262306a36Sopenharmony_ciThe data files layout is described by HEADER_DIR_FORMAT feature. Currently it 33362306a36Sopenharmony_ciholds only version number (1): 33462306a36Sopenharmony_ci 33562306a36Sopenharmony_ci uint64_t version; 33662306a36Sopenharmony_ci 33762306a36Sopenharmony_ciThe current version holds only version value (1) means that data files: 33862306a36Sopenharmony_ci 33962306a36Sopenharmony_ci- Follow the 'data.*' name format. 34062306a36Sopenharmony_ci 34162306a36Sopenharmony_ci- Contain raw events data in standard perf format as read from kernel (and need 34262306a36Sopenharmony_ci to be sorted) 34362306a36Sopenharmony_ci 34462306a36Sopenharmony_ciFuture versions are expected to describe different data files layout according 34562306a36Sopenharmony_cito special needs. 34662306a36Sopenharmony_ci 34762306a36Sopenharmony_ci HEADER_BPF_PROG_INFO = 25, 34862306a36Sopenharmony_ci 34962306a36Sopenharmony_cistruct perf_bpil, which contains detailed information about 35062306a36Sopenharmony_cia BPF program, including type, id, tag, jited/xlated instructions, etc. 35162306a36Sopenharmony_ci 35262306a36Sopenharmony_ci HEADER_BPF_BTF = 26, 35362306a36Sopenharmony_ci 35462306a36Sopenharmony_ciContains BPF Type Format (BTF). For more information about BTF, please 35562306a36Sopenharmony_cirefer to Documentation/bpf/btf.rst. 35662306a36Sopenharmony_ci 35762306a36Sopenharmony_cistruct { 35862306a36Sopenharmony_ci u32 id; 35962306a36Sopenharmony_ci u32 data_size; 36062306a36Sopenharmony_ci char data[]; 36162306a36Sopenharmony_ci}; 36262306a36Sopenharmony_ci 36362306a36Sopenharmony_ci HEADER_COMPRESSED = 27, 36462306a36Sopenharmony_ci 36562306a36Sopenharmony_cistruct { 36662306a36Sopenharmony_ci u32 version; 36762306a36Sopenharmony_ci u32 type; 36862306a36Sopenharmony_ci u32 level; 36962306a36Sopenharmony_ci u32 ratio; 37062306a36Sopenharmony_ci u32 mmap_len; 37162306a36Sopenharmony_ci}; 37262306a36Sopenharmony_ci 37362306a36Sopenharmony_ciIndicates that trace contains records of PERF_RECORD_COMPRESSED type 37462306a36Sopenharmony_cithat have perf_events records in compressed form. 37562306a36Sopenharmony_ci 37662306a36Sopenharmony_ci HEADER_CPU_PMU_CAPS = 28, 37762306a36Sopenharmony_ci 37862306a36Sopenharmony_ci A list of cpu PMU capabilities. The format of data is as below. 37962306a36Sopenharmony_ci 38062306a36Sopenharmony_cistruct { 38162306a36Sopenharmony_ci u32 nr_cpu_pmu_caps; 38262306a36Sopenharmony_ci { 38362306a36Sopenharmony_ci char name[]; 38462306a36Sopenharmony_ci char value[]; 38562306a36Sopenharmony_ci } [nr_cpu_pmu_caps] 38662306a36Sopenharmony_ci}; 38762306a36Sopenharmony_ci 38862306a36Sopenharmony_ci 38962306a36Sopenharmony_ciExample: 39062306a36Sopenharmony_ci cpu pmu capabilities: branches=32, max_precise=3, pmu_name=icelake 39162306a36Sopenharmony_ci 39262306a36Sopenharmony_ci HEADER_CLOCK_DATA = 29, 39362306a36Sopenharmony_ci 39462306a36Sopenharmony_ci Contains clock id and its reference time together with wall clock 39562306a36Sopenharmony_ci time taken at the 'same time', both values are in nanoseconds. 39662306a36Sopenharmony_ci The format of data is as below. 39762306a36Sopenharmony_ci 39862306a36Sopenharmony_cistruct { 39962306a36Sopenharmony_ci u32 version; /* version = 1 */ 40062306a36Sopenharmony_ci u32 clockid; 40162306a36Sopenharmony_ci u64 wall_clock_ns; 40262306a36Sopenharmony_ci u64 clockid_time_ns; 40362306a36Sopenharmony_ci}; 40462306a36Sopenharmony_ci 40562306a36Sopenharmony_ci HEADER_HYBRID_TOPOLOGY = 30, 40662306a36Sopenharmony_ci 40762306a36Sopenharmony_ciIndicate the hybrid CPUs. The format of data is as below. 40862306a36Sopenharmony_ci 40962306a36Sopenharmony_cistruct { 41062306a36Sopenharmony_ci u32 nr; 41162306a36Sopenharmony_ci struct { 41262306a36Sopenharmony_ci char pmu_name[]; 41362306a36Sopenharmony_ci char cpus[]; 41462306a36Sopenharmony_ci } [nr]; /* Variable length records */ 41562306a36Sopenharmony_ci}; 41662306a36Sopenharmony_ci 41762306a36Sopenharmony_ciExample: 41862306a36Sopenharmony_ci hybrid cpu system: 41962306a36Sopenharmony_ci cpu_core cpu list : 0-15 42062306a36Sopenharmony_ci cpu_atom cpu list : 16-23 42162306a36Sopenharmony_ci 42262306a36Sopenharmony_ci HEADER_PMU_CAPS = 31, 42362306a36Sopenharmony_ci 42462306a36Sopenharmony_ci List of pmu capabilities (except cpu pmu which is already 42562306a36Sopenharmony_ci covered by HEADER_CPU_PMU_CAPS). Note that hybrid cpu pmu 42662306a36Sopenharmony_ci capabilities are also stored here. 42762306a36Sopenharmony_ci 42862306a36Sopenharmony_cistruct { 42962306a36Sopenharmony_ci u32 nr_pmu; 43062306a36Sopenharmony_ci struct { 43162306a36Sopenharmony_ci u32 nr_caps; 43262306a36Sopenharmony_ci { 43362306a36Sopenharmony_ci char name[]; 43462306a36Sopenharmony_ci char value[]; 43562306a36Sopenharmony_ci } [nr_caps]; 43662306a36Sopenharmony_ci char pmu_name[]; 43762306a36Sopenharmony_ci } [nr_pmu]; 43862306a36Sopenharmony_ci}; 43962306a36Sopenharmony_ci 44062306a36Sopenharmony_ci other bits are reserved and should ignored for now 44162306a36Sopenharmony_ci HEADER_FEAT_BITS = 256, 44262306a36Sopenharmony_ci 44362306a36Sopenharmony_ciAttributes 44462306a36Sopenharmony_ci 44562306a36Sopenharmony_ciThis is an array of perf_event_attrs, each attr_size bytes long, which defines 44662306a36Sopenharmony_cieach event collected. See perf_event.h or the man page for a detailed 44762306a36Sopenharmony_cidescription. 44862306a36Sopenharmony_ci 44962306a36Sopenharmony_ciData 45062306a36Sopenharmony_ci 45162306a36Sopenharmony_ciThis section is the bulk of the file. It consist of a stream of perf_events 45262306a36Sopenharmony_cidescribing events. This matches the format generated by the kernel. 45362306a36Sopenharmony_ciSee perf_event.h or the manpage for a detailed description. 45462306a36Sopenharmony_ci 45562306a36Sopenharmony_ciSome notes on parsing: 45662306a36Sopenharmony_ci 45762306a36Sopenharmony_ciOrdering 45862306a36Sopenharmony_ci 45962306a36Sopenharmony_ciThe events are not necessarily in time stamp order, as they can be 46062306a36Sopenharmony_cicollected in parallel on different CPUs. If the events should be 46162306a36Sopenharmony_ciprocessed in time order they need to be sorted first. It is possible 46262306a36Sopenharmony_cito only do a partial sort using the FINISHED_ROUND event header (see 46362306a36Sopenharmony_cibelow). perf record guarantees that there is no reordering over a 46462306a36Sopenharmony_ciFINISHED_ROUND. 46562306a36Sopenharmony_ci 46662306a36Sopenharmony_ciID vs IDENTIFIER 46762306a36Sopenharmony_ci 46862306a36Sopenharmony_ciWhen the event stream contains multiple events each event is identified 46962306a36Sopenharmony_ciby an ID. This can be either through the PERF_SAMPLE_ID or the 47062306a36Sopenharmony_ciPERF_SAMPLE_IDENTIFIER header. The PERF_SAMPLE_IDENTIFIER header is 47162306a36Sopenharmony_ciat a fixed offset from the event header, which allows reliable 47262306a36Sopenharmony_ciparsing of the header. Relying on ID may be ambiguous. 47362306a36Sopenharmony_ciIDENTIFIER is only supported by newer Linux kernels. 47462306a36Sopenharmony_ci 47562306a36Sopenharmony_ciPerf record specific events: 47662306a36Sopenharmony_ci 47762306a36Sopenharmony_ciIn addition to the kernel generated event types perf record adds its 47862306a36Sopenharmony_ciown event types (in addition it also synthesizes some kernel events, 47962306a36Sopenharmony_cifor example MMAP events) 48062306a36Sopenharmony_ci 48162306a36Sopenharmony_ci PERF_RECORD_USER_TYPE_START = 64, 48262306a36Sopenharmony_ci PERF_RECORD_HEADER_ATTR = 64, 48362306a36Sopenharmony_ci 48462306a36Sopenharmony_cistruct attr_event { 48562306a36Sopenharmony_ci struct perf_event_header header; 48662306a36Sopenharmony_ci struct perf_event_attr attr; 48762306a36Sopenharmony_ci uint64_t id[]; 48862306a36Sopenharmony_ci}; 48962306a36Sopenharmony_ci 49062306a36Sopenharmony_ci PERF_RECORD_HEADER_EVENT_TYPE = 65, /* deprecated */ 49162306a36Sopenharmony_ci 49262306a36Sopenharmony_ci#define MAX_EVENT_NAME 64 49362306a36Sopenharmony_ci 49462306a36Sopenharmony_cistruct perf_trace_event_type { 49562306a36Sopenharmony_ci uint64_t event_id; 49662306a36Sopenharmony_ci char name[MAX_EVENT_NAME]; 49762306a36Sopenharmony_ci}; 49862306a36Sopenharmony_ci 49962306a36Sopenharmony_cistruct event_type_event { 50062306a36Sopenharmony_ci struct perf_event_header header; 50162306a36Sopenharmony_ci struct perf_trace_event_type event_type; 50262306a36Sopenharmony_ci}; 50362306a36Sopenharmony_ci 50462306a36Sopenharmony_ci 50562306a36Sopenharmony_ci PERF_RECORD_HEADER_TRACING_DATA = 66, 50662306a36Sopenharmony_ci 50762306a36Sopenharmony_ciDescribe me 50862306a36Sopenharmony_ci 50962306a36Sopenharmony_cistruct tracing_data_event { 51062306a36Sopenharmony_ci struct perf_event_header header; 51162306a36Sopenharmony_ci uint32_t size; 51262306a36Sopenharmony_ci}; 51362306a36Sopenharmony_ci 51462306a36Sopenharmony_ci PERF_RECORD_HEADER_BUILD_ID = 67, 51562306a36Sopenharmony_ci 51662306a36Sopenharmony_ciDefine a ELF build ID for a referenced executable. 51762306a36Sopenharmony_ci 51862306a36Sopenharmony_ci struct build_id_event; /* See above */ 51962306a36Sopenharmony_ci 52062306a36Sopenharmony_ci PERF_RECORD_FINISHED_ROUND = 68, 52162306a36Sopenharmony_ci 52262306a36Sopenharmony_ciNo event reordering over this header. No payload. 52362306a36Sopenharmony_ci 52462306a36Sopenharmony_ci PERF_RECORD_ID_INDEX = 69, 52562306a36Sopenharmony_ci 52662306a36Sopenharmony_ciMap event ids to CPUs and TIDs. 52762306a36Sopenharmony_ci 52862306a36Sopenharmony_cistruct id_index_entry { 52962306a36Sopenharmony_ci uint64_t id; 53062306a36Sopenharmony_ci uint64_t idx; 53162306a36Sopenharmony_ci uint64_t cpu; 53262306a36Sopenharmony_ci uint64_t tid; 53362306a36Sopenharmony_ci}; 53462306a36Sopenharmony_ci 53562306a36Sopenharmony_cistruct id_index_event { 53662306a36Sopenharmony_ci struct perf_event_header header; 53762306a36Sopenharmony_ci uint64_t nr; 53862306a36Sopenharmony_ci struct id_index_entry entries[nr]; 53962306a36Sopenharmony_ci}; 54062306a36Sopenharmony_ci 54162306a36Sopenharmony_ci PERF_RECORD_AUXTRACE_INFO = 70, 54262306a36Sopenharmony_ci 54362306a36Sopenharmony_ciAuxtrace type specific information. Describe me 54462306a36Sopenharmony_ci 54562306a36Sopenharmony_cistruct auxtrace_info_event { 54662306a36Sopenharmony_ci struct perf_event_header header; 54762306a36Sopenharmony_ci uint32_t type; 54862306a36Sopenharmony_ci uint32_t reserved__; /* For alignment */ 54962306a36Sopenharmony_ci uint64_t priv[]; 55062306a36Sopenharmony_ci}; 55162306a36Sopenharmony_ci 55262306a36Sopenharmony_ci PERF_RECORD_AUXTRACE = 71, 55362306a36Sopenharmony_ci 55462306a36Sopenharmony_ciDefines auxtrace data. Followed by the actual data. The contents of 55562306a36Sopenharmony_cithe auxtrace data is dependent on the event and the CPU. For example 55662306a36Sopenharmony_cifor Intel Processor Trace it contains Processor Trace data generated 55762306a36Sopenharmony_ciby the CPU. 55862306a36Sopenharmony_ci 55962306a36Sopenharmony_cistruct auxtrace_event { 56062306a36Sopenharmony_ci struct perf_event_header header; 56162306a36Sopenharmony_ci uint64_t size; 56262306a36Sopenharmony_ci uint64_t offset; 56362306a36Sopenharmony_ci uint64_t reference; 56462306a36Sopenharmony_ci uint32_t idx; 56562306a36Sopenharmony_ci uint32_t tid; 56662306a36Sopenharmony_ci uint32_t cpu; 56762306a36Sopenharmony_ci uint32_t reserved__; /* For alignment */ 56862306a36Sopenharmony_ci}; 56962306a36Sopenharmony_ci 57062306a36Sopenharmony_cistruct aux_event { 57162306a36Sopenharmony_ci struct perf_event_header header; 57262306a36Sopenharmony_ci uint64_t aux_offset; 57362306a36Sopenharmony_ci uint64_t aux_size; 57462306a36Sopenharmony_ci uint64_t flags; 57562306a36Sopenharmony_ci}; 57662306a36Sopenharmony_ci 57762306a36Sopenharmony_ci PERF_RECORD_AUXTRACE_ERROR = 72, 57862306a36Sopenharmony_ci 57962306a36Sopenharmony_ciDescribes an error in hardware tracing 58062306a36Sopenharmony_ci 58162306a36Sopenharmony_cienum auxtrace_error_type { 58262306a36Sopenharmony_ci PERF_AUXTRACE_ERROR_ITRACE = 1, 58362306a36Sopenharmony_ci PERF_AUXTRACE_ERROR_MAX 58462306a36Sopenharmony_ci}; 58562306a36Sopenharmony_ci 58662306a36Sopenharmony_ci#define MAX_AUXTRACE_ERROR_MSG 64 58762306a36Sopenharmony_ci 58862306a36Sopenharmony_cistruct auxtrace_error_event { 58962306a36Sopenharmony_ci struct perf_event_header header; 59062306a36Sopenharmony_ci uint32_t type; 59162306a36Sopenharmony_ci uint32_t code; 59262306a36Sopenharmony_ci uint32_t cpu; 59362306a36Sopenharmony_ci uint32_t pid; 59462306a36Sopenharmony_ci uint32_t tid; 59562306a36Sopenharmony_ci uint32_t reserved__; /* For alignment */ 59662306a36Sopenharmony_ci uint64_t ip; 59762306a36Sopenharmony_ci char msg[MAX_AUXTRACE_ERROR_MSG]; 59862306a36Sopenharmony_ci}; 59962306a36Sopenharmony_ci 60062306a36Sopenharmony_ci PERF_RECORD_HEADER_FEATURE = 80, 60162306a36Sopenharmony_ci 60262306a36Sopenharmony_ciDescribes a header feature. These are records used in pipe-mode that 60362306a36Sopenharmony_cicontain information that otherwise would be in perf.data file's header. 60462306a36Sopenharmony_ci 60562306a36Sopenharmony_ci PERF_RECORD_COMPRESSED = 81, 60662306a36Sopenharmony_ci 60762306a36Sopenharmony_cistruct compressed_event { 60862306a36Sopenharmony_ci struct perf_event_header header; 60962306a36Sopenharmony_ci char data[]; 61062306a36Sopenharmony_ci}; 61162306a36Sopenharmony_ci 61262306a36Sopenharmony_ci PERF_RECORD_FINISHED_INIT = 82, 61362306a36Sopenharmony_ci 61462306a36Sopenharmony_ciMarks the end of records for the system, pre-existing threads in system wide 61562306a36Sopenharmony_cisessions, etc. Those are the ones prefixed PERF_RECORD_USER_*. 61662306a36Sopenharmony_ci 61762306a36Sopenharmony_ciThis is used, for instance, to 'perf inject' events after init and before 61862306a36Sopenharmony_ciregular events, those emitted by the kernel, to support combining guest and 61962306a36Sopenharmony_cihost records. 62062306a36Sopenharmony_ci 62162306a36Sopenharmony_ci 62262306a36Sopenharmony_ciThe header is followed by compressed data frame that can be decompressed 62362306a36Sopenharmony_ciinto array of perf trace records. The size of the entire compressed event 62462306a36Sopenharmony_cirecord including the header is limited by the max value of header.size. 62562306a36Sopenharmony_ci 62662306a36Sopenharmony_ciEvent types 62762306a36Sopenharmony_ci 62862306a36Sopenharmony_ciDefine the event attributes with their IDs. 62962306a36Sopenharmony_ci 63062306a36Sopenharmony_ciAn array bound by the perf_file_section size. 63162306a36Sopenharmony_ci 63262306a36Sopenharmony_ci struct { 63362306a36Sopenharmony_ci struct perf_event_attr attr; /* Size defined by header.attr_size */ 63462306a36Sopenharmony_ci struct perf_file_section ids; 63562306a36Sopenharmony_ci } 63662306a36Sopenharmony_ci 63762306a36Sopenharmony_ciids points to a array of uint64_t defining the ids for event attr attr. 63862306a36Sopenharmony_ci 63962306a36Sopenharmony_ciPipe-mode data 64062306a36Sopenharmony_ci 64162306a36Sopenharmony_ciPipe-mode avoid seeks in the file by removing the perf_file_section and flags 64262306a36Sopenharmony_cifrom the struct perf_header. The trimmed header is: 64362306a36Sopenharmony_ci 64462306a36Sopenharmony_cistruct perf_pipe_file_header { 64562306a36Sopenharmony_ci u64 magic; 64662306a36Sopenharmony_ci u64 size; 64762306a36Sopenharmony_ci}; 64862306a36Sopenharmony_ci 64962306a36Sopenharmony_ciThe information about attrs, data, and event_types is instead in the 65062306a36Sopenharmony_cisynthesized events PERF_RECORD_ATTR, PERF_RECORD_HEADER_TRACING_DATA, 65162306a36Sopenharmony_ciPERF_RECORD_HEADER_EVENT_TYPE, and PERF_RECORD_HEADER_FEATURE 65262306a36Sopenharmony_cithat are generated by perf record in pipe-mode. 65362306a36Sopenharmony_ci 65462306a36Sopenharmony_ci 65562306a36Sopenharmony_ciReferences: 65662306a36Sopenharmony_ci 65762306a36Sopenharmony_ciinclude/uapi/linux/perf_event.h 65862306a36Sopenharmony_ci 65962306a36Sopenharmony_ciThis is the canonical description of the kernel generated perf_events 66062306a36Sopenharmony_ciand the perf_event_attrs. 66162306a36Sopenharmony_ci 66262306a36Sopenharmony_ciperf_events manpage 66362306a36Sopenharmony_ci 66462306a36Sopenharmony_ciA manpage describing perf_event and perf_event_attr is here: 66562306a36Sopenharmony_cihttp://web.eece.maine.edu/~vweaver/projects/perf_events/programming.html 66662306a36Sopenharmony_ciThis tends to be slightly behind the kernel include, but has better 66762306a36Sopenharmony_cidescriptions. An (typically older) version of the man page may be 66862306a36Sopenharmony_ciincluded with the standard Linux man pages, available with "man 66962306a36Sopenharmony_ciperf_events" 67062306a36Sopenharmony_ci 67162306a36Sopenharmony_cipmu-tools 67262306a36Sopenharmony_ci 67362306a36Sopenharmony_cihttps://github.com/andikleen/pmu-tools/tree/master/parser 67462306a36Sopenharmony_ci 67562306a36Sopenharmony_ciA definition of the perf.data format in python "construct" format is available 67662306a36Sopenharmony_ciin pmu-tools parser. This allows to read perf.data from python and dump it. 67762306a36Sopenharmony_ci 67862306a36Sopenharmony_ciquipper 67962306a36Sopenharmony_ci 68062306a36Sopenharmony_ciThe quipper C++ parser is available at 68162306a36Sopenharmony_cihttp://github.com/google/perf_data_converter/tree/master/src/quipper 68262306a36Sopenharmony_ci 683