命令
命令格式
perf record [-e <EVENT> | --event=EVENT] [-a] <command>
perf record [-e <EVENT> | --event=EVENT] [-a] \-- <command> [<options>]
描述
运行一个 “command”,并从中收集性能计数器配置文件到 perf.data 中,而不显示任何内容。稍后可以使用 “perf-report” 检查此文件。
选项
-
-e, --event <event>
选择 PMUs 事件。这些事件可以是:-
使用 “perf list” 列出的符号事件中的一个
-
使用 rN 形式的原始 PMU 事件
-
一个被冒号和修饰符列表修饰的符号 MPU 或者原始 MPU
-
一个参数化的事件
-
以符号形式形成的事件,例如
pmu/config=M,config1=N,config3=K/
其中M、N、K是数字(十进制、十六进制、八进制格式)。可接受 “config”;“config1” 和 “config2” 中每个的值可以在/sys/bus/event_source/devices/<pmu>/format/*
的相应条目找到定义。
“param1” 和 “param2” 的 PMU 格式可以在/sys/bus/event_source/devices/<pmu>/format/*
的相应条目中找到定义。还有一些参数没有在
.../<pmu>/format/*
中定义。这些参数可用于重载每个事件的默认配置值。
以下是一些常见参数:-
“period”:设置事件采样周期
-
‘freq’:设置事件采样频率
-
‘time’:禁用/启用时间戳,1 表示启动(默认值),0 表示禁用
-
‘call-graph’:禁用/启用调用图。可接受的str为:
-“fp” 为 FP 模式,
-“dwarf”为 FWARF 模式,
-“lbr”为 LBR 模式,
-“no”表示禁用调用图, -
‘stack-size’:dwarf 模式的用户堆栈大小;
-
‘name’:用户定义的事件名字。单引号(')可用于转义shell和工具解析名称中的符号,如下所示:
name=\'CPU_CLK_UNHALTED.THREAD:cmask=0x1\'
; -
‘aux-output’:生成 AUX 记录而不是事件。这要求还提供 AUX 区域事件;
-
‘aux-sample-size’:设置 AUX 区域采样的样本大小。如果使用了 “–aux-sample” 选项,则通过设置 aux-samplesize=0 来禁用事件的 aux 区域采样;
Tips:
- perf-list[1] man page可以查看更多参数
- 如果用户显式设置与参数冲突的选项,则参数设置的值将被覆盖。
- 另外,未在
.../<pmu>/format/*
中定义的 pmu 驱动程序特定的配置参数。任何以字母 “@” 开头的配置参数都不会在用户空间中进行解释,而是直接发送到 PMU 驱动程序。
例如:perf record -e some_event/@cfg1,@cfg2=config/ ...
将看到 “cfg1” 和 “cfg2=config” 被推送到与该事件关联的PMU驱动程序以进行进一步处理。只要PMU驱动程序理解并支持配置参数的语义,配置参数就没有限制。
-
-
硬件断点事件。形式为 ‘\mem:addr[/len][:access]’ ,其中addr是要插入的内存中的地址。Access是它可以访问的内存访问类型(读、写、执行),格式:
'\mem:addr[:[r][w][x]]'
;len是范围,断点将覆盖的指定addr中的字节数。如果要在0x1000中评测读写访问,只需设置 “mem:0x1000:rw”;如果您想在[0x1000~1008)中评测写访问,只需设置 “mem:0x1000/8:w”。 -
BPF 事件。BPF 源文件(以 .c 结尾)或预编译的对象文件(以 .o 结尾)选择一个或多个 BPF 事件。BPF 程序可以根据 ELF 节的名称附加到各种 perf 事件。在处理 “.c” 文件时,perf 首先搜索已安装的 LLVM,将其编译为对象文件。可选的 clang 选项可以通过 “–clang opt” 命令行选项传递,例如:
perf record --clang-opt "-DLINUX_VERSION_CODE=0x50000" -e tests/bpf-script-example.c
Tips:
“–clang opt”必须放在“–event/-e”之前- 事件组。格式由一对大括号包围,例如(“{event1,event2,…}”)。 每个事件都用逗号分隔,并且应该引用组以防止 shell 解释。您还需要在 “perf-report” 上使用 --group 来一起查看组事件。
-
-
–filter <filter>
事件筛选器。此选项应位于事件选择器(-e)之后,该事件选择器选择跟踪点事件或硬件跟踪PMU(例如 Intel PT 或 CoreSight )。-
tracepoint filters
在 tracepoints 的情况下,多个 “–filter” 选项使用 “&&” 进行组合。 -
address filters
硬件跟踪 PMUs 事件,通过在```/sys/bus/event_source/devices//nr_addr_filters``中设定非零值来来接受多个地址筛选器。地址筛选器的格式:
filter|start|stop|tracestop <start> [/ <size>] [@<file name>]
- ‘filter’: 定义需要跟踪的区域;
- ‘start’: 定义需要跟踪区域的开始地址;
- ‘stop’: 定义跟踪将停止的地址;
- ‘tracestop’: 定义将停止跟踪的区域;
<file name> 是对象文件的名称,
<start> 是该文件中要跟踪的代码的偏移量,
<size> 是要跟踪的区域的大小;
’“start”和“stop”筛选器不需要指定 <size>。如果没有指定对象文件,则在这种情况下,假定内核起始地址必须是当前内核内存地址。
<start> 可以通过提供符号的名称来指定。如果符号的名称不是唯一的,则通过插入 #n 来消除歧义,其中 “n” 选择地址顺序中的第 n 个符号。<size> 也可以通过提供符号的名称来指定,在这种情况下,大小将计算到该符号的末尾。对于 “filter” 和 “tracestop” 筛选器,如果省略了 <size> 并且 <start> 是一个符号,则大小将计算到该符号的末尾。如果省略了 <size> ,并且 <start> 为 “*”,则将从第一个和最后一个符号计算开始和大小,即跟踪整个文件。
如果跟踪区域不在单个映射中,内核可能无法配置跟踪区域。可以检查MMAP事件(或
/proc/<pid>/maps
),以确定是否存在这种可能性。Tips:
- 如果提供了符号名称(或 “*” ),则必须用空格将其包围。
- 传递给内核的筛选器不一定与输入的筛选器相同。要查看传递的筛选器,请使用 -v 选项。
- 多个筛选器采用空格或冒号区分
-
-
–exclude-perf
不要记录 perf 本身发出的事件。此选项应该跟在选择跟踪点事件的事件选择器(-e)后面。它添加了一个筛选器表达式 'common_pid!=$PERFPID’ 到过滤器。如果存在其他 “–filter”,则新的筛选器表达式将通过 “&&” 与它们组合。 -
-a, --all-cpus
在系统范围内统计所有 CPUs 的事件——如果没有指定目标。 -
-p, --pid <pid>
统计指定的进程的事件,多个进程使用冒号进行分割。 -
-t, --tid <tid>
统计指定的线程的事件,多个线程使用冒号进行分割。
默认情况下,此选项还禁用继承。通过添加启用 “–inherit“ 。 -
-u, --uid <user>
记录线程中的事件,这些线程被 uid 、姓名或 number 创建。 -
-r, --realtime <n>
使用此 RT SCHED_FFIFO 优先级收集数据。 -
–no-buffering
在没有缓冲的情况下收集数据。 -
-c, --count <n>
事件的采样周期。 -
-o, --output <file>
输出到 file 中。 -
-i, --no-inherit
子任务不继承计数器 -
-F, --freq <freq or ‘max’>
此频率的配置文件。
使用 ‘max’ 可以使用当前允许的最大频率,例如kernel.perf_event_max_sample_rate sysctl
中的值,将节流至当前允许的最大频率。 -
–strict-freq
如果指定的频率沒有被使用,则失败 -
-m, --mmap-pages <pages[,pages]>
mmap 数据页的数量(必须是二的幂)或带有附加单位字符 - B/K/M/G。size 将向上取整到最接近的页面二次幂值。
此外,通过添加逗号,可以指定 AUX 区域跟踪的 mmap 页数。 -
–group
将所有事件放在一个事件组中。它位于 --event 选项之前,仅保留用于向后兼容性。 -
-g
为内核空间和用户空间启用调用图(堆栈链/回溯)记录。 -
–call-graph
设置并启用调用图(堆栈链/回溯)记录,相当于开启 -g 选项。默认值为 “fp”(表示用户空间)。内核空间使用的展开方法取决于活动内核配置使用的展开器,即CONFIG_unwinder_FRAME_POINTER(fp)
或CONFIG_unwinder_ORC(ORC)
。
此处指定的任何选项都控制用于用户空间的方法。
有效选项为:- “fp”(帧指针)
- “dwarf”(dwarf的CFI-调用帧信息)
- “lbr”(硬件最后分支记录功能)
-
-q, --quiet
不打印任何警告或消息,这对编写脚本很有用。 -
-v, --verbose
更加详细(显示计数器打开错误等)。 -
-s, --stat
记录每个线程的事件计数。将它与 “perf-report-T” 一起使用可以查看值。 -
-d, --data
记录采样的虚拟地址。 -
–phys-data
记录采样的物理地址。 -
–data-page-size
记录采样的数据地址数据页面大小。 -
–code-page-size
记录采样的代码地址(ip)页面大小。 -
-T, --timestamp
记录样本时间戳。例如,将它与perf-report-D
一起使用可以查看时间戳。 -
-P, --period
记录采样周期。 -
–sample-cpu
记录采样 CPU。 -
-n, --no-samples
不采样。 -
-R, --raw-samples
从所有打开的计数器收集原始样本记录(跟踪点计数器的默认值)。 -
-C, --cpu
仅在提供的 CPU 列表中收集样本。多个 CPU 可以作为逗号分隔的列表提供,没有空格例如:0,1。CPU 的范围用 “- ” 例如:0-2 指定。在启用继承模式(默认)的每线程模式中,只有当线程在指定的 CPU 上执行时,才会捕获样本。默认情况是监视所有 CPU。 -
-B, --no-buildid
不要将二进制文件的内部版本 ID 保存在 perf.data 文件中。这会跳过录制后的后期处理,这有时会使录制过程中的最后一步花费很长时间,因为它需要处理所有寻找 mmap 记录的事件。缺点是,如果在本地重建或升级录制时使用的工作负载二进制文件,它可能会错误解析符号,因为在这种情况下,唯一可用的密钥是路径名。还可以将 “record.build-id” 配置变量设置为 “skip”,以永久保持这种行为。 -
-N, --no-buildid-cache
不要更新buildid缓存。在perf.data文件(包括buildid)中的信息足够的情况下,这节省了一些开销。您也可以将“record.build-id”配置变量设置为“no-cache”以获得相同的效果。 -
-G name,…, --cgroup name,…
只在名为 “name” 的容器(cgroup)中监视。此选项仅在每 cpu 模式下可用。使用前必须安装 cgroup 文件系统。当属于容器 “name” 的所有线程在被监视的 CPU 上运行时,它们都会被监视。
可以提供多个 cgroup。每个 cgroup 应用于相应的事件,即第一 cgroup 到第一事件,第二 cgroup 对第二事件,依此类推。可以使用例如 -g foo、、bar 来提供一个空的 cgroup (一直监视)。
Cgroup 必须具有相应的事件,即它们总是指在命令行中较早定义的事件。
如果用户想要跟踪特定 cgroup 的多个事件,则用户可以使用 “-e e1-e e2-G foo,foo” 或仅使用 “-ee e1-e e2-G foo”。perf stat -e cycles -G cgroup_name -a -e cycles
该命令用于收集和显示性能计数器统计信息。
cgroup_name 会出现在/sys/fs/cgroup/
文件夹下
-e Cycles 选项指定应监视循环事件。 该事件表示受监视程序或系统执行的 CPU 周期数。
-G cgroup_name 选项指示应在指定的 cgroup 内进行监控。 cgroup_name 应替换为您要监控的 cgroup 的实际名称。
-a 选项指示 perf stat 监视系统范围的事件。 这意味着它将收集系统中运行的所有进程的统计信息,而不仅仅是特定进程。
总的来说,该命令将使用 perf stat 监视指定 cgroup 内的周期事件,收集系统范围的统计信息。 -
-b, --branch-any
启用已采取的分支堆栈采样。 可以对任何类型的所取分支进行采样。这是 --branch-filter any 的快捷方式。 请参阅 --branch-filter 了解更多信息。 -
-j, --branch-filter
启用已采取的分支堆栈采样。 每个样本捕获一系列连续的分支。 每个样本捕获的分支数量取决于底层硬件、感兴趣的分支类型和执行的代码。 可以通过启用过滤器来选择捕获的分支类型。 定义了以下过滤器:- any: 任何类型的分支
- any_call: 任何功能调用或者系统调用
- any_ret: 任何功能调用返回或者系统调用返回
- ind_call: 任何间接分支
- call: 直接调用,包括远程(到/从内核)调用
- u: 仅当分支目标时用户级别时使用
- k: 仅当分支目标时内核级别时使用
- hv: 仅当目标处于虚拟机管理程序级别时使用
- in_tx: 仅当目标处于硬件事务中时使用
- no_tx: 仅当目标不是硬件事务中时使用
- abort_tx: only 仅当目标是硬件事务中止时使用
- cond: 条件分支
- save_type: 在采样期间保存分支类型,以防以后二进制不可用
该选项需要 any、any_call、any_ret、ind_call、cond 中至少一种分支类型。 特权级别可以被省略,在这种情况下,关联事件的特权级别被应用于分支过滤器。 内核 (k) 和管理程序 (hv) 特权级别均受权限限制。 对多个事件进行采样时,会对所有采样事件启用分支堆栈采样。 所有事件的采样分支类型都相同。 各种过滤器必须指定为逗号分隔列表:
--branch-filter any_ret,u,k
请注意,此功能可能不适用于所有处理器。
-
–weight
启用加权采样。 每个样本都会记录一个额外的权重,并且可以按 Weight 和 local_weight 排序显示。 目前,这适用于现代 Intel CPU 上精确模式下的 TSX 中止事件和一些内存事件。 -
–namespaces
记录 PERF_RECORD_NAMESPACES 类型的事件,并按照 cgroup_id 排序。 -
–all-cgroups
记录 PERF_RECORD_CGROUP 类型的事件,并按照 cgroup 排序。 -
–transaction
记录事务相关事件的标志。 -
–per-thread
使用每线程 mmap。 默认情况下,会创建每个 cpu 的 mmap。此选项会覆盖该选项并使用每线程映射。 其副作用是继承被自动禁用。 如果与 -a 或 -C 选项结合使用,–per-thread 将被忽略并出现警告。 -
-D, --delay=
启动程序后,在测量之前等待几毫秒(-1:在禁用事件的情况下启动)。 这对于过滤掉程序的启动阶段很有用,该阶段通常非常不同。perf record --delay=1000 -e cycles ls
-
-I, --intr-regs
在中断时捕获机器状态(寄存器),例如在每个样本的计数器溢出时。
捕获的寄存器列表取决于架构。
该选项默认关闭。
可以使用符号名称选择要采样的寄存器,例如 在 x86、ax、si 上。 要列出可用寄存器,请使用--intr-regs=\?
。 要命名寄存器,请传递逗号分隔的列表,例如--intr-regs=ax,bx
。 寄存器列表取决于体系结构。 -
–user-regs
与-I
类似,但在采样时捕获用户寄存器。 要列出可用的用户寄存器,请使用--user-regs=\?
。 -
–running-time
记录读取事件的运行和启用时间 (:S) -
-k, --clockid
设置用于 perf_event_type 记录中的各种时间字段的时钟 ID。 请参见clock_gettime()。 特别是支持 CLOCK_MONOTONIC 和 CLOCK_MONOTONIC_RAW,某些事件可能还允许 CLOCK_BOOTTIME、CLOCK_REALTIME 和 CLOCK_TAI。 -
-S, --snapshot
选择AUX区域跟踪快照模式。 此选项仅对 AUX 区域跟踪事件有效。 或者,可以在此选项后面的字符串中指定某些快照捕获参数: e:退出时拍摄最后一张快照; 保证输出文件中至少有一个快照; :如果 PMU 支持,请指定所需的快照大小。 -
–aux-sample[=OPTIONS]
选择 AUX 区域采样。 -e 选项选择的事件中至少有一个必须是 AUX 区域事件。 将创建包含来自 AUX 区域的数据的其他事件的样本。 可以选择指定样本大小,否则默认为 4KiB。 -
–proc-map-timeout
当处理预先存在的线程/proc/XXX/mmap
时,可能需要很长时间,因为文件可能很大。 在这种情况下需要暂停。 该选项设置超时限制。 默认值为 500 毫秒。 -
–switch-events
记录上下文切换事件,即 PERF_RECORD_SWITCH 或 PERF_RECORD_SWITCH_CPU_WIDE 类型的事件。 在某些情况下(例如 Intel PT 或 CoreSight),切换事件将自动启用,可以通过选项 --no-switch-events 来抑制。 -
–clang-path=PATH
用于编译 BPF scriptlet 的 clang 二进制文件的路径。 (当 BPF 支持开启时启用)。 -
–clang-opt=OPTIONS
编译 BPF scriptlet 时传递给 clang 的选项。 (当 BPF 支持开启时启用)。 -
–vmlinux=PATH
指定具有 debuginfo 的 vmlinux 路径。 (当 BPF 序言打开时启用)。 -
–buildid-all
记录所有 DSO 的 build-id,无论它是否实际命中。 -
–buildid-mmap
在 mmap2 事件中记录构建 ID,禁用构建 ID 缓存(意味着 --no-buildid)。 -
–aio[=n]
在异步 (Posix AIO) 跟踪写入模式下使用 个控制块(默认值:1,最大:4)。 仅当将 Perf 工具与提供 Posix AIO API 实现的 libc 库链接时才支持异步模式。 -
–affinity=mode
根据 mode 值定义的策略设置跟踪读取线程的亲和性掩码: 节点 - 线程亲和性掩码设置为 NUMA 节点 已处理的 mmap 缓冲区的 cpu 掩码 cpu - 线程亲和性掩码设置为已处理的 mmap 缓冲区的 cpu。 -
–mmap-flush=number
- 指定从 mmap 数据页中提取并处理输出的最小字节数。 可以使用 B/K/M/G 后缀指定数字。
- 允许的最大值为映射数据页大小的四分之一。
- 默认选项值为 1 个字节,这意味着每次输出写入线程在 mmaped 缓冲区中找到一些新数据时,都会提取数据,可能会压缩 (-z) 并将其写入输出、perf.data 或管道。
- 与较小的数据块相比,较大的数据块的压缩效率更高,因此从减小输出大小的角度来看,从 mmap 数据页中提取较大的数据块是更优的选择。
- 此外,在某些情况下,使用较大数据大小执行较少输出写入系统调用比使用较小数据大小执行较多输出写入系统调用花费的时间更少,从而降低运行时分析开销。
-
-z, --compression-level[=n]
使用指定级别 n 生成压缩跟踪(默认值:1 - 最快压缩,22 - 最小跟踪) -
–all-kernel
设置所有被使用的事件运行在内核空间 -
–all-user
设置所有被使用的事件运行在用户空间 -
–kernel-callchains
仅从内核空间收集调用链。 此选项将perf_event_attr.exclude_callchain_user
设置为 1。 -
–user-callchains
仅从用户空间收集调用链。 此选项将perf_event_attr.exclude_callchain_kernel
设置为 1。
不要同时使用--kernel-callchains
和--user-callchains
否则不会收集任何调用链。 -
–timestamp-filename
在输出文件名中添加时间戳。 -
–timestamp-boundary
记录时间戳边界(第一个/最后一个样本的时间)。 -
–switch-output[=mode]
生成多个 perf.data 文件,带时间戳前缀,根据模式值切换到新文件:“signal” - 当收到 SIGUSR2(默认值)或 - 当达到大小阈值时,size 预计为一个数字 带有附加单位字符 - B/K/M/G。
<time> - 当达到时间阈值时,大小预计为带有附加单位字符的数字 - s/m/h/d注意:大小阈值的精度很大程度上取决于您的配置 - 环形缓冲区 (-m) 的数量和大小。 对于较大的尺寸(例如 > 5M),它通常更精确,对于较低的值,期望不同的尺寸。
一个可能的用例是,在给定外部事件的情况下,对随后处理的 perf.data 文件进行切片(可能通过 perf 脚本),以决定是否应保留该特定的 perf.data 快照。
此选项意味着 --timestamp-filename、–no-buildid 和 --no-buildid-cache。 后两者的原因是为了减少数据文件切换开销。 您仍然可以通过以下方式打开它们:
--switch-output --no-no-buildid --no-no-buildid-cache
-
–switch-output-event
该选项用于指定在记录性能事件时切换输出的事件。--switch-output-event
选项后面需要指定一个事件名称或事件标识符。当这个事件发生时,perf 工具会自动切换输出到不同的文件。
这个选项通常用于在多个事件发生时,将不同的事件数据记录到不同的输出文件中,以便后续分析和比较。通过将不同的事件数据分开记录,可以更好地了解不同事件的性能特征和影响。
示例:
perf record --switch-output-event=cpu-cycles,task-clock -e cpu-cycles,task-clock sleep 5
上述命令中,--switch-output-event
选项指定了两个事件:cpu-cycles 和 task-clock。当这两个事件中的任意一个事件发生时,perf 工具会自动切换输出到不同的文件。 -
–switch-max-files=N
该选项用于设置在记录性能事件时切换输出文件的最大数量。N 表示允许的最大输出文件数量。当达到指定的文件数量后,perf 工具会循环使用已创建的输出文件进行记录。
这个选项主要用于限制输出文件的数量,以防止生成过多的输出文件而导致存储空间耗尽或产生过多的记录文件。 -
–dry-run
解析选项然后退出。 该选项可用于检测 cmdline 选项中的错误。 -
–synth=TYPE
收集并综合给定类型的事件(逗号分隔)。 请注意,此选项控制 /proc 文件系统的综合,该文件系统表示预先存在的线程的任务状态。
无论此选项中的选择如何,都会记录内核(和其他一些)事件。 例如,–synth=no 将为内核和模块提供 MMAP 事件。
有效的类型为:
- ‘task’ 为每个任务合成 FORK 和 COMM 事件
- ‘mmap’ 为每个进程合成 MMAP 事件
- ‘cgroup’ 综合每个cgroup的CGROUP事件
- ‘all’ 合成所有事件(默认)
- ‘no’ 不要综合上述任何事件 -
–tail-synthesize
不要在记录开始时收集非样本事件(例如 fork、comm、mmap),而是在最终确定输出文件期间收集它们。 收集的非样本事件反映了记录完成时系统的状态。 -
–overwrite
使所有事件使用可覆盖的环形缓冲区。 可覆盖环形缓冲区的工作方式:当它变满时,内核将覆盖最旧的记录,因此永远不会将其写入 perf.data 文件。
当使用 --overwrite 和 --switch-output 时,perf 记录并丢弃事件,直到收到信号,这意味着检测到异常情况,需要拍摄最新事件的快照,这些事件当时适合环形缓冲区 。
还可以使用配置术语为事件设置或取消覆盖属性。 -
–kcore
创建一份/proc/kcore
的副本,并将其放入到 perf 数据文件所在的文件夹下。 -
–max-size=<size>
限制样本数据最大大小,<size> 应为带有单位字符的数字 - B/K/M/G -
–num-thread-synthesize
合成现有进程的事件时要运行的线程数。 默认情况下,线程数等于 1。 -
-control=fifo:ctl-fifo[,ack-fifo], --control=fd:ctl-fd[,ack-fd]
ctl-fifo / ack-fifo 打开并用作 ctl-fd / ack-fd,如下所示。
监听 ctl-fd 描述符以获取控制测量的命令。- ‘enable’ : 使能事件
- ‘disable’ : 禁止事件
- ‘enable name’ : 使能指定名字为 ‘name’ 的事件
- ‘disable name’ : 禁止指定名字为 ‘name’ 的事件
- ‘snapshot’ : 辅助区域跟踪快照
- ‘stop’ : 停止 perf 的记录
- ‘ping’ : ping
- 'evlist [-v|-g|-F] : 显示所有事件
-F 仅显示每个事件使用的采样频率。
-v 显示所有字段。
-g 显示事件组信息。
记录和报告
可以使用 --delay=-1
选项禁用事件来开始测量。 可以选择将控制命令完成 (ack\n) 发送到 ack-fd 描述符以与控制进程同步。 用于在测量期间启用和禁用事件的 bash shell 脚本示例:
#!/bin/bash
ctl_dir=/tmp/
ctl_fifo=${ctl_dir}perf_ctl.fifo
test -p ${ctl_fifo} && unlink ${ctl_fifo}
mkfifo ${ctl_fifo}
exec {ctl_fd}<>${ctl_fifo}
ctl_ack_fifo=${ctl_dir}perf_ctl_ack.fifo
test -p ${ctl_ack_fifo} && unlink ${ctl_ack_fifo}
mkfifo ${ctl_ack_fifo}
exec {ctl_fd_ack}<>${ctl_ack_fifo}
perf record -D -1 -e cpu-cycles -a \
--control fd:${ctl_fd},${ctl_fd_ack} \
-- sleep 30 &
perf_pid=$!
sleep 5 && echo 'enable' >&${ctl_fd} && read -u ${ctl_fd_ack} e1 && echo "enabled(${e1})"
sleep 10 && echo 'disable' >&${ctl_fd} && read -u ${ctl_fd_ack} d1 && echo "disabled(${d1})"
exec {ctl_fd_ack}>&-
unlink ${ctl_ack_fifo}
exec {ctl_fd}>&-
unlink ${ctl_fifo}
wait -n ${perf_pid}
exit $?
Intel 混合构架的支持
在 intel 的平台,新的架构是混合平台,包括了 atom cpu 和 core cpu。每个 cpu 都有一个事件类表。
内核通过 sysfs 文件系统到处两种 pmus:/sys/devices/cpu_core /sys/devices/cpu_atom
特定 PMU
要使能混合构架中的特定 PMU,可以通过以下语法来实现:
pu_core/<event name>/
——使能 core 的事件
cpu_atom/<event name>/
——使能 atom 的事件
例如:
perf stat -e cpu_core/cycles/ ls
执行结果:
cpu_core/cycles 即为在执行期间记录到的 core 核心的核心周期数。
一个硬件自动创建两个事件
当创建一个事件,而这个事件同时被 atom 和 core 两个核心支持的时候,会自动创建两个事件:一个是 atom 的事件,一个是 core 的事件。大多数的硬件事件和 cache 事件都同时被这两种核心支持。
在混合构架中,kernel 需要知道事件来自于那种核心。 PMU 类型的 ID 可以从 /sys/devices/cpu_atom/type
和/sys/devices/cpu_core/type
中分别检索到。
例如:
perf stat -e cycles -a
执行结果:
从执行结果上看到同时统计了两种核心的同样的事件。
参考文档
Linux 源码的说明文档 tools/perf/Documentation