perf火焰图-2-内核文档翻译
工具源码是在 tools/perf 下,相关文档:
kernel-6.1/tools/perf/Documentation$ ls -l android.txt arm-coresight.txt asciidoc.conf asciidoctor-extensions.rb build-docdep.perl Build.txt build-xed.txt callchain-overhead-calculation.txt cat-texi.perl db-export.txt examples.txt guest-files.txt guestmount.txt intel-bts.txt intel-hybrid.txt intel-pt.txt itrace.txt jitdump-specification.txt jit-interface.txt Makefile manpage-1.72.xsl manpage-base.xsl manpage-bold-literal.xsl manpage-normal.xsl manpage-suppress-sp.xsl perf-annotate.txt perf-archive.txt perf-arm-spe.txt perf-bench.txt perf-buildid-cache.txt perf-buildid-list.txt perf-c2c.txt perfconfig.example perf-config.txt perf-daemon.txt perf.data-directory-format.txt perf.data-file-format.txt perf-data.txt perf-diff.txt perf-dlfilter.txt perf-evlist.txt perf-ftrace.txt perf-help.txt perf-inject.txt perf-intel-pt.txt perf-iostat.txt perf-kallsyms.txt perf-kmem.txt perf-kvm.txt perf-kwork.txt perf-list.txt perf-lock.txt perf-mem.txt perf-probe.txt perf-record.txt #### perf-report.txt perf-sched.txt perf-script-perl.txt perf-script-python.txt perf-script.txt perf-stat.txt perf-test.txt perf-timechart.txt perf-top.txt perf-trace.txt perf.txt #### perf-version.txt security.txt tips.txt topdown.txt
一、perf.txt
perf(1)
=======
NAME
---- perf - Linux 性能分析工具
概要(SYNOPSIS)
--------
[verse]
'perf' [--version] [--help] [OPTIONS] COMMAND [ARGS]
OPTIONS
-------
-h::
--help::
运行 perf 帮助命令。
-v::
--version::
显示 perf 版本。
-vv::
打印库的编译状态。
--exec-path::
显示或设置执行路径。
--html-path::
显示 HTML 文档路径。
-p::
--paginate::
设置分页器。
--no-pager::
不设置分页器。
--buildid-dir::
设置构建 ID 缓存目录。它的优先级高于 buildid.dir 配置文件选项。
--list-cmds::
列出最常用的 perf 命令。
--list-opts::
列出可用的 perf 选项。
--debugfs-dir::
设置 debugfs 目录或设置环境变量 PERF_DEBUGFS_DIR。
--debug::
设置调试变量(参见下方列表),取值范围为(0, 10)。用法示例:
--debug verbose #设置 verbose = 1
--debug verbose=2 # 设置 verbose = 2
可设置的调试变量列表:
verbose - 常规调试信息
ordered-events - 有序事件对象调试信息
data-convert - 数据转换命令调试信息
stderr - 在浏览器模式下将调试输出(-v 选项)写入标准错误输出
perf-event-open - 打印 perf_event_open() 的参数和返回值
描述
-----------
Linux 性能计数器是一个基于内核的新型子系统,它为所有性能分析相关内容提供了一个框架。它涵盖了硬件级(CPU/PMU,性能监控单元)特性和软件级特性(软件计数器、跟踪点)。
二、perf-record.txt
perf-record(1)
==============
名称
---- perf-record - 运行命令并将其性能分析记录到 perf.data 文件中
概要
--------
[verse]
'perf record' [-e <EVENT> | --event=EVENT] [-a] <command>
'perf record' [-e <EVENT> | --event=EVENT] [-a] \-- <command> [<options>]
描述
-----------
此命令运行一个命令,并从中收集性能计数器分析结果,
将其记录到 perf.data 文件中,但不显示任何内容。
之后可以使用 'perf report' 命令查看此文件。
选项
-------
<命令>...::
任何可在 shell 中指定的命令。
-e::
--event=::
选择 PMU 事件。选项可以是:
- 符号事件名称(使用“perf list”列出所有事件)注: 下面有列出。
- 原始 PMU 事件,格式为 rN,其中 N 是一个十六进制值,表示原始寄存器编码,其事件控制寄存器的布局由 /sys/bus/event_source/devices/cpu/format/* 中的条目描述。
- 符号或原始 PMU 事件,后跟一个可选的冒号和一个事件修饰符列表,例如 cpu-cycles:p。有关事件修饰符的详细信息,请参阅 linkperf:perf-list[1] 手册页。
- 符号化的 PMU 事件,例如“pmu/param1=0x3,param2/”,其中“param1”、“param2”等被定义为 /sys/bus/event_source/devices/<pmu>/format/* 中 PMU 的格式。
- 类似“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(禁用时间戳)。默认值为 1。
- 'call-graph':启用/禁用调用图。可接受的字符串为:'fp'(FP 模式)、'dwarf'(DWARF 模式)、'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-sample-size 设置为 0 以禁用该事件的 AUX 区域采样。
更多参数请参见 linkperf:perf-list[1] 手册页。
注意:如果用户显式设置的选项与参数冲突,则参数设置的值将被覆盖。
此外,.../<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 是断点覆盖的范围,即从指定地址开始的字节数。如果要分析 0x1000 处的读写访问,只需设置“mem:0x1000:rw”。
如果要分析 [0x1000~1008] 处的写访问,只需设置:
“mem:0x1000/8:w”。
- BPF 源文件(以 .c 结尾)或预编译目标文件(以 .o 结尾)选择一个或多个 BPF 事件。
BPF 程序可以根据 ELF 段名称附加到各种 perf 事件。
处理 '.c' 文件时,perf 会先在已安装的 LLVM 中搜索并将其编译成目标文件。可以通过 '--clang-opt' 命令行选项传递可选的 clang 选项,例如:
perf record --clang-opt "-DLINUX_VERSION_CODE=0x50000" -e tests/bpf-script-example.c
注意:'--clang-opt' 必须放在 '--event/-e' 之前。
- 一组用花括号括起来的事件("{event1,event2,...}"))。每个事件之间用逗号分隔,并且整个事件组应该用引号括起来,以防止 shell 进行解释。您还需要在 'perf report' 中使用 --group 选项来查看分组事件。
--filter=<filter>::
事件过滤器。此选项应位于事件选择器 (-e) 之后,该选择器用于选择跟踪点事件或硬件跟踪 PMU(例如 Intel PT 或 CoreSight)。
- tracepoint filters
对于跟踪点,多个 `--filter` 选项使用 `&&` 连接。
- address filters
硬件跟踪 PMU 通过在 `/sys/bus/event_source/devices/<pmu>/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 个符号。或者,`#0`、`#g` 或 `#G` 仅选择全局符号。也可以通过提供符号名称来指定 `<size>`,此时大小计算到该符号的末尾。对于 `filter` 和 `tracestop` 过滤器,如果省略 `<size>` 且 `<start>` 是一个符号,则大小计算到该符号的末尾。
如果省略 `<size>` 且 `<start>` 为 `'*'`,则起始地址和大小将从第一个和最后一个符号计算,即跟踪整个文件。
如果提供符号名称(或 `'*'`),则它们必须用空格括起来。
传递给内核的过滤器不一定与输入的过滤器相同。要查看传递的过滤器,请使用 `-v` 选项。
如果跟踪区域不在单个映射中,内核可能无法配置该区域。可以检查 MMAP 事件(或 `/proc/<pid>/maps`)来确定是否存在这种情况。
多个过滤器可以用空格或逗号分隔。
--exclude-perf::
不记录 perf 自身发出的事件。此选项应跟在事件选择器 (-e) 之后,该选择器用于选择跟踪点事件。它会向过滤器添加一个过滤表达式 'common_pid != $PERFPID'。如果存在其他 '--filter' 选项,则新的过滤表达式将通过 '&&' 与其合并。
注: 实测失败
-a::
--all-cpus::
从所有 CPU 进行系统范围的收集(如果未指定目标,则为默认值)。
-p::
--pid=::
记录现有进程 ID 上的事件(逗号分隔列表)。
-t::
--tid=::
记录现有线程 ID 上的事件(逗号分隔列表)。此选项默认禁用线程继承。可通过添加 --inherit 选项启用线程继承。
-u::
--uid=::
记录由 uid 拥有的线程中的事件。可以使用名称或编号。
-r::
--realtime=::
使用此实时 SCHED_FIFO 优先级收集数据。
--no-buffering::
不使用缓冲收集数据。
-c::
--count=::
事件采样周期。
-o::
--output=::
输出文件名。
-i::
--no-inherit::
子任务不继承计数器。
-F::
--freq=::
以该频率进行性能分析。使用“max”将使用当前允许的最大频率,即 kernel.perf_event_max_sample_rate sysctl 中的值, cat出来是100000。将限制到当前允许的最大频率。请参阅 --strict-freq。
--strict-freq::
如果无法使用指定的频率,则失败。
-m::
--mmap-pages=::
mmap 数据页数(必须是 2 的幂)或带有单位字符(B/K/M/G)的大小说明。大小向上取整至最接近的 2 的幂次方。此外,通过添加逗号,可以指定 AUX 区域跟踪的 mmap 页数。
--group::
将所有事件放入单个事件组中。此选项位于 --event 选项之前,仅用于向后兼容。请参阅 --event。
-g::
启用内核空间和用户空间的调用图(堆栈链/回溯)记录。
--call-graph::
设置并启用调用图(堆栈链/回溯)记录,默认使用 -g 选项。默认值为“fp”(用于用户空间)。
内核空间使用的展开方法取决于当前内核配置使用的展开器,即 CONFIG_UNWINDER_FRAME_POINTER (fp) 或 CONFIG_UNWINDER_ORC (orc)。注: 默认都没使能。
此处指定的任何选项都控制用户空间使用的展开方法。
有效选项包括“fp”(帧指针)、“dwarf”(DWARF 的 CFI - 调用帧信息)或“lbr”(硬件最后分支记录工具)。
在某些系统中,如果使用 gcc --fomit-frame-pointer 构建二进制文件,则使用“fp”方法会生成错误的调用图。如果可用,则应使用“dwarf”(perf 工具链接到 libunwind 或 libdw 库)。使用“lbr”方法不需要任何编译器选项。它会从硬件 LBR 寄存器生成调用图。主要限制是它仅适用于新的 Intel 平台,例如 Haswell。它只能获取用户调用链,不能同时进行分支堆栈采样。
使用“dwarf”记录时,perf 还会记录采样后的(用户)堆栈转储。堆栈转储的默认大小为 8192 字节。用户可以通过在逗号后添加大小参数来更改大小,例如“--call-graph dwarf,4096”。
使用“fp”记录时,perf 默认会尝试保存最多 sysctl.kernel.perf_event_max_stack 中指定的堆栈条目数。用户可以通过在逗号后添加大小参数来更改该值,例如“--call-graph fp,32”。
-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。
--sample-identifier::
记录采样标识符,即在 perf_event_open 系统调用的 perf_event_attr 结构体参数的 sample_type 成员中设置的 PERF_SAMPLE_IDENTIFIER 位。
-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::
不更新构建 ID 缓存。当 perf.data 文件(包含构建 ID)中的信息足够时,这可以节省一些开销。您也可以将“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` 或直接使用 `-e e1 -e e2 -G foo`。
如果想要监控某个 cgroup 以及系统范围内的“循环次数”,可以使用以下命令行:`perf stat -e cycles -G cgroup_name -a -e cycles`。
-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:仅当目标是硬件事务中止时
- cond:条件分支
- save_type:在采样期间保存分支类型,以防二进制文件稍后不可用
对于支持 Intel Arch LBR 的平台(第 12 代及更新的客户端或第 4 代及更新的 Xeon 服务器),启用分支堆栈采样时,保存分支类型将无条件启用。
- priv:在采样期间保存权限状态,以防二进制文件稍后不可用
+ 此选项要求至少指定一个分支类型,包括 any、any_call、any_ret、ind_call 和 cond。权限级别可以省略,在这种情况下,将关联事件的权限级别应用于分支过滤器。内核 (k) 和虚拟机管理程序 (hv) 的权限级别均受权限控制。对多个事件进行采样时,所有采样事件都将启用分支堆栈采样。所有事件的采样分支类型相同。必须以逗号分隔的列表形式指定各种过滤器:--branch-filter any_ret,u,k 请注意,并非所有处理器都支持此功能。
-W::
--weight::
启用加权采样。每个样本都会记录一个额外的权重,该权重可以通过 weight 和 local_weight 排序键显示。目前,此功能适用于 TSX 中止事件以及现代 Intel CPU 精确模式下的某些内存事件。
--namespaces::
记录 PERF_RECORD_NAMESPACES 类型的事件。此选项启用“cgroup_id”排序键。
--all-cgroups::
记录 PERF_RECORD_CGROUP 类型的事件。此选项启用“cgroup”排序键。
--transaction::
记录事务相关事件的事务标志。
--per-thread::
使用线程级内存映射。默认情况下,会创建 CPU 级内存映射。此选项会覆盖默认设置,使用线程级内存映射。这样做的一个副作用是会自动禁用继承。如果与 -a 或 -C 选项一起使用,--per-thread 将被忽略并发出警告。
-D::
--delay=::
程序启动后,等待指定毫秒数后再进行测量(-1:启动时禁用事件),或者仅在指定的毫秒范围内启用事件(例如,-D 10-20,30-40 表示等待 10 毫秒,启用 10 毫秒,再等待 10 毫秒,再启用 10 毫秒,然后停止)。注意,延迟启用事件有助于过滤掉程序启动阶段,因为该阶段通常与其他阶段差异很大。
-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':在退出时拍摄最后一个快照;确保输出文件中至少包含一个快照;
<size>:如果 PMU 支持,请指定所需的快照大小。
在快照模式下,仅当接收到信号 SIGUSR2 时以及在指定了上述 'e' 选项的情况下,才会捕获跟踪数据。
--aux-sample[=选项]::
选择 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 或 Arm SPE),切换事件将自动启用,可以使用 --no-switch-events 选项禁用此功能。
--clang-path=PATH::
用于编译 BPF 脚本的 clang 二进制文件的路径。(启用 BPF 支持时启用)
--clang-opt=OPTIONS::
编译 BPF 脚本时传递给 clang 的选项。(启用 BPF 支持时启用)
--vmlinux=PATH::
指定包含调试信息的 vmlinux 路径。(启用 BPF 序言时启用)
--buildid-all::
记录所有 DSO 的构建 ID,无论是否实际命中。
--buildid-mmap::
在 mmap2 事件中记录构建 ID,禁用构建 ID 缓存(隐含 --no-buildid)。
--aio[=n]::
在异步(Posix AIO)跟踪写入模式下使用 <n> 控制块(默认值:1,最大值:4)。仅当 Perf 工具与提供 Posix AIO API 实现的 libc 库链接时才支持异步模式。
--affinity=mode::
根据“mode”值定义的策略设置跟踪读取线程的亲和性掩码:node - 线程亲和性掩码设置为 NUMA 节点;cpu - 线程亲和性掩码设置为已处理 mmap 缓冲区的 CPU。
--mmap-flush=number::
指定从 mmap 数据页中提取并处理输出的最小字节数。可以使用 B/K/M/G 后缀指定该数字。
允许的最大值是 mmap 数据页大小的四分之一。
默认值为 1 字节,这意味着每次输出写入线程在 mmap 缓冲区中找到新数据时,都会提取数据(可能进行压缩 (-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 文件,每个文件都带有时间戳前缀,并根据 'mode' 的值切换到新的文件:
'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`:
用于触发 perf.data 文件切换的事件。自动选择 `--switch-output=signal`,结果类似,因为内部的边带线程也会向主线程发送 SIGUSR2 信号。
使用与 `--event` 相同的语法,只是不会被记录,它的作用仅在于当单独的边带线程处理完 `--switch-output` 事件后立即切换 perf.data 文件。
此边带线程还用于其他用途,例如处理发生的 `PERF_RECORD_BPF_EVENT` 记录、向内核请求额外的 BPF 信息等。
--switch-max-files=N::
使用 --switch-output 轮换 perf.data 文件时,仅保留 N 个文件。
--dry-run::
解析选项后退出。--dry-run 可用于检测命令行选项中的错误。
如果配置文件中的 llvm.dump-obj 设置为 true,则 'perf record --dry-run -e' 可以作为 BPF 脚本编译器。
--synth=TYPE::
收集并合成指定类型的事件(以逗号分隔)。请注意,此选项控制从 /proc 文件系统合成的事件,这些事件代表已存在线程的任务状态。
无论此选项的选择如何,内核(以及其他一些)事件都会被记录。例如,--synth=no 将记录内核和模块的 MMAP 事件。
可用类型包括:
'task' - 为每个任务合成 FORK 和 COMM 事件
'mmap' - 为每个进程合成 MMAP 事件(隐含 'task')
'cgroup' - 为每个 cgroup 合成 CGROUP 事件
'all' - 合成所有事件(默认)
'no' - 不合成任何上述事件
--tail-synthesize::
在记录开始时收集非样本事件(例如,fork、comm、mmap),而不是在记录开始时收集它们。收集到的非样本事件反映了记录完成后系统的当前状态。
--overwrite::
使所有事件使用可覆盖的环形缓冲区。可覆盖的环形缓冲区的工作原理类似于飞行记录仪:当缓冲区满时,内核会覆盖最旧的记录,这些记录将永远不会写入 perf.data 文件。
当同时使用 `--overwrite` 和 `--switch-output` 时,perf 会记录并丢弃事件,直到收到信号为止。该信号表示检测到异常情况,需要对当前事件(即当时环形缓冲区中可容纳的事件)进行快照。
也可以使用配置项为事件设置或取消 `overwrite` 属性。例如:`cycles/overwrite/` 和 `instructions/no-overwrite/`。
隐含 `--tail-synthesize`。
--kcore::
复制 `/proc/kcore` 并将其放置在 perf 数据文件所在的目录中。
--max-size=<size>::
限制样本数据的最大大小,<size> 必须是一个带有个位数的数字 - B/K/M/G
--num-thread-synthesize::
为现有进程合成事件时要运行的线程数。默认情况下,线程数为 1。
ifdef::HAVE_LIBPFM[]
--pfm-events events::
使用 libpfm4 语法(参见 http://perfmon2.sf.net)选择 PMU 事件,包括对事件过滤器的支持。例如:'--pfm-events inst_retired:any_p:u:c=1:i'。可以使用逗号分隔符将多个事件传递给此选项。硬件事件和通用硬件事件不能混用。后者必须与 -e 选项一起使用。-e 选项和此选项可以混合使用。可以使用 {} 符号对事件进行分组。 endif::HAVE_LIBPFM[]
--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':AUX 区域跟踪快照。
'stop':停止性能记录
'ping':ping
'evlist [-v|-g|-F]:显示所有事件
-F:仅显示每个事件使用的采样频率。
-v:显示所有字段。
-g 显示事件组信息。
可以使用 `--delay=-1` 选项禁用事件,从而启动测量。您可以选择向 `ack-fd` 描述符发送控制命令完成信息(`ack\n`),以便与控制进程同步。以下是一个用于在测量期间启用和禁用事件的 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 $?
--threads=<spec>::
使用并行线程将收集到的跟踪数据写入多个数据文件。<spec> 值可以是用户定义的掩码列表。以冒号分隔的掩码定义了线程要监控的 CPU,而该线程的亲和性掩码以斜杠分隔:
<cpus mask 1>/<affinity mask 1>:<cpus mask 2>/<affinity mask 2>:...
CPU 或亲和性掩码不得与其他对应的掩码重叠。无效的 CPU 将被忽略,但仅包含无效 CPU 的掩码是不允许的。
例如,用户规范如下:
0,2-4/2-4:1,5-7/5-7
指定了一个由两个线程组成的并行线程布局,第一个线程使用亲和性掩码 2-4 监控 CPU 0 和 2-4,第二个线程使用亲和性掩码 5-7 监控 CPU 1 和 5-7。
<spec> 值也可以是字符串,表示预定义的并行线程。
layout:
cpu - 为每个受监控的 CPU 创建一个新的数据流线程
core - 创建一个新线程来监控按核心分组的 CPU
package - 创建一个新线程来监控按软件包分组的 CPU
numa - 创建一个新线程来监控按 NUMA 域分组的 CPU
在 CPU 数量庞大的系统中,可以使用预定义的布局,以避免为每个 CPU 创建多个流线程,同时避免数据目录文件中出现 LOST 事件。如果未指定或值为空,则默认使用 CPU 布局。选项值定义或提供的掩码会通过 -C 选项提供的掩码进行过滤。
--debuginfod[=URLs]::
指定用于缓存 perf.data 二进制文件的 debuginfod URL,其语法与 DEBUGINFOD_URLS 变量相同,例如:
http://192.168.122.174:8002
如果未指定 URL,则使用 DEBUGINFOD_URLS 系统环境变量的值。
--off-cpu::
启用 BPF 的非 CPU 分析。BPF 程序将收集任务调度信息(包括用户堆栈跟踪),并将其保存为名为“offcpu-time”的软件事件的样本数据。样本周期为任务休眠时间,单位为纳秒。
请注意,目前 BPF 只能使用帧指针 ("fp") 收集堆栈跟踪。因此,未使用帧指针构建的应用程序可能会看到错误的地址。
include::intel-hybrid.txt[]
另请参阅
-------- linkperf:perf-stat[1], linkperf:perf-list[1], linkperf:perf-intel-pt[1]
三、perf-script.txt
perf-script(1)
=============
名称
---- perf-script - 读取 perf.data(由 perf record 创建)并显示跟踪输出
概要
-------- [verse]
'perf script' [<options>] 'perf script' [<options>] record <script> [<record-options>] <command> 'perf script' [<options>] report <script> [script-args] 'perf script' [<options>] <script> <required-script-args> [<record-options>] <command> 'perf script' [<options>] <top-script> [script-args]
描述
-----------
此命令读取输入文件并显示记录的跟踪信息。
perf script 有多种变体:
'perf script' 用于查看已记录工作负载的详细跟踪信息。
您还可以运行一组预设脚本,这些脚本以各种方式聚合和汇总原始跟踪数据(脚本列表可通过 'perf script -l' 获取)。以下变体允许您记录和运行这些脚本:
'perf script record <script> <command>' 用于记录 'perf script report' 所需的事件。<script> 是 'perf script --list' 输出中显示的名称,即实际脚本名称减去任何语言扩展名。如果未指定 <command>,则使用 -a(系统范围)'perf record' 选项记录事件。
使用 'perf script report <script> [args]' 命令运行并显示脚本 `<script>` 的结果。`<script>` 是 `perf script --list` 命令输出中显示的名称,即实际的脚本名称,不包含任何语言扩展名。此命令会使用之前运行 `perf script record <script>` 命令生成的 `perf.data` 输出,该输出必须存在才能成功执行。`[args]` 指的是脚本所需的(主要是可选的)参数。
使用 `perf script <script> <required-script-args> <command>` 命令记录脚本 `<script>` 所需的事件,并以“live-mode”(即不写入磁盘)运行脚本 `<script>`。`<script>` 是 `perf script --list` 命令输出中显示的名称,即实际的脚本名称,不包含任何语言扩展名。如果未指定 `<command>`,则使用 `-a`(系统级)选项记录事件。如果 <script> 有任何必需参数,则应在 <command> 之前指定。此模式不允许指定可选的脚本参数;如果需要指定可选的脚本参数,可以使用单独的“perf script record”和“perf script report”命令来指定,并将记录步骤的标准输出通过管道传递给报告脚本的标准输入,使用相应命令的“-o -”和“-i -”选项。
使用 `perf script <top-script>` 命令,既可以记录 `<top-script>` 所需的事件,也可以使用 `live-mode` 模式运行 `<top-script>`,即不写入任何磁盘数据。`<top-script>` 是 `perf script --list` 命令输出中显示的名称,即实际脚本名称减去任何语言扩展名;任何以字符串 `top` 结尾的脚本名称都称为 `<top-script>`。
`[<record-options>]` 参数可以传递给 `perf script record` 和 `live-mode` 命令的记录步骤;但是,`<top-script>` 的 `live-mode` 或 `perf script report` 命令不支持此参数。
请参阅“另请参阅”部分,了解有关如何编写和运行自定义跟踪脚本的特定语言信息的链接。
选项
-------
<command>...::
任何可以在 shell 中指定的命令。
-D::
--dump-raw-trace=::
显示详细的跟踪数据转储。
--dump-unsorted-raw-trace=::
与 --dump-raw-trace 相同,但不按时间顺序排序。
-L::
--Latency=::
显示延迟属性(中断/抢占禁用等)。
-l::
--list=::
显示可用跟踪脚本的列表。
-s ['lang']::
--script=::
使用给定的脚本([lang]:script[.ext])处理跟踪数据。如果将字符串“lang”指定为脚本名称,则会显示支持的语言列表。
-g::
--gen-script=::
使用当前 perf.data 文件,为指定语言生成 perf-script.[ext] 起始脚本。
--dlfilter=<file>::
使用指定的共享对象文件过滤示例事件。请参阅 linkperf:perf-dlfilter[1]。
--dlarg=<arg>::
将参数“arg”传递给 dlfilter。可以重复使用 --dlarg 来添加更多参数。
--list-dlfilters::
显示可用 dlfilters 的列表。与 -v 选项一起使用(必须位于 --list-dlfilters 选项之前)可显示详细描述。
-a::
强制系统范围收集。通常情况下,不带 <command> 参数的脚本默认使用 -a 选项,而带 <command> 参数的脚本通常不使用 - 此选项允许后者以系统范围模式运行。
-i::
--input=::
输入文件名。(默认值:perf.data,除非 stdin 是 FIFO)
-d::
--debug-mode::
执行各种检查,例如样本排序和丢失事件。
-F::
--fields::
要打印的字段列表,以逗号分隔。选项包括:comm、tid、pid、time、cpu、event、trace、ip、sym、dso、addr、symoff、rcline、period、iregs、uregs、brstack、brstacksym、flags、bpf-output、brstackinsn、brstackinsnlen、brstackoff、callindent、insn、insnlen、synth、phys_addr、metric、misc、srccode、ipc、data_page_size、code_page_size、ins_lat、machine_pid、vcpu。
字段列表可以添加 type、trace、sw 或 hw 前缀,以指示该字段列表适用于哪种事件类型。例如,`-F sw:comm,tid,time,ip,sym` 和 `-F trace:time,cpu,trace`
`perf script -F <fields>`
等效于:
`perf script -F trace:<fields> -F sw:<fields> -F hw:<fields>`
也就是说,如果未指定类型字符串,则指定的字段将应用于所有事件类型。
除了覆盖字段之外,还可以添加或删除默认值中的字段。例如:
-F -cpu,+insn
删除 cpu 字段并添加 insn 字段。添加/删除字段不能与常规的覆盖操作混合使用。
参数按接收顺序处理。后续使用可能会重置之前的请求。例如:
-F trace: -F comm,tid,time,ip,sym
第一个 -F 参数会抑制跟踪事件(字段列表为空),但第二个调用会将字段设置为 comm,tid,time,ip,sym。在这种情况下,系统会向用户发出警告:
“正在覆盖所有事件的先前字段请求。”
或者,考虑以下顺序:
-F comm,tid,time,ip,sym -F trace:
第一个 -F 设置所有事件的字段,第二个 -F 抑制跟踪事件。系统会向用户显示有关覆盖设置的警告消息,上述操作的结果是仅显示软件和硬件事件及其指定的字段。
可以仅为特定事件类型添加/删除字段:
-Fsw:-cpu,-period
从软件事件中移除 CPU 和周期字段。
对于“通配符”选项,如果用户选择的字段对某个事件类型无效,系统会向用户显示一条消息,提示该选项对该类型无效。例如:
$ perf script -F comm,tid,trace
'trace' not valid for hardware events. Ignoring.
'trace' not valid for software events. Ignoring.
或者,如果指定了无效字段,则会报错。例如:
perf script -v -F sw:comm,tid,trace
'trace' not valid for software events.
此时会显示用法说明,perf-script 退出。
flags 字段会被综合,并且在指令跟踪解码时可能具有值。标志位为“bcrosyiABExghDt”,分别代表 branch(分支)、all(全部)、return(返回)、conditional(条件)、system(系统)、ansynchronous(异步)、interrupt(中断)、transaction abort(事务中止)、trace begin(跟踪开始)、trace end(跟踪结束)、in transaction(事务中)、VM-Entry(虚拟机入口)、VM-Exit(虚拟机出口)、interrupt disabled(中断禁用)和 interrupt disable toggle(中断禁用切换)。
已知的标志位组合会以更友好的方式打印出来,例如:
“call”用于“bc”,“return”用于“br”,“jcc”用于“bo”,“jmp”用于“b”,“int”用于“bci”,“iret”用于“bri”,“syscall”用于“bcs”,“sysret”用于“brs”,“async”用于“by”,“hw int”用于“bcyi”,“tx abrt”用于“bA”,“tr strt”用于“bB”,“tr end”用于“bE”,“vmentry”用于“bcg”,“vmexit”用于“bch”。
然而,在某些情况下,“x”、“D”和“t”标志将分别显示,例如,“jcc (xD)”表示在中断被禁用的事务中执行条件分支。注意,中断被禁用表示“t”,而中断被启用表示“Dt”。
callindent字段会被综合,并且在指令跟踪解码时可能具有值。对于调用和返回操作,它会显示缩进的符号名称,以反映堆栈深度。
进行指令跟踪解码时,`insn` 和 `insnlen` 分别给出当前指令的字节数和长度。
synth 字段用于指令跟踪解码时可能创建的合成事件。
ipc(每周期指令数)字段是合成的,在指令跟踪解码时可能具有值。
machine_pid 和 vcpu 字段源自使用 perf inject 将虚拟机内部记录的 perf.data 文件插入到同时在主机上记录的 perf.data 文件中所生成的数据。
最后,用户不能将所有事件类型的字段都设置为 none。
例如,不允许使用 -F ""。
brstack 输出包含分支相关信息,使用 /v/v/v/v/cycles 语法按以下顺序输出原始地址:
FROM:分支源指令
TO:分支目标指令
M/P/-:M=分支目标预测错误或分支方向预测错误,P=目标预测正确或方向预测正确,-=不支持
X/-:X=在事务区域内分支,-=不在事务区域或不支持
A/-:A=TSX 中止入口,-=不在中止区域或不支持循环
brstacksym 与 brstack 相同,区别在于如果可能,FROM 和 TO 地址会以符号形式打印。
指定 brstackinsn 时,会打印每个样本的完整分支序列汇编序列。这是通往该样本的完整执行路径。仅当使用 perf record -b 或 -j any 记录样本时才支持此功能。
使用 `brstackinsnlen` 函数打印 `brstackinsn` 的长度。例如,除非根据 `brstackinsn` 的长度进行计算,否则您无法知道无条件分支后的下一条顺序指令。
brstackoff 字段会打印出特定 DSO/二进制文件的偏移量。
perf 脚本可以使用 metric 选项计算采样周期的指标,类似于 perf stat 命令。这需要指定一个包含多个事件的组,并使用 perf record 命令的 :S 选项定义指标。perf 会对第一个事件进行采样,并打印该组中所有事件的计算指标。请注意,计算出的指标是整个采样周期(自上次采样以来)的平均值,而不仅仅是采样点的平均值。
对于采样事件,可以使用 -F +misc 选项显示 misc 字段,每个位将显示以下字母:
PERF_RECORD_MISC_KERNEL K PERF_RECORD_MISC_USER U PERF_RECORD_MISC_HYPERVISOR H PERF_RECORD_MISC_GUEST_KERNEL G PERF_RECORD_MISC_GUEST_USER g PERF_RECORD_MISC_MMAP_DATA* M PERF_RECORD_MISC_COMM_EXEC E PERF_RECORD_MISC_SWITCH_OUT S PERF_RECORD_MISC_SWITCH_OUT_PREEMPT Sp $ perf script -F +misc ... sched-messaging 1414 K 28690.636582: 4590 cycles ... sched-messaging 1407 U 28690.636600: 325620 cycles ... sched-messaging 1414 K 28690.636608: 19473 cycles ... misc field ___________/
-k::
--vmlinux=<file>::
vmlinux 路径名
注: 实测这个好像没有什么用。
--kallsyms=<file>::
kallsyms 路径名
注: 直接指定 cat /proc/kallsyms 得到的文件,如 --kallsyms=/data/kallsyms.txt, 指定这个后,strip的内核也可以解析出符号了。
--symfs=<directory>::
查找相对于此目录的符号文件。
注: 实测没用
-G::
--hide-call-graph::
打印符号时,不显示调用链。
--stop-bt::
停止显示这些符号处的调用图。
-C::
--cpu:: 仅报告指定 CPU 列表的样本。多个 CPU 可以用逗号分隔的列表形式提供,列表不能包含空格:0,1。CPU 范围用 - 指定:0-2。默认情况下,报告所有 CPU 的样本。
-c::
--comms=::
仅显示这些通信的事件。CSV 文件支持 file://filename 格式。
--pid=::
仅显示指定进程 ID 的事件(逗号分隔列表)。
--tid=::
仅显示指定线程 ID 的事件(逗号分隔列表)。
-I::
--show-info::
显示 perf.data 文件的扩展信息。此选项会添加大量信息,可能会使显示内容显得杂乱。目前包含的信息包括:主机系统的 CPU 和 NUMA 拓扑结构。此选项只能在 perf 脚本报告模式下使用。
--show-kernel-path::
尝试解析 [kernel.kallsyms] 的路径。
--show-task-events
显示任务相关事件(例如 FORK、COMM、EXIT)。
--show-mmap-events
显示 mmap 相关事件(例如 MMAP、MMAP2)。
--show-namespace-events
显示命名空间事件,即 PERF_RECORD_NAMESPACES 类型的事件。
--show-switch-events
显示上下文切换事件,即 PERF_RECORD_SWITCH 或 PERF_RECORD_SWITCH_CPU_WIDE 类型的事件。
--show-lost-events
显示丢失事件,即类型为 PERF_RECORD_LOST 的事件。
--show-round-events
显示已完成回合事件,即类型为 PERF_RECORD_FINISHED_ROUND 的事件。
--show-bpf-events
显示 BPF 事件,即类型为 PERF_RECORD_KSYMBOL 和 PERF_RECORD_BPF_EVENT 的事件。
--show-cgroup-events
显示 CGROUP 事件,即类型为 PERF_RECORD_CGROUP 的事件。
--show-text-poke-events
显示文本戳戳事件,即类型为 PERF_RECORD_TEXT_POKE 和 PERF_RECORD_KSYMBOL 的事件。
--demangle::
将符号名称反纠错为人类可读的形式。默认启用,使用 --no-demangle 禁用。
--demangle-kernel::
将内核符号名称解码为人类可读的形式(适用于 C++ 内核)。
--header
显示 perf.data 头部。
--header-only
仅显示 perf.data 头部。
--itrace::
用于解码指令跟踪数据的选项。选项包括:
include::itrace.txt[]
要完全禁用解码,请使用 --no-itrace。
--full-source-path::
显示源文件的完整路径以输出 srcline。
--max-stack::
设置解析调用链时的堆栈深度限制,超出指定深度的内容将被忽略。这在信息丢失和处理速度之间进行权衡,尤其适用于调用链堆栈可能非常长的工作负载。请注意,使用 --itrace 选项时,如果合成的调用链大小大于此值,则合成的调用链大小将覆盖此值。
默认值:127
--ns::
显示时间时使用 9 位小数(即显示纳秒)。
-f::
--force::
不进行所有权验证。
--time::
仅分析指定时间窗口内的样本:<start>,<stop>。时间格式为秒.纳秒。如果未指定开始时间(即时间字符串为',x.y'),则分析从文件开头开始。如果未指定结束时间(即时间字符串为'x.y,'),则分析到文件末尾。多个时间范围可以用空格分隔,但需要用引号将参数括起来,例如:--time "1234.567,1234.789 1235,"
也支持使用百分比表示多个时间范围。时间字符串格式为:
'a%/n,b%/m,...' 或 'a%-b%,c%-%d,...'。
例如:
选择第二个 10% 时间段:
perf script --time 10%/2
选择 0% 到 10% 时间段:
perf script --time 0%-10%
选择第一个和第二个 10% 时间段:
perf script --time 10%/1,10%/2
选择 0% 到 10% 和 30% 到 40% 时间段:
perf script --time 0%-10%,30%-40%
--max-blocks::
设置每个样本使用 brstackinsn 打印的最大程序块数。
--reltime::
打印相对于跟踪起始点的时间戳。
--deltatime::
打印相对于上一个事件的时间戳。
--per-event-dump::
为每个事件创建名为“perf.data.EVENT.dump”的文件,而不是输出到标准输出(stdout)。例如,这对于生成火焰图非常有用。
--inline::
如果调用图地址属于内联函数,则会打印内联堆栈。每个条目包含函数名和文件/行号。默认启用,使用 --no-inline 禁用。
--insn-trace[=<raw|disasm>]::
以字节(raw)或反汇编(disasm)形式显示 intel_pt 跟踪的指令流。默认值为“raw”。要使用 xed,请将 'raw' 与 --xed 结合使用,以显示 xed 执行的反汇编代码。
--xed::
对输出运行 xed 反汇编器。需要安装 xed 反汇编器。
-S::
--symbols=symbol[,symbol...]::
仅考虑列出的符号。符号通常是名称,但也可能是十六进制地址。
十六进制地址可以是符号的起始地址,也可以是任何其他地址,用于筛选跟踪记录。
例如,要选择符号 noploop 或地址 0x4007a0:
perf script --symbols=noploop,0x4007a0
支持按符号名称、符号起始地址、任意十六进制地址和地址范围筛选跟踪记录。
比较顺序为:
1. 符号名称比较
2. 符号起始地址比较
3. 任意十六进制地址比较
4. 地址范围比较(参见 --addr-range)。
--addr-range::
与 -S 或 --symbols 一起使用,列出地址范围内的跟踪记录。
例如,要列出地址范围为以下值的跟踪记录:
[0x4007a0, 0x0x4007a9]:
perf script -S 0x4007a0 --addr-range 10
--dsos=::
仅考虑这些 DSO 中的符号。
--call-trace::
显示 intel_pt 跟踪的调用流。CPU 交错显示,但可以使用 -C 进行过滤。
--call-ret-trace::
显示 intel_pt 跟踪的调用和返回流。
--graph-function::
对于 itrace,仅显示指定的函数及其被调用者。多个函数可以用逗号分隔。
--switch-on EVENT_NAME::
仅考虑找到此事件之后发生的事件。
--switch-off EVENT_NAME::
停止考虑找到此事件之后发生的事件。
--show-on-off-events::
同时显示 --switch-on/off 事件。
--stitch-lbr::
显示拼接 LBR 的调用图,拼接 LBR 可能包含更完整的调用图。perf.data 文件必须使用 perf record --call-graph lbr 获取。
默认情况下禁用。在常见的调用栈溢出情况下,它可以生成比默认 lbr 调用栈输出更准确的调用栈。但这种方法并非万无一失。有时,它可能会因为匹配错误而生成错误的调用栈。已知的局限性包括异常处理(例如 setjmp/longjmp)会导致调用/返回不匹配。
补充:
1. perf list 打印出的支持的事件
alignment-faults [Software event] bpf-output [Software event] context-switches OR cs [Software event] cpu-clock [Software event] cpu-migrations OR migrations [Software event] dummy [Software event] emulation-faults [Software event] major-faults [Software event] minor-faults [Software event] page-faults OR faults [Software event] task-clock [Software event] duration_time [Tool event] arm_dsu_0/bus_access/ [Kernel PMU event] arm_dsu_0/bus_cycles/ [Kernel PMU event] arm_dsu_0/cycles/ [Kernel PMU event] arm_dsu_0/l3d_cache/ [Kernel PMU event] arm_dsu_0/l3d_cache_allocate/ [Kernel PMU event] arm_dsu_0/l3d_cache_refill/ [Kernel PMU event] arm_dsu_0/l3d_cache_wb/ [Kernel PMU event] arm_dsu_0/memory_error/ [Kernel PMU event] rNNN [Raw hardware event descriptor] cpu/t1=v1[,t2=v2,t3 ...]/modifier [Raw hardware event descriptor] mem:<addr>[/len][:access] [Hardware breakpoint] alarmtimer:alarmtimer_cancel [Tracepoint event] ...
posted on 2026-02-11 17:46 Hello-World3 阅读(1) 评论(0) 收藏 举报
浙公网安备 33010602011771号