我正在使用linux perf分析C++应用程序,我正在使用GProf2dot获得一个很好的控制流程图.但是,来自C库(libc6-2.13.so)的一些符号占用了总时间的很大一部分,但没有内边缘.
例如:
_int_malloc 需要8%的时间,但没有电话父母.__strcmp_sse42和__cxxabiv1::__si_class_type_info::__do_dyncast一同来的时间约10%,并有来电者的名字是0,它有来电2d6935c,2cc748c和6,其中有没有来电.结果,我无法找到哪些例程负责所有这些mallocing和动态转换只使用perf.但是,似乎其他符号(例如malloc但不是_int_malloc)确实有呼叫父母.
为什么没有为_int_malloc显示呼叫父母?为什么我找不到__do_dyn_cast的最终来电者?并且,有什么方法可以修改我的设置,以便我可以获取此信息吗?我在x86-64上,所以我想知道我是否需要带有帧指针的(非标准)libc6.
当我输入perf list命令时,我发现有两种事件:Hardware event和Hardware cache Event.两者有什么区别 ?
cache-misses和之间有什么区别LLC-misses?缓存未命中是否包括LLC未命中?
perf在测试程序时,工具是否会降低总体性能?
Android systrace工具,通过ADB 调用atrace工具.但是,我不太了解跟踪文件的格式.显然它与linux ftrace工具非常相似,但有些不同.主要区别在于它不使用System.Map文件,但它将所有信息包含在跟踪文件中.此外,还有一些特定于Android的新B | E条目.
Android源代码中有关于此格式的一些信息,请访问:http://androidxref.com/4.1.1/xref/external/chromium-trace/src/tracing/linux_perf_importer.js
但是,在该文档中,我们可以读到该格式属于Linux Perf Tool.我不这么认为,linux perf作为输出提供了一种非常不同的格式......(除非某些特殊配置是活动的......)
我的问题是:有谁知道我在哪里可以找到关于使用adb的atrace工具生成的android跟踪文件的官方文档?
这种格式对你来说很熟悉吗?
# tracer: nop
#
# entries-in-buffer/entries-written: 66427/66427 #P:2
#
# _-----=> irqs-off
# / _----=> need-resched
# | / _---=> hardirq/softirq
# || / _--=> preempt-depth
# ||| / delay
# TASK-PID CPU# |||| TIMESTAMP FUNCTION
# | | | |||| | |
atrace-1724 [000] d..3 14186.680000: sched_switch: prev_comm=atrace prev_pid=1724 prev_prio=120 prev_state=S ==> next_comm=swapper/0 next_pid=0 next_prio=120 …Run Code Online (Sandbox Code Playgroud) 我正在使用Perf来执行一些分析实验.
但是,我想知道特定代码区域的结果,并且在这种情况下,查看每行源代码(在本例中为C/C++)的结果(百分比)将简化任务.
perf annotate有一个视图,它显示ASM +源代码,也可以选择关闭显示源代码.我想知道如何完成此选项的另一端,即仅显示源代码+其每行事件的百分比并隐藏ASM输出.这有可能perf吗?
建议使用其他工具吗?我也在使用Vtune但是我想做的分析没有用.Valgrind是不可能的,太慢了.
我正在使用运行Ubuntu 13.04的x64.
是否可以通过perf收集硬件计数器统计信息,仅用于程序执行的一部分?如果是这样,怎么样?
likwid提供了能够定义命名区域的功能,但如果只在安装了perf的系统上实现这一点,那将会很棒.
以前的一些问题已经返回相关答案,但仍有一些缺点:
我在几篇关于分析应用程序的帖子中看过这个术语,但我不明白它实际意味着什么以及它如何影响分析结果.
速率也增加到199赫兹,因为捕获内核堆栈比用户级堆栈便宜得多.奇数编号99和199用于避免与其他活动同步采样并产生误导性结果.
-F 99:99赫兹的样品(每秒样品).我有时会比这更快地采样(高达999赫兹),但这也是成本开销.99赫兹应该可以忽略不计.此外,值"99"而不是"100"是为了避免锁步采样,这会产生偏差的结果.
从我所看到的所有剖析器应该避免锁步采样,因为结果可能"倾斜"和"误导",但我不明白为什么.我想这个问题适用于所有的分析器,但我对linux上的perf感兴趣.
当我使用 perf 收集系统统计信息时,像这样
sudo perf record -a -g -F 997 -p pid sleep 30
Run Code Online (Sandbox Code Playgroud)
然后我得到了
Error:
You may not have permission to collect stats.
Consider tweaking /proc/sys/kernel/perf_event_paranoid:
-1 - Not paranoid at all
0 - Disallow raw tracepoint access for unpriv
1 - Disallow cpu events for unpriv
2 - Disallow kernel profiling for unpriv
Run Code Online (Sandbox Code Playgroud)
我无权修改/proc/sys/kernel/perf_event_paranoid,即使在root. 我尝试添加"kernal.perf_event_paranoid=-1"到/etc/sysctl.conf,并使用
sysctl -p
Run Code Online (Sandbox Code Playgroud)
重新加载参数。我再次无权加载参数 kernal.perf_event_paranoid。
如何使用 perf 收集统计信息?
perf record如果核心利用率大致恒定,则使用cpu周期进行采样对于查找优化候选者很有用。但是对于具有多个阶段的并行度不同的代码,计算cpu周期将着重强调并行阶段,同时又不强调会影响墙壁时间的顺序或有限并行度阶段。简而言之,单纯使用perf可能会凸显阿姆达尔定律的错误之处
因此,问题是如何找到perf record/ perf report寻找减少墙壁时间的优化候选者,这可能是从并行并行代码中最热的循环到中等并行瓶颈到长单线程阶段的任何东西。
已知的解决方法有一些不足之处:
元:这是一个法律约束特定随访到一个更一般的问题
有没有办法在Linux中定期读取性能计数器?
喜欢的东西perf stat与每一个X周期采样能力就是我要找的.
基本上我希望能够为某些程序每X量的cpu周期读取指令计数器(执行的指令数).
已编译并安装具有Linux-Next内核2015-06-04的Ubuntu 15.04。
然后启动该内核,然后运行perf top,但显示未找到符号。
如何在perf中手动加载内核符号?
root@ubuntu-server:/boot# uname -r
4.1.0-rc6.060402222+
root@ubuntu-server:/proc# ls kall*
kallsyms
root@ubuntu-server:/boot# ls | grep 4.1.0-rc6.060402222
config-4.1.0-rc6.060402222+
initrd.img-4.1.0-rc6.060402222+
System.map-4.1.0-rc6.060402222+
vmlinuz-4.1.0-rc6.060402222+
root@ubuntu-server:/# perf top
No kallsyms or vmlinux with build-id 438e4365574d514672888bcfdd6292dbcf71f38f was found
[kernel.kallsyms] with build id 438e4365574d514672888bcfdd6292dbcf71f38f not found, continuing without symbols
Warning:
A vmlinux file was not found.
Kernel samples will not be resolved.
^C
root@ubuntu-server:/proc# perf top -k /boot/vmlinuz-4.1.0-rc6.060402222+
Warning:
The /boot/vmlinuz-4.1.0-rc6.060402222+ file can't be used: Success
Kernel samples will not be resolved.
^C
Run Code Online (Sandbox Code Playgroud)
在Linux-next文件夹中,.config文件已启用内核调试:
CONFIG_DEBUG_KERNEL=y
Run Code Online (Sandbox Code Playgroud) linux ×10
perf ×10
performance ×3
profiling ×3
linux-kernel ×2
android ×1
c++ ×1
ftrace ×1
g++ ×1
likwid ×1
permissions ×1
symbols ×1
systrace ×1