函数在应用程序中花费的总时间可以大致分为两个部分:
通常,剖析器提供函数花费的总时间的估计.是否有可能估算出上述两个组件(Tcomp和Tmem)所花费的时间?
我正在尝试perf probe在我的库中添加一个C++方法,但我不断得到以下内容:
$ perf probe --exec=/path/to/file --add='my::Own::Method'
Semantic error :There is non-digit char in line number.
Run Code Online (Sandbox Code Playgroud)
我列出了可用的功能,如下所示:
$ perf probe --funcs --exec=/path/to/file
Run Code Online (Sandbox Code Playgroud)
并尝试了一些也包含在内的C函数.可以为这些添加探针就好了.所以我尝试了受损的名称(例如_ZN2my8Own16Method)并perf probe说它不存在.
有没有解决这个问题的方法?
Brendan D. Gregg(DTrace书的作者)有一个有趣的分析变体:"Off-CPU"分析(和Off-CPU Flame Graph ; 幻灯片2013,p112-137),以查看线程或应用程序被阻止的位置(是不是由CPU执行,而是等待I/O,页面故障处理程序或由于CPU资源而导致的计划外停机:
这一次揭示了哪些代码路径在CPU外被阻塞和等待,以及准确的持续时间.这与传统的分析不同,后者通常以给定的间隔对线程的活动进行采样,并且(通常)只检查线程是否在CPU上执行工作.
他还可以将Off-CPU配置文件数据和On-CPU配置文件结合在一起:http://www.brendangregg.com/FlameGraphs/hotcoldflamegraphs.html
Gregg给出的示例是使用的dtrace,这在Linux OS中通常不可用.但是有一些类似的工具(ktap,systemtap,perf)和perf我认为最广泛的安装基础.通常perf生成On-CPU配置文件(这些功能在CPU上执行得更频繁).
perf成Linux中的分析工具?PS:来自LISA13,p124的幻灯片中有关于CPU外部火焰图的systemtap变体的链接:" Yichun Zhang创建了这些,并且已经在Linux上使用SystemTap来收集专业数据.请参阅:• http:// agentzh .org/misc/slides/off-cpu-flame-graphs.pdf " "(2013年8月23日的CloudFlare啤酒会议)
Brendan Gregg使用Linux的perf实用程序为c/c ++,jvm代码,nodejs代码等生成火焰图.
Linux内核本身是否了解堆栈跟踪?在哪里可以阅读更多关于工具如何能够反省到流程的堆栈跟踪,即使流程是用完全不同的语言编写的?
我正在开发一个项目,我们必须实现一个在理论上被证明是缓存友好的算法.简单来说,如果N是输入,并且B是每次我们有高速缓存未命中时在高速缓存和RAM之间传输的元素数,则该算法将需要O(N/B)访问RAM.
我想表明这确实是实践中的行为.为了更好地理解如何测量各种缓存相关的硬件计数器,我决定使用不同的工具.一个是Perf,另一个是PAPI库.不幸的是,我使用这些工具越多,我就越不了解他们的确切做法.
我正在使用Intel(R)Core(TM)i5-3470 CPU @ 3.20GHz,8 GB RAM,L1缓存256 KB,L2缓存1 MB,L3缓存6 MB.缓存行大小为64字节.我猜这必须是块的大小B.
我们来看下面的例子:
#include <iostream>
using namespace std;
struct node{
int l, r;
};
int main(int argc, char* argv[]){
int n = 1000000;
node* A = new node[n];
int i;
for(i=0;i<n;i++){
A[i].l = 1;
A[i].r = 4;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
每个节点需要8个字节,这意味着一个缓存行可以容纳8个节点,所以我应该期待大约1000000/8 = 125000L3缓存未命中.
没有优化(否-O3),这是perf的输出:
perf stat -B -e cache-references,cache-misses ./cachetests
Performance counter stats for …Run Code Online (Sandbox Code Playgroud) 我正在玩这个答案的代码,稍微修改一下:
BITS 64
GLOBAL _start
SECTION .text
_start:
mov ecx, 1000000
.loop:
;T is a symbol defined with the CLI (-DT=...)
TIMES T imul eax, eax
lfence
TIMES T imul edx, edx
dec ecx
jnz .loop
mov eax, 60 ;sys_exit
xor edi, edi
syscall
Run Code Online (Sandbox Code Playgroud)
没有lfence我,我得到的结果与答案中的静态分析一致.
当我介绍一个单一 lfence我期望的CPU执行imul edx, edx的序列的第k个平行于迭代imul eax, eax的下一个(的序列K + 1个)迭代.
像这样的东西(调用一个的imul eax, eax序列和d的imul edx, edx一个): …
我在ubuntu 11.10上使用perf 3.0.4.它的记录命令运行良好,并在终端显示256个样本收集.但是当我使用perf报告时,它会给我以下错误:
perf.data file has no samples
Run Code Online (Sandbox Code Playgroud)
我搜索了很多解决方案,但还没有成功.
在我看到CppCon 2015的这个演讲之后,我想对一些程序进行概述.我下载了那个人在谈话中使用的相同Google基准库,用适当的开关编译我的程序,将其链接到它,然后使用perf记录一次跑步.报告选项给了我这个:
正如您所看到的,函数名称不是很易读.我认为这与C++名称修改有关.有趣的是,所有的功能名称都在视频中正确显示给那个发表演讲的人,但不适合我.我不认为这是完全缺少符号信息的情况,因为在这种情况下我只会看到内存地址.由于某种原因,perf不能"撤消"我的C++名称,这看起来很令人沮丧.
我正在使用gcc(g ++)版本5.2.1,perf是版本4.2.6,我在编译时使用这些开关:
-I<my own include path> -L<path to the benchmark library> -O3 -std=c++14 -gdwarf-2 -fno-rtti -Wall -pedantic -lbenchmark -pthread
我不使用的原因-fno-omit-frame-pointer是我使用了-gdwarf-2选项,它将调试信息留在矮人可执行文件中,这是在这种情况下保留帧指针的替代方法.这也意味着我--call-graph "dwarf"转到了perf record.无论如何,我也尝试了帧指针方法,它给出了相同的结果,所以这并不重要.
那么为什么在这种情况下不会"撤消"C++名称错误?这与使用GCC有什么关系,这当然意味着我正在使用libstdc ++?
Linux perf-tools非常适合在CPU周期中查找热点并优化这些热点.但是,一旦某些部件被并行化,就很难发现顺序部件,因为它们占用了大量的墙壁时间,但不一定需要很多CPU周期(并行部件已经烧掉了这些部件).
为了避免XY问题:我的基本动机是在多线程代码中找到顺序瓶颈.并行阶段很容易控制聚合CPU周期统计数据,即使由于amdahl定律,连续阶段占据了时间.
对于java应用程序,使用具有线程利用时间轴的visualvm或yourkit相当容易实现.
请注意,它显示了所选范围或时间点的线程状态(可运行,等待,阻塞)和堆栈样本.
如何在Linux上实现与perf或其他原生剖析器相媲美的东西?它不一定是GUI可视化,只是一种查找与它们相关的顺序瓶颈和CPU样本的方法.
较新的Linux内核具有sysfs可调参数/proc/sys/kernel/perf_event_paranoid,允许用户调整perf_events非root用户的可用功能,更高的数字更安全(提供相应更少的功能):
从内核文档中,我们对各种值有以下行为:
perf_event_paranoid:
控制非特权用户对性能事件系统的使用(无CAP_SYS_ADMIN).默认值为2.
-1:允许所有用户使用(几乎)所有事件在没有CAP_IPC_LOCK的perf_event_mlock_kb之后忽略mlock限制
> = 0:没有CAP_SYS_ADMIN的用户不允许使用ftrace函数跟踪点不允许没有CAP_SYS_ADMIN的用户访问原始跟踪点
> = 1:禁止没有CAP_SYS_ADMIN的用户访问CPU事件
> = 2:禁止没有CAP_SYS_ADMIN的用户进行内核分析
我1在我的perf_event_paranoid文件中应该"禁止CPU事件访问" - 但这究竟是什么意思?
普通读数意味着无法访问CPU性能计数器事件(例如Intel PMU事件),但似乎我可以访问那些就好了.例如:
$ perf stat sleep 1
Performance counter stats for 'sleep 1':
0.408734 task-clock (msec) # 0.000 CPUs utilized
1 context-switches # 0.002 M/sec
0 cpu-migrations # 0.000 K/sec
57 page-faults # 0.139 M/sec
1,050,362 cycles # 2.570 GHz
769,135 instructions # 0.73 insn per cycle
152,661 branches # 373.497 M/sec
6,942 …Run Code Online (Sandbox Code Playgroud) perf ×10
profiling ×6
c++ ×4
linux ×3
performance ×3
linux-kernel ×2
x86 ×2
assembly ×1
caching ×1
callgrind ×1
flamegraph ×1
intel-pmu ×1
intel-vtune ×1
papi ×1
wait ×1