微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

以编程方式使用性能列表中的性能事件

如何解决以编程方式使用性能列表中的性能事件

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

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

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

解决方法

没有不使用第三方(或first party)列表而无法从内核获取完整原始事件列表的方法(使用任何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-eventsthere is readme file,它们表明perf使用{{3 }}(perf有8 MB的x86 json事件列表,位于jevents

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

您可以从tools/perf/pmu-events/arch/x86下载perf源,并使用一些源代码导航工具来检查cmd_list函数内置列表.c文件(带有一些未记录的选项)。此外,您还可以从这些来源构建perf工具,并且在perf构建初期将编译jevents(HOSTCC pmu-events/jevents.oLINK pmu-events/jevents)。

通过从pmu_add_cpu_aliases,从https://mirrors.edge.kernel.org/pub/linux/kernel/tools/perf/,从perf_pmu__find,从perf_pmu__scans从print_pmu_scan调用的perf_pmu__find_map(util / pmu.c)从表pmu_events_map(pmu-events / pmu-events.c)中检测当前cpu模型来自cmd_list(perf list内置命令的处理程序)。

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

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。