有没有办法在Linux中定期读取性能计数器?
喜欢的东西perf stat与每一个X周期采样能力就是我要找的.
基本上我希望能够为某些程序每X量的cpu周期读取指令计数器(执行的指令数).
我想为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) 是否有 Windows 等效的 linux 命令“perf stat”?例如查看前端停顿、缓存未命中和其他性能计数器数据?
上下文:我正在研究一个基于Java的网络服务器,它意外地泄漏了管道.它每隔几天就达到40,000个文件描述符的限制并死掉.lsof在死亡之前在服务器上使用显示它被管道堵塞.管道连接到自身,而不是另一个过程.
代码库的任何部分都不会创建或使用管道 - 我们可以看到.
一些旧版本的JVM在创建套接字时创建并泄漏了一个管道,但是这在java 1.7.0_75上展示,我相信它不会遭受这个bug.
我的问题是:使用现代Linux工具链(例如perf)可以在调用pipe(2)系统调用时对进程进行快照- 我认为这是创建管道的唯一方法.此外,是否有可能从中检索Java堆栈跟踪?
鉴于此信息,应该可以回答"谁在创建管道,为什么?"这一问题.
我想了解哪些事件可以在我的 CPU(Sandy Bridge)上有精确的修改器。
英特尔软件开发人员手册(表 18-32.英特尔微架构代号 Sandy Bridge 的 PEBS 性能事件)仅包含以下事件:INST_RETIRED、UOPS_RETIRED、
BR_INST_RETIRED、BR_MISP_RETIRED、MEM_UOPS_RETIRED、
MEM_LOAD_UOPS_RETIRED、MEM_LOAD_UOPS_LLC_HIT_RETIRED。SandyBridge_core_V15.json列出了 PEBS > 0 的相同事件。
然而,有一些使用 的例子perf,这增加:p了cycles事件的发生。perf record -e cycles:p而且我可以在我的机器上成功运行。
还perf record -e cycles:p -vv -- sleep 1打印precise_ip 1。那么这是否意味着该CPU_CLK_UNHALTED事件实际上使用了 PEBS?
是否可以获得支持的完整事件列表:p?
假设我有一个线束二进制文件,它可以根据命令行选项产生不同的基准。我对采样这些基准非常感兴趣。
我有3个选择:
更改线束二进制文件以生成运行基准测试并进行采样的“性能记录”子进程
只需执行“perf record $harness-binary”,希望它也能对子进程进行采样。
“perf record -a $harness-binary”,它将执行“来自所有 CPU 的系统范围的收集。”。这需要 root 访问权限,因此在我的情况下不可行。
如果 perf-record 真的对子进程进行采样,则方法 #2 是干净的。有人可以帮助确认是否是这种情况吗?指向文档或性能代码的指针将不胜感激。
如果方法#2 可行并且基准测试比线束更占用 CPU,我认为基准采样的质量应该相当不错,对吧?
谢谢
我正在尝试让 perf 工具在我们的 Linux 设置之一中运行,该设置没有/不能有 Linux 源代码。因此,我在另一台机器上下载了linux代码并编译了perf(cd tools/perf; make)。我将 perf 二进制文件复制到我的目标机器上。然而,当开始记录时,它说“无法合成 bpf 事件”。
root> perf record -a -g --call-graph dwarf -p 836
Warning:
PID/TID switch overriding SYSTEM
Couldn't synthesize bpf events.
[ perf record: Woken up 1 times to write data ]
Failed to read max cpus, using default of 4096
[ perf record: Captured and wrote 0.057 MB perf.data ]
Run Code Online (Sandbox Code Playgroud)
在我们的目标机器上运行的Linux版本:5.4.66-rt38-intel-pk-preempt-rt
我用来编译性能的代码:https://git.kernel.org/pub/scm/linux/kernel/git/rt/linux-stable-rt.git/log/ ?h=v5.4-rt
因为我得到这个“无法合成 bpf 事件”,所以我认为我没有在性能报告中获取用户空间堆栈。我应该怎么做才能消除此错误以使用 perf 获取正在运行的进程的用户空间堆栈?请指教!
perf ×10
linux ×7
intel ×2
linux-kernel ×2
android ×1
java ×1
papi ×1
performance ×1
pipe ×1
stack-trace ×1
symbols ×1
windows ×1
x86-64 ×1