问题标签 [perf]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4009 浏览

android - 使用“性能记录”设置样本分析的速率

据我了解,Linux 的 Performance Counters 子系统使用该perf record命令对 CPU 和硬件计数器(例如缓存未命中)执行基于样本的分析。

  1. 如何指定采样率perf record?我从手册页中看到的最接近的是有点神秘的选项"-c, --count=Event period to sample",但目前尚不清楚这是指 period-as-duration 还是 inverse-of-rate-period (如果是后者,它期望什么单位)。

  2. 对移动 Android 设备上的应用程序进行采样的“良好”采样率是多少?什么比率太低而无用,什么比率过高?

0 投票
5 回答
38921 浏览

c++ - linux perf:如何解释和查找热点

我今天尝试了 linux 的perf实用程序,但在解释其结果时遇到了麻烦。我已经习惯了 valgrind 的 callgrind,这当然是与基于采样的 perf 方法完全不同的方法。

我做了什么:

现在我看到这样的东西:

好的,这些函数可能很慢,但是我如何找出它们是从哪里调用的呢?由于所有这些热点都位于外部库中,因此我看不到优化代码的方法。

基本上我正在寻找某种带有累积成本注释的调用图,其中我的函数比我调用的库函数具有更高的包容性采样成本。

这可能与性能有关吗?如果是这样 - 如何?

注意:我发现“E”打开了调用图并提供了更多信息。但是调用图通常不够深和/或随机终止而没有提供有关在哪里花费了多少信息的信息。例子:

这可能是我在 64 位上运行的问题吗?另见: http: //lists.fedoraproject.org/pipermail/devel/2010-November/144952.html(我没有使用fedora,但似乎适用于所有64位系统)。

0 投票
0 回答
573 浏览

linux - 使用 perf 分析 linux 2.6.32 FIFO 实时调度程序

我正在开发一个嵌入式应用程序,该应用程序在其执行的某些时期需要实时性能。

我通过调用将应用程序的优先级提升了大约 150 毫秒

sched_setscheduler(0, SCHED_FIFO, &s) 其中 s.sched_priority = sched_get_priority_max(SCHED_FIFO),返回 99。

我在那里通过调用降低应用程序的调度优先级

sched_setscheduler(0, SCHED_OTHER, &s) 其中 s.sched_priority = sched_get_priority_min(SCHED_OTHER)。

此调度程序优先级升级/降级每秒发生一次。

我的申请中出现了间歇性的实时截止日期缺失。我想分析调度程序以确定实时执行周期是否被抢占。

perf sched 记录 -r 99 -R ./test_app

[性能记录:唤醒 9 次以写入数据] [性能记录:捕获并写入 10.272 MB perf.data(~448808 个样本)]

我正在寻找的是与我的应用程序关联的 sched_switch 事件,它参考优先级值 99。我可以确定我的应用程序应该将其调度优先级升级 n 次,如果我发现超过 n 个此类事件,那将暗示执行的实时部分被抢占。

使用以下命令将大量调度程序数据发送到标准输出:

性能计划跟踪 | grep test_app | grep sched_switch

我希望找到提到优先级为 99 的调度程序切换事件:

性能计划跟踪 | grep test_app | grep sched_switch | grep 优先级=99

然而上面的命令什么也没返回。

我正在使用性能版本 0.0.2.PERF。我是否对 perf 的行为或使用做出了错误的假设?如果是这样,任何人都可以建议正确的用法或其他替代分析 linux 实时调度程序的方法。

0 投票
1 回答
764 浏览

linux-kernel - perf 记录:我可以指定多个事件并为每个事件使用不同的 sample-after 值吗

我正在尝试使用 linux 内核包中的 perf 工具来测量几个原始 PMU 事件。在 perf-record 的手册页中有一个“-l”选项(缩放计数器值),这对我的情况很有用,因为我想知道总计数器值,而不仅仅是样本计数。但是,似乎无法识别 -l,这是预期的吗?我怎样才能得到总数?

另一个问题是如何指定多个事件并为每个事件使用不同的 sample-after 值?像性能记录 -c 10000,2000000,2000000 -e r2d4,r03c,r0c0

谢谢你

0 投票
1 回答
1462 浏览

ubuntu - perf annotate 并不总是给出输出

我在 linux 中使用 perf 工具。当我执行 'perf annotate' 时,我通常不会得到输出!. 如果我做“性能报告”,那么我会得到想要的报告。

我只能成功获得我的代码的注释输出!现在它一直给我一个空白输出。

除此之外,我无法真正安装 perf,所以我做了 make 并且可以运行 ./perf?这会是问题的根源吗?

你能告诉我吗?

谢谢

0 投票
2 回答
1375 浏览

c++ - 如何使用 linux perf 获取 libc6 符号(例如 _int_malloc)的呼叫父母?

我正在使用 linux perf 分析 C++ 应用程序,并且使用GProf2dot获得了一个很好的控制流图。但是,C 库 (libc6-2.13.so) 中的一些符号占用了总时间的很大一部分,但没有入边。

例如:

  • _int_malloc花费 8% 的时间,但没有给父母打电话。
  • __strcmp_sse42总共__cxxabiv1::__si_class_type_info::__do_dyncast花费大约 10% 的时间,并且有一个名为 的呼叫者0,其中有呼叫者2d6935c2cc748c6,没有呼叫者。

结果,我无法找出仅使用 perf 的所有这些 mallocing 和动态转换的例程。但是,似乎其他符号(例如malloc但不是_int_malloc)确实有呼叫父母。

为什么 perf show 不为 _int_malloc 调用父母?为什么我找不到 __do_dyn_cast 的最终调用者?而且,有什么方法可以让我修改我的设置,以便我可以获得这些信息吗?我在 x86-64 上,所以我想知道是否需要带有帧指针的(非标准)libc6。

0 投票
2 回答
1217 浏览

linux - 可以从 perf.data 文件生成 perf-stat 结果吗?

当我想使用 Linux 工具套件perf中的 perf-stat 和 perf-report 生成性能报告时,我运行:

和:

但这意味着我第二次运行“myCmd”,这需要几分钟。相反,我希望:

但与 perf 套件中的大多数工具不同,我没有看到 perf-stat 的 -i 选项。是否有另一种工具可以做到这一点,或者有一种方法可以让 perf-report 生成与 perf-stat 类似的输出?

0 投票
8 回答
45857 浏览

linux - 如何获得性能以在我的程序中查找符号

使用时perf report,我的程序看不到任何符号,而是得到如下输出:

这是相当缺乏信息的。

相关程序是用调试符号构建的,该sysprof工具会显示适当的符号,Zoom 也是如此,我认为它perf在后台使用。

请注意,这是在 x86-64 上,因此二进制文件是用 编译的-fomit-frame-pointer,但在其他工具下运行时也是如此。

0 投票
2 回答
141 浏览

linux - 计算条件跳转

我有一个菜鸟问题。我对 Linux 完全陌生。

我想计算程序采用的条件跳转的数量(即程序采用的 if()s、while()s 等的数量)。

有人告诉我我可以用 perf 做到这一点,我读了一遍,但我完全迷失了。

谁能告诉我该怎么做?例如,我有一个 C++ 程序,类似于:

并假设这段代码被编译成一个名为 tmp.txt 的文件。

我尝试发出以下内容:

但是每次我得到的分支数量都不一样。

难道我做错了什么?

编辑:我应该提到我假设我没有可用的源代码。所以我在看二进制文件。

0 投票
1 回答
3107 浏览

linux-kernel - 使用 perf 用户空间工具和 PEBS 进行基于事件的采样

我正在使用 perf 用户空间工具进行基于事件的采样:目标是试图找出某些影响性能的事件(如分支未命中和缓存未命中)在我正在处理的更大系统上发生的位置。

现在,像

完美运行:由 'pp' 修饰符触发的 PEBS 计数模式在收集样本中的 IP 时非常准确。

不幸的是,当我尝试对缓存未命中做同样的事情时,即

我明白了

错误:sys_perf_event_open() 系统调用返回 22(无效参数)。/bin/dmesg 可能会提供其他信息。

致命:没有配置 CONFIG_PERF_EVENTS=y 内核支持?

dmesg | grep "perf\|pmu"没有显示任何有用的 AFAICT。我也很确定内核是用 CONFIG_PERF_EVENTS=y 编译的,因为 [1] 和

工作:[2] 的问题是收集的样本不是很准确,这伤害了我的个人资料。

关于这里可能发生什么的任何提示?