2

当我perf list在我的 Linux 系统上运行时,我会得到一长串可用的 perf 事件。

是否可以从另一个进程中以编程方式列出和使用这些事件,使用perf_event_open(2)?也就是说,如何从另一个进程中获取此列表并确定要填充的相应值perf_event_attr

我不是在寻找使用另一个第三方事件列表的解决方案,例如。libpfm4 或 jevents。我知道一些事件可以从其中的文件/sys/devices/cpu/events/(以及其他事件类型的类似文件)中重建,但这些只是所perf list显示事件的一小部分。

4

1 回答 1

1

在不使用第三方(或第一方)列表的情况下,没有解决方案可以从内核(使用任何系统调用,如 perf_event_open(2))获取完整的原始事件列表。Perf 工具使用从/sys/bus/event_source/devices/cpu/events类似 sysfs 文件夹中扫描的一些基本事件,但它有自己的 cpu 模型特定事件列表:https ://elixir.bootlin.com/linux/v5.5.19/source/tools/perf/pmu-events ,并且有自述文件指出 perf 使用jevents(perf 有 8 MB 的 x86 json 事件列表,位于tools/perf/pmu-events/arch/x86

此目录的内容允许用户通过其符号名称而不是原始事件代码指定其 CPU 中的 PMU 事件(参见下面的示例)。此目录中的主程序是“jevents”,它在 perf 二进制文件本身构建之前构建和执行。“jevents”程序尝试在目录树 tools/perf/pmu-events/arch/foo 中定位和处理 JSON 文件。

您可以从https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/下载 perf 源并使用一些源代码导航工具来检查 cmd_list 函数 builtin-list.c 文件(带有一些未记录的选项)。您还可以从这些来源构建 perf 工具,并且在 perf 构建的早期会编译 jevents ( HOSTCC pmu-events/jevents.o, )。LINK pmu-events/jevents

当前的 cpu 模型是从表 pmu_events_map (pmu-events/pmu-events.c) 中检测到的 perf_pmu__find_map (util/pmu.c) 从 pmu_add_cpu_aliases 调用,从 pmu_lookup 调用从 perf_pmu__find,从 perf_pmu__scan 从 print_pmu_events 从 cmd_list(perf list内置命令的处理程序)。

5.5 版本的 perf(从 linux 内核 5.5 开始,因为 perf 是 linux 内核的一部分),没有事件列表的原始转储和描述。有一个未记录的选项perf list --raw-dump将打印每个可用监控单元的所有事件列表,例如pmuperf list --raw-dump pmu |tr ' ' '\n'。此原始转储的输出在 perf 版本之间不稳定。

perf_events 子系统的内核部分在arch/x86/eventskernel/events文件夹中没有完整的事件列表,只有标准 perf 事件(在 sysfs 中列出)如周期或 cpu/branch-misses/ 到特定 cpu 模型的原始事件的映射。

于 2020-09-01T22:33:38.237 回答