当我想使用来自Linux工具套件perf的 perf-stat和perf-report生成性能报告时,我运行:
$ perf record -o my.perf.data myCmd
$ perf report -i my.perf.data
Run Code Online (Sandbox Code Playgroud)
和:
$ perf stat myCmd
Run Code Online (Sandbox Code Playgroud)
但这意味着我第二次运行'myCmd',这需要几分钟.相反,我希望:
$ perf stat -i my.perf.data
Run Code Online (Sandbox Code Playgroud)
但与perf套件中的大多数工具不同,我没有看到perf-stat的-i选项.是否有其他工具,或者获取perf-report以生成与perf-stat相似的输出的方法?
有没有办法在Linux中定期读取性能计数器?
喜欢的东西perf stat与每一个X周期采样能力就是我要找的.
基本上我希望能够为某些程序每X量的cpu周期读取指令计数器(执行的指令数).
我试图测量具有多个(物理)处理器的(Intel Xeon)机器上的某些硬件事件.具体来说,我想知道为读取'offcore'数据发出了多少请求.
我在Intels文档中找到了OFFCORE_REQUESTS硬件事件,它给出了事件描述符0xB0和数据需求,附加掩码0x01.
然后告诉perf记录事件0xB1(即0xB0 | 0x01)并将其称为:
perf record -e r0B1 ./mytestapp someargs
Run Code Online (Sandbox Code Playgroud)
或者这是不正确的?因为perf report这样输入的事件没有显示输出.
这个领域的perf文档相当稀疏,除了一个教程条目,它没有说明它是哪个事件(尽管这个对我有用),或者它是如何编码的......
任何帮助是极大的赞赏.
我想在我的新Galaxy S4手机上获得一些基本的性能数据.我已经编译了一个自定义内核并设法使用Odin将其闪存到设备上.这些是我启用的与perf工具相关的内核模块:
CONFIG_HAVE_PERF_EVENTS=y
CONFIG_PERF_USE_VMALLOC=y
CONFIG_PERF_EVENTS=y
CONFIG_PERF_COUNTERS=y
Run Code Online (Sandbox Code Playgroud)
我还交叉编译了perf工具.问题是当我运行以下命令时:
perf stat ls
Run Code Online (Sandbox Code Playgroud)
输出似乎不太正确:
Performance counter stats for 'ls':
10887392 cycles # 0.000 Ghz
0 instructions # 0.00 insns per cycle
0.012448321 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
我已经将cpu策略设置为'userspace'并且执行了:
cpufreq-set -f 1600000
Run Code Online (Sandbox Code Playgroud)
为了确保所有核心始终以最大频率工作.
我将不胜感激任何帮助.
以下是没有解决方案的类似案例的链接:http : //lists.linaro.org/pipermail/linaro-kernel/2012-December/002611.html http://forums.arm.com/index.php?/topic/ 15020-PMU功能于Cortex-A8的的OMAP-3530-什么-AM-I-做,错了/
相关的stackoverflow主题: 如何在ARM Cortex-A8处理器中测量程序执行时间?
我想为Android设备编译pref,我根据指南指南做了.一个我设置NDK环境使用Android NDK r9
export NDK_TOOLCHAIN=${NDK}/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
export NDK_SYSROOT=${NDK}/platforms/android-9/arch-arm
Run Code Online (Sandbox Code Playgroud)
我用工具运行make
make ARCH=arm CROSS_COMPILE=${NDK_TOOLCHAIN} CFLAGS="--sysroot=${NDK_SYSROOT}"
Run Code Online (Sandbox Code Playgroud)
我收到错误,你能帮帮我吗?
Android NDK:NDK_TOOLCHAIN被定义为不受支持的值android-ndk-r9/toolchains/arm-linux-androideabi-4.6/prebuilt/linux-x86/bin/arm-linux-androideabi-
Android NDK:请使用以下值之一:arm-linux-androideabi-4.6 arm-linux-androideabi-4.8 arm-linux-androideabi-clang3.2 arm-linux-androideabi-clang3.3 mipsel-linux-android-4.6 mipsel-linux-android-4.8 mipsel-linux -Android-clang3.2 mipsel体系-Linux的Android平台的clang3.3 x86-4.6 x86-4.8 x86的clang3.2 x86的clang3.3
构建/核心/ init.mk:555:*的Android NDK:中止.停止.
在运行Linux的Intel或AMD x86-64系统上,我在哪里/如何找到我的CPU具有的硬件性能计数器的数量?
我想perf在执行某些应用程序时使用Linux 工具收集硬件性能计数器数据.perf wiki的教程说如果我指定(使用-e标志perf stat或者perf record)更多硬件事件而不是我的CPU中的性能计数器,那么这些事件将在执行期间在计数器上多路复用,允许在单个事件期间跟踪它们.perf命令,但可能会降低准确性,因为并非所有计数器始终处于活动状态.(请注意,我关注这里的硬件事件,例如缓存和TLB行为 - 我知道可以跟踪大量/无限数量的内核软件跟踪点而不会出现不准确).
如果我找到我的处理器型号,是否有英特尔/ AMD网站,我可以在哪里找到这些信息?是否有一个简单的命令可以在系统上运行以检查硬件计数器的数量?我检查了cat /proc/cpuinfo和的输出x86info -a,但是找不到这些信息.
我对以下空程序运行了perf分析,
#include <stdio.h>
int main() {
}
Run Code Online (Sandbox Code Playgroud)
编译并运行perf stat ./a.out后,我得到了以下输出说明(以及其他数据,如周期数,任务时钟等):
418,869 instructions # 0.87 insns per cycle
Run Code Online (Sandbox Code Playgroud)
在同一个精灵的每次'perf'分析期间,指令的数量都会发生变化.
我的实际需要是找到我写的特定函数中的指令数.所以我将从新程序中的指令数减去上面的数字.(我可以计算在gcc中使用-S标签创建的program.s中的行数,但在查看perf行为后我感到困惑)
为什么说明的数量不一致,确切地说不一样?
更新 我按照手册页中给出的示例在C中使用perf_event_open()
已编译并安装具有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) 上下文:我正在研究一个基于Java的网络服务器,它意外地泄漏了管道.它每隔几天就达到40,000个文件描述符的限制并死掉.lsof在死亡之前在服务器上使用显示它被管道堵塞.管道连接到自身,而不是另一个过程.
代码库的任何部分都不会创建或使用管道 - 我们可以看到.
一些旧版本的JVM在创建套接字时创建并泄漏了一个管道,但是这在java 1.7.0_75上展示,我相信它不会遭受这个bug.
我的问题是:使用现代Linux工具链(例如perf)可以在调用pipe(2)系统调用时对进程进行快照- 我认为这是创建管道的唯一方法.此外,是否有可能从中检索Java堆栈跟踪?
鉴于此信息,应该可以回答"谁在创建管道,为什么?"这一问题.
在Intel x86上,Linux使用事件l1d.replacements来实现其事件。L1-dcache-load-misses事件。
此事件的定义如下:
计算L1D数据线的替换量,包括机会性替换,以及需要停顿替换的替换或需要替换块的替换。
也许天真地,我希望perf使用像这样的东西mem_load_retired.l1_miss,它支持PEBS,并且定义为:
用至少一个在L1高速缓存中未命中的uop计数退休的加载指令。(支持PEBS)
事件值通常不是非常接近,有时会发生巨大变化。例如:
$ocperf stat -e mem_inst_retired.all_loads,l1d.replacement,mem_load_retired.l1_hit,mem_load_retired.l1_miss,mem_load_retired_fb_hit head -c100M /dev/urandom > /dev/null
Performance counter stats for 'head -c100M /dev/urandom':
445,662,315 mem_inst_retired_all_loads
92,968 l1d_replacement
443,864,439 mem_load_retired_l1_hit
1,694,671 mem_load_retired_l1_miss
28,080 mem_load_retired_fb_hit
Run Code Online (Sandbox Code Playgroud)
与相比,“ L1未命中”的数量多于17 倍。相反,您也可以找到比计数器高得多的示例。mem_load_retired.l1_missl1d.replacementl1d.replacementmem_load_retired
到底在l1d.replacement测量什么,为什么要在内核中选择它,并且它比L1 d缓存未命中更好的代理mem_load_retired.l1_miss?