标签: perf

如何分析在C/C++应用程序中花在内存访问上的时间?

函数在应用程序中花费的总时间可以大致分为两个部分:

  1. 花在实际计算上的时间(Tcomp)
  2. 花在内存访问上的时间(Tmem)

通常,剖析器提供函数花费的总时间的估计.是否有可能估算出上述两个组件(Tcomp和Tmem)所花费的时间?

c++ profiling intel-vtune callgrind perf

14
推荐指数
3
解决办法
1237
查看次数

无法为C++方法添加perf探针

我正在尝试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说它不存在.

有没有解决这个问题的方法?

c++ linux perf

13
推荐指数
2
解决办法
1031
查看次数

如何使用linux`perf`工具生成"Off-CPU"配置文件

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上执行得更频繁).

  • 如何将Gregg的非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啤酒会议)

linux profiling wait perf

13
推荐指数
2
解决办法
3522
查看次数

linux的perf实用程序如何理解堆栈跟踪?

Brendan Gregg使用Linux的perf实用程序为c/c ++,jvm代码,nodejs代码等生成火焰图.

Linux内核本身是否了解堆栈跟踪?在哪里可以阅读更多关于工具如何能够反省到流程的堆栈跟踪,即使流程是用完全不同的语言编写的?

linux-kernel perf flamegraph

13
推荐指数
1
解决办法
6382
查看次数

为什么Perf和Papi为L3缓存引用和未命中提供不同的值?

我正在开发一个项目,我们必须实现一个在理论上被证明是缓存友好的算法.简单来说,如果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)

c++ performance caching papi perf

13
推荐指数
1
解决办法
1822
查看次数

了解lfence对具有两个长依赖链的循环的影响,以增加长度

我正在玩这个答案的代码,稍微修改一下:

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序列和dimul edx, edx一个): …

performance x86 assembly cpu-architecture perf

13
推荐指数
2
解决办法
472
查看次数

perf.data文件没有样本

我在ubuntu 11.10上使用perf 3.0.4.它的记录命令运行良好,并在终端显示256个样本收集.但是当我使用perf报告时,它会给我以下错误:

perf.data file has no samples
Run Code Online (Sandbox Code Playgroud)

我搜索了很多解决方案,但还没有成功.

profiling perf

12
推荐指数
3
解决办法
7381
查看次数

Perf显示损坏的函数名称

在我看到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 ++?

c++ profiling name-mangling perf

12
推荐指数
1
解决办法
4453
查看次数

Linux上的线程利用率分析

Linux perf-tools非常适合在CPU周期中查找热点并优化这些热点.但是,一旦某些部件被并行化,就很难发现顺序部件,因为它们占用了大量的墙壁时间,但不一定需要很多CPU周期(并行部件已经烧掉了这些部件).

为了避免XY问题:我的基本动机是在多线程代码中找到顺序瓶颈.并行阶段很容易控制聚合CPU周期统计数据,即使由于amdahl定律,连续阶段占据了时间.

对于java应用程序,使用具有线程利用时间轴的visualvm或yourkit相当容易实现.

yourkit线程时间轴

请注意,它显示了所选范围或时间点的线程状态(可运行,等待,阻塞)和堆栈样本.

如何在Linux上实现与perf或其他原生剖析器相媲美的东西?它不一定是GUI可视化,只是一种查找与它们相关的顺序瓶颈和CPU样本的方法.

linux performance multithreading profiling perf

12
推荐指数
1
解决办法
1059
查看次数

perf_event_paranoid == 1实际上对x86性能有什么限制?

较新的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)

x86 profiling linux-kernel perf intel-pmu

12
推荐指数
1
解决办法
4407
查看次数