Articles of perf

perf:软件事件之间的奇怪关系

好吧,所以这真的让我感到困扰。 我使用perf来loggingcpu-clock事件(一个软件事件): $ > perf record -e cpu-clock srun -n 1 ./stream …和perf报表生成的表是空的。 我正在使用perf来loggingperf列表中列出的所有可用软件事件: $ > perf record -e alignment-faults,context-switches,cpu-clock,cpu-migrations,\ dummy,emulation-faults,major-faults,minor-faults,page-faults,task-clock\ srun -n 1 ./stream …表格给了我一个可用的样品清单: 0 alignment-faults 125 context-switches 255 cpu-clock 21 cpu-migrations 0 dummy 0 emulation-faults 0 major-faults 128 minor-faults 132 page-faults 254 task-clock 我可以看看在CPU时钟收集的样品,它给我的信息。 为什么?! 如果我只测量cpu时钟,为什么不行? 为什么四个事件中没有收集样本? 这是这个问题的后续: 错误:perf.data文件没有样本

logging内存访问占用空间

我发现了Dr.Clements的mtrace 。 虽然它是有用的,但在我需要的情况下,它不能正常工作。 我打算用这个logging来理解不同场景下的内存访问模式。 有人可以分享相关经验吗? 任何build议将不胜感激。 0313更新 :我试图用qemu-mtrace来启动Linux-mtrace(3.8.0)的Ubuntu 16.04,但它只显示几个错误信息并终止。 希望有一些工具能够logging每一个访问。 $ ./qemu-system-x86_64 -mtrace-enable -mtrace-file mtrace.out -hda ubuntu.img -m 1024 Error: mtrace_entry_ascope (exit, syscall:xx) with no stack tag! mtrace_entry_register: mtrace_host_addr failed (10) mtrace_inst_exec: bad call 140734947607728 Aborted (core dumped)

perf-report显示CPU寄存器的值

我遵循这个文件,并使用perf record与–intr-regs=ax,bx,r15 ,试图logging更多的CPU注册信息与PEBSlogging。 但是,如何从perf.data中查看这些信息? 原始命令是perf report ,它只显示开销,命令,共享对象和符号等几个字段。 有没有办法显示CPU regs的价值?

使用perf探针监视特定function期间的性能状态

我试图在使用linux perf工具的特定function期间监视性能状态。 我按照https://perf.wiki.kernel.org/index.php/Jolsa_Features_Togle_Event#Example_-_using_u.28ret.29probs 我试图得到一个简单的C程序的指令计数。 (如下所示) 1)我简单的C代码 #include<stdio.h> int sum=0; int i=0; void func(void) { for(i=0;i<100;i++) { sum=sum+i; } } int main(void) { func(); return 0; } 2)编译和添加探针 root@sunimal-laptop:/home/sunimal/temp# gcc -o ex source.c root@sunimal-laptop:/home/sunimal/temp# perf probe -x ./ex entry=func Added new event: probe_ex:entry (on 0x4ed) You can now use it in all perf tools, such as: […]

如何衡量Linux上单个分支的预测失误?

我知道在执行一个perf stat程序时,我可以得到分支错误预测的总百分比。 但是,我怎么能得到一个特定的分支统计( if或C语言switch语句)?

有没有办法将kptr_restrict设置为0?

我目前在运行linux perf时遇到了麻烦,主要是因为/proc/sys/kernel/kptr_restrict当前设置为1。 但是,如果我尝试/proc/sys/kernel/kptr_restrict回显0,如下所示… echo 0 > /proc/sys/kernel/kptr_restrict 我得到一个权限被拒绝的错误。 我不认为我可以改变它的权限。 有没有办法直接设置这个? 我是超级用户。 没有这个设置,我不认为perf会起作用。

Android Systrace跟踪文件格式

Android的systrace工具,通过ADB调用atrace工具。 但是,我不太了解跟踪文件的格式。 显然它与linux ftrace工具非常相似,但有一些不同之处。 主要的区别是不使用System.Map文件,但它将所有信息包含到跟踪文件中。 此外,还有一些新的B | E条目是特定于Android的。 在Android源代码中有一些关于这种格式的信息: http : //androidxref.com/4.1.1/xref/external/chromium-trace/src/tracing/linux_perf_importer.js 但是,在该文档中,我们可以看到格式属于Linux Perf Tool。 我不这么认为,linux perf作为一个输出提供了一个非常不同的格式…(除非一些特殊的configuration是活跃的…) 我的问题是:有谁知道在哪里可以find一个关于android跟踪文件的官方文档使用从adb的atrace工具生成? 这种格式对你来说很熟悉吗? # 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 […]

perf使调用图的demangling

如何为perf callgraph启用C ++ demangling? 当我进入注释模式时,似乎可以将符号去掉,但不会在主调用图中显示。 示例代码(使用Google Benchmark ): #include <benchmark/benchmark.h> #include <vector> static __attribute__ ((noinline)) int my_really_big_function() { for(size_t i = 0; i < 1000; ++i) { benchmark::DoNotOptimize(i % 5); } return 0; } static __attribute__ ((noinline)) void caller1() { for(size_t i = 0; i < 1000; ++i) { benchmark::DoNotOptimize(my_really_big_function()); benchmark::DoNotOptimize(i % 5); } } […]

为什么不执行报告caching未命中?

根据perf教程 , perf stat应该使用硬件计数器报告caching未命中。 但是,在我的系统上(最新的Arch Linux),它并没有: [joel@panda goog]$ perf stat ./hash Performance counter stats for './hash': 869.447863 task-clock # 0.997 CPUs utilized 92 context-switches # 0.106 K/sec 4 cpu-migrations # 0.005 K/sec 1,041 page-faults # 0.001 M/sec 2,628,646,296 cycles # 3.023 GHz 819,269,992 stalled-cycles-frontend # 31.17% frontend cycles idle 132,355,435 stalled-cycles-backend # 5.04% backend cycles […]

从ac程序中测量页面错误

我正在比较几个系统调用,我从哪里读/写内存。 是否有定义的API来测量C中的页面错误(页面input/输出)? 我发现这个库libperfstat.a,但它是为AIX ,我找不到任何东西的Linux。 编辑:我知道在Linux的time和perf-stat命令,只是探索是否有什么可用于我在C程序内使用。