perf.data format

Uptodate as of v4.7

This document describes the on-disk perf.data format, generated by perf record
or perf inject and consumed by the other perf tools.

On a high level perf.data contains the events generated by the PMUs, plus metadata.

All fields are in native-endian of the machine that generated the perf.data.

When perf is writing to a pipe it uses a special version of the file
format that does not rely on seeking to adjust data offsets.  This
format is described in "Pipe-mode data" section. The pipe data version can be
augmented with additional events using perf inject.

The file starts with a 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];
};

The magic number identifies the perf file and the version. Current perf versions
use PERFILE2. Old perf versions generated a version 1 format (PERFFILE). Version 1
is not described here. The magic number also identifies the endian. When the
magic value is 64bit byte swapped compared the file is in non-native
endian.

A perf_file_section contains a pointer to another section of the perf file.
The header contains three such pointers: for attributes, data and event types.

struct perf_file_section {
	uint64_t offset;	/* offset from start of file */
	uint64_t size;		/* size of the section */
};

Flags section:

The header is followed by different optional headers, described by the bits set
in flags. Only headers for which the bit is set are included. Each header
consists of a perf_file_section located after the initial header.
The respective perf_file_section points to the data of the additional
header and defines its size.

Some headers consist of strings, which are defined like this:

struct perf_header_string {
       uint32_t len;
       char string[len]; /* zero terminated */
};

Some headers consist of a sequence of strings, which start with a

struct perf_header_string_list {
     uint32_t nr;
     struct perf_header_string strings[nr]; /* variable length records */
};

The bits are the flags bits in a 256 bit bitmap starting with
flags. These define the valid bits:

	HEADER_RESERVED		= 0,	/* always cleared */
	HEADER_FIRST_FEATURE	= 1,
	HEADER_TRACING_DATA	= 1,

Describe me.

	HEADER_BUILD_ID = 2,

The header consists of an sequence of build_id_event. The size of each record
is defined by header.size (see perf_event.h). Each event defines a ELF build id
for a executable file name for a pid. An ELF build id is a unique identifier
assigned by the linker to an executable.

struct build_id_event {
	struct perf_event_header header;
	pid_t			 pid;
	uint8_t			 build_id[24];
	char			 filename[header.size - offsetof(struct build_id_event, filename)];
};

	HEADER_HOSTNAME = 3,

A perf_header_string with the hostname where the data was collected
(uname -n)

	HEADER_OSRELEASE = 4,

A perf_header_string with the os release where the data was collected
(uname -r)

	HEADER_VERSION = 5,

A perf_header_string with the perf user tool version where the
data was collected. This is the same as the version of the source tree
the perf tool was built from.

	HEADER_ARCH = 6,

A perf_header_string with the CPU architecture (uname -m)

	HEADER_NRCPUS = 7,

A structure defining the number of CPUs.

struct nr_cpus {
       uint32_t nr_cpus_online;
       uint32_t nr_cpus_available; /* CPUs not yet onlined */
};

	HEADER_CPUDESC = 8,

A perf_header_string with description of the CPU. On x86 this is the model name
in /proc/cpuinfo

	HEADER_CPUID = 9,

A perf_header_string with the exact CPU type. On x86 this is
vendor,family,model,stepping. For example: GenuineIntel,6,69,1

	HEADER_TOTAL_MEM = 10,

An uint64_t with the total memory in bytes.

	HEADER_CMDLINE = 11,

A perf_header_string with the perf command line used to collect the data.

	HEADER_EVENT_DESC = 12,

Another description of the perf_event_attrs, more detailed than header.attrs
including IDs and names. See perf_event.h or the man page for a description
of a struct perf_event_attr.

struct {
       uint32_t nr; /* number of events */
       uint32_t attr_size; /* size of each perf_event_attr */
       struct {
	      struct perf_event_attr attr;  /* size of attr_size */
	      uint32_t nr_ids;
	      struct perf_header_string event_string;
	      uint64_t ids[nr_ids];
       } events[nr]; /* Variable length records */
};

	HEADER_CPU_TOPOLOGY = 13,

String lists defining the core and CPU threads topology.

struct {
       struct perf_header_string_list cores; /* Variable length */
       struct perf_header_string_list threads; /* Variable length */
};

Example:
	sibling cores   : 0-3
	sibling threads : 0-1
	sibling threads : 2-3

	HEADER_NUMA_TOPOLOGY = 14,

	A list of NUMA node descriptions

struct {
       uint32_t nr;
       struct {
	      uint32_t nodenr;
	      uint64_t mem_total;
	      uint64_t mem_free;
	      struct perf_header_string cpus;
       } nodes[nr]; /* Variable length records */
};

	HEADER_BRANCH_STACK = 15,

Not implemented in perf.

	HEADER_PMU_MAPPINGS = 16,

	A list of PMU structures, defining the different PMUs supported by perf.

struct {
       uint32_t nr;
       struct pmu {
	      uint32_t pmu_type;
	      struct perf_header_string pmu_name;
       } [nr]; /* Variable length records */
};

	HEADER_GROUP_DESC = 17,

	Description of counter groups ({...} in perf syntax)

struct {
         uint32_t nr;
         struct {
		struct perf_header_string string;
		uint32_t leader_idx;
		uint32_t nr_members;
	 } [nr]; /* Variable length records */
};

	HEADER_AUXTRACE = 18,

Define additional auxtrace areas in the perf.data. auxtrace is used to store
undecoded hardware tracing information, such as Intel Processor Trace data.

/**
 * struct auxtrace_index_entry - indexes a AUX area tracing event within a
 *                               perf.data file.
 * @file_offset: offset within the perf.data file
 * @sz: size of the event
 */
struct auxtrace_index_entry {
	u64			file_offset;
	u64			sz;
};

#define PERF_AUXTRACE_INDEX_ENTRY_COUNT 256

/**
 * struct auxtrace_index - index of AUX area tracing events within a perf.data
 *                         file.
 * @list: linking a number of arrays of entries
 * @nr: number of entries
 * @entries: array of entries
 */
struct auxtrace_index {
	struct list_head	list;
	size_t			nr;
	struct auxtrace_index_entry entries[PERF_AUXTRACE_INDEX_ENTRY_COUNT];
};

	other bits are reserved and should ignored for now
	HEADER_FEAT_BITS	= 256,

Attributes

This is an array of perf_event_attrs, each attr_size bytes long, which defines
each event collected. See perf_event.h or the man page for a detailed
description.

Data

This section is the bulk of the file. It consist of a stream of perf_events
describing events. This matches the format generated by the kernel.
See perf_event.h or the manpage for a detailed description.

Some notes on parsing:

Ordering

The events are not necessarily in time stamp order, as they can be
collected in parallel on different CPUs. If the events should be
processed in time order they need to be sorted first. It is possible
to only do a partial sort using the FINISHED_ROUND event header (see
below). perf record guarantees that there is no reordering over a
FINISHED_ROUND.

ID vs IDENTIFIER

When the event stream contains multiple events each event is identified
by an ID. This can be either through the PERF_SAMPLE_ID or the
PERF_SAMPLE_IDENTIFIER header. The PERF_SAMPLE_IDENTIFIER header is
at a fixed offset from the event header, which allows reliable
parsing of the header. Relying on ID may be ambiguous.
IDENTIFIER is only supported by newer Linux kernels.

Perf record specific events:

In addition to the kernel generated event types perf record adds its
own event types (in addition it also synthesizes some kernel events,
for example MMAP events)

	PERF_RECORD_USER_TYPE_START		= 64,
	PERF_RECORD_HEADER_ATTR			= 64,

struct attr_event {
	struct perf_event_header header;
	struct perf_event_attr attr;
	uint64_t id[];
};

	PERF_RECORD_HEADER_EVENT_TYPE		= 65, /* deprecated */

#define MAX_EVENT_NAME 64

struct perf_trace_event_type {
	uint64_t	event_id;
	char	name[MAX_EVENT_NAME];
};

struct event_type_event {
	struct perf_event_header header;
	struct perf_trace_event_type event_type;
};


	PERF_RECORD_HEADER_TRACING_DATA		= 66,

Describe me

struct tracing_data_event {
	struct perf_event_header header;
	uint32_t size;
};

	PERF_RECORD_HEADER_BUILD_ID		= 67,

Define a ELF build ID for a referenced executable.

       struct build_id_event;   /* See above */

	PERF_RECORD_FINISHED_ROUND		= 68,

No event reordering over this header. No payload.

	PERF_RECORD_ID_INDEX			= 69,

Map event ids to CPUs and TIDs.

struct id_index_entry {
	uint64_t id;
	uint64_t idx;
	uint64_t cpu;
	uint64_t tid;
};

struct id_index_event {
	struct perf_event_header header;
	uint64_t nr;
	struct id_index_entry entries[nr];
};

	PERF_RECORD_AUXTRACE_INFO		= 70,

Auxtrace type specific information. Describe me

struct auxtrace_info_event {
	struct perf_event_header header;
	uint32_t type;
	uint32_t reserved__; /* For alignment */
	uint64_t priv[];
};

	PERF_RECORD_AUXTRACE			= 71,

Defines auxtrace data. Followed by the actual data. The contents of
the auxtrace data is dependent on the event and the CPU. For example
for Intel Processor Trace it contains Processor Trace data generated
by the CPU.

struct auxtrace_event {
	struct perf_event_header header;
	uint64_t size;
	uint64_t offset;
	uint64_t reference;
	uint32_t idx;
	uint32_t tid;
	uint32_t cpu;
	uint32_t reserved__; /* For alignment */
};

struct aux_event {
	struct perf_event_header header;
	uint64_t	aux_offset;
	uint64_t	aux_size;
	uint64_t	flags;
};

	PERF_RECORD_AUXTRACE_ERROR		= 72,

Describes an error in hardware tracing

enum auxtrace_error_type {
	PERF_AUXTRACE_ERROR_ITRACE  = 1,
	PERF_AUXTRACE_ERROR_MAX
};

#define MAX_AUXTRACE_ERROR_MSG 64

struct auxtrace_error_event {
	struct perf_event_header header;
	uint32_t type;
	uint32_t code;
	uint32_t cpu;
	uint32_t pid;
	uint32_t tid;
	uint32_t reserved__; /* For alignment */
	uint64_t ip;
	char msg[MAX_AUXTRACE_ERROR_MSG];
};

	PERF_RECORD_HEADER_FEATURE		= 80,

Describes a header feature. These are records used in pipe-mode that
contain information that otherwise would be in perf.data file's header.

Event types

Define the event attributes with their IDs.

An array bound by the perf_file_section size.

	struct {
		struct perf_event_attr attr;   /* Size defined by header.attr_size */
		struct perf_file_section ids;
	}

ids points to a array of uint64_t defining the ids for event attr attr.

Pipe-mode data

Pipe-mode avoid seeks in the file by removing the perf_file_section and flags
from the struct perf_header. The trimmed header is:

struct perf_pipe_file_header {
	u64				magic;
	u64				size;
};

The information about attrs, data, and event_types is instead in the
synthesized events PERF_RECORD_ATTR, PERF_RECORD_HEADER_TRACING_DATA,
PERF_RECORD_HEADER_EVENT_TYPE, and PERF_RECORD_HEADER_FEATURE
that are generated by perf record in pipe-mode.


References:

include/uapi/linux/perf_event.h

This is the canonical description of the kernel generated perf_events
and the perf_event_attrs.

perf_events manpage

A manpage describing perf_event and perf_event_attr is here:
http://web.eece.maine.edu/~vweaver/projects/perf_events/programming.html
This tends to be slightly behind the kernel include, but has better
descriptions.  An (typically older) version of the man page may be
included with the standard Linux man pages, available with "man
perf_events"

pmu-tools

https://github.com/andikleen/pmu-tools/tree/master/parser

A definition of the perf.data format in python "construct" format is available
in pmu-tools parser. This allows to read perf.data from python and dump it.

quipper

The quipper C++ parser is available at
https://chromium.googlesource.com/chromiumos/platform2

It is under the chromiumos-wide-profiling/ subdirectory. This library can
convert a perf data file to a protobuf and vice versa.

Unfortunately this parser tends to be many versions behind and may not be able
to parse data files generated by recent perf.
