您的第二个perf命令从https://perf.wiki.kernel.org/index.php/Tutorial#Profiling_sleep_times出现了错误信息- perf inject -s
$ sudo perf inject -v -s -i ~/perf.data.raw -o ~/perf.data
build id event received for [kernel.kallsyms]: d62870685909222126e7070d2bafdf029f7ed3b6
failed to write feature 2
无法写入功能2,看起来不太用户友好...
...但它被添加到perf中以使错误更加用户友好:http://lwn.net/Articles/460520/ "perf: make perf.data more self-descriptive (v5)",作者:Stephane Eranian,2011年9月22日:
+static int do_write_feat(int fd, struct perf_header *h, int type, ....
+ pr_debug("failed to write feature %d\n", type);
所有功能在这里列出 http://lxr.free-electrons.com/source/tools/perf/util/header.h#L13
15 HEADER_TRACING_DATA = 1,
16 HEADER_BUILD_ID,
据我所知,看起来 perf inject 无法写入有关构建 ID 的信息(来自 util/header.c 中的 write_build_id() 函数错误),如果我没有错的话。 这会导致出现两种错误情况:调用 perf_session__read_build_ids() 不成功或写入 buildid 表格 dsos__write_buildid_table 失败(因为没有“无法编写 buildid 表”错误消息,因此这不是我们的情况;请检查 write_build_id)
您可以检查一下,是否拥有会话所需的所有 buildid。 另外,清除 buildid 缓存(rm -rf ~/.debug),检查您的内核中是否启用了调试信息或 kallsyms。
更新:在评论中,Pavel 表示他的 pref 记录中没有写入任何 sched:sched_stat_sleep 事件到 perf.data 中:
sudo perf record -e sched:sched_stat_sleep -e sched:sched_switch -e sched:sched_process_exit -g -o ~/perf.data.raw ./a.out
正如他在回答中所解释的那样,他的默认 Debian 内核已使用供应商的补丁禁用了 CONFIG_SCHEDSTATS 选项。Redhat 自 3.11 版本以来也在发行内核中禁用了该选项,并在 Redhat Bug 1013225 中进行了解释(Josh Boyer 2013-10-28,注释 4):
我们很久以前就开始只在调试构建上启用它了。 看起来那个选项已经在最终的 3.11.0 构建中被完全关闭,并且自那时以来一直保持关闭状态。 内部测试显示该选项对于上下文切换具有不可忽略的性能影响。
我们可以再次在调试内核中启用它,但我不确定是否值得这样做。
Josh Poimboeuf 2013-11-04 在评论 8 中表示性能影响是可检测的:
在我的测试中,我进行了许多在各种 CPU 负载下的上下文切换。当启用 CONFIG_SCHEDSTATS 时,我看到平均上下文切换速度下降了约 5-10%...性能下降似乎只发生在后 CFS 内核(> = 2.6.23)。先前的 O(1)调度程序似乎没有此问题。
Fedora 在 2013 年 7 月 12 日禁用了非调试内核中的 CONFIG_SCHEDSTAT,由 Dave Jones 在 "[kernel] Disable LATENCYTOP/SCHEDSTATS in non-debug builds." 中宣布。第一个禁用该选项的内核为 3.11.0-0.rc0.git6.4。
为了使用具有类似 sched:sched_stat_*(sched:sched_stat_wait、sched:sched_stat_sleep、sched:sched_stat_iowait)名称的任何 perf 软件跟踪点事件,我们必须重新编译启用了 CONFIG_SCHEDSTATS 选项的内核,并替换默认的 Debian、RedHat 或 Fedora 内核,这些内核没有此选项。
谢谢 Pavel Davydov。