来自https://perf.wiki.kernel.org/index.php/Tutorial#Profiling_sleep_times的第二个 perf 命令有一条错误消息-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/ Stephane Eranian 的“perf: make perf.data more self-descriptive (v5)”,9 月 22 日2011年:
+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,
write_build_id()
因此,如果我没记错的话,听起来 perf injection 无法写入有关构建 ID 的信息(来自 util/header.c 的函数错误)。有两种情况会导致错误:调用不成功perf_session__read_build_ids()
或写入 buildid 表失败dsos__write_buildid_table
(这不是我们的情况,因为没有“写入 buildid 表失败”错误消息;检查write_build_id
)
您可以检查一下,您是否拥有会话所需的所有 buildid。rm -rf ~/.debug
此外,清除您的buildid 缓存(
更新:在评论中,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
供应商的补丁中禁用了选项。自 3.11 以来,redhat 对发布内核中的选项做了同样的事情,这在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 “[内核] 在非调试版本中禁用 LATENCYTOP/SCHEDSTATS。” 戴夫琼斯。第一个禁用选项的内核:3.11.0-0.rc0.git6.4。
为了使用名称如( , , ) 的任何perf
软件跟踪点事件,我们必须在启用选项的情况下重新编译内核,并替换没有此选项的默认 Debian、RedHat 或 Fedora 内核。sched:sched_stat_*
sched:sched_stat_wait
sched:sched_stat_sleep
sched:sched_stat_iowait
CONFIG_SCHEDSTATS
谢谢你,帕维尔·达维多夫。