标签: perf

perf 如何将事件与函数关联起来?

更准确地说,perf 工具如何将 PMU 事件与函数关联起来,我已经意识到,当内核 perf 子系统记录事件计数器时,它还会记录程序计数器 (PC),因此它可以将计数与函数关联起来。

然而,要真正获得细粒度结果,您需要以非常高的速率对计数器进行采样,否则您可能会将计数器与一组函数相关联。但是读取计数器并将采样数据(计数器、PC、调用堆栈)写入 perf mmap 空间是非常侵入性的。

我在一些资料中读到,这种采样仅在 PMU 计数器溢出时发生,但这可能非常粗糙,除非我将计数器设置为非常快地溢出

我在这里缺少什么?

linux performance linux-kernel perf

2
推荐指数
1
解决办法
2447
查看次数

如何在 LinuxKit (Mac 版 Docker) 中运行 perf?

我有 Docker for Mac 和 LinuxKit 内核版本4.9.125-linuxkit

perf在主机上不可用。我尝试将其安装在我的 Ubuntu 容器之一上,但无法获取内核linux-tools的版本控制包4.9.125。所以当我尝试运行 perf 时,我只是得到

WARNING: perf not found for kernel 4.9.125

有没有办法perf在我的 LinuxKit/Hyperkit 主机上运行?如果可以,如何运行?

perf docker docker-for-mac docker-desktop

2
推荐指数
1
解决办法
1007
查看次数

什么是 _PyEval_EvalFrameDefault?

当我使用 perf 进行分析时,_PyEval_EvalFrameDefaultCPU 使用率位于顶部。

但我不知道那是什么。我怎样才能避免这个功能?

python profiling python-3.x python-internals perf

2
推荐指数
1
解决办法
5065
查看次数

Perf 中用于确定库加载地址的机制

在后处理期间如何perf确定每个加载图像(例如共享库)的加载地址。例如,perf report使用此信息使每个符号地址相对于每个加载图像的开头。如下图所示 ( unwind: _int_malloc...): 在此输入图像描述

它是否存储在elf二进制或分析输出中的某个位置(即perf.data)?

linker trace ip-address shared-libraries perf

2
推荐指数
1
解决办法
937
查看次数

Perf 中奇怪的回溯

L3-misses我使用以下命令在简单的基准测试中提取导致用户级别的回溯evince

sudo perf record -d --call-graph dwarf -c 10000 -e mem_load_uops_retired.l3_miss:uppp /opt/evince-3.28.4/bin/evince
Run Code Online (Sandbox Code Playgroud)

很明显,采样周期相当大(连续采样之间有 10000 个事件)。对于这个实验, 的输出perf script有一些与此类似的样本:

EvJobScheduler 27529 26441.375932:      10000 mem_load_uops_retired.l3_miss:uppp:     7fffcd5d8ec0         5080022 N/A|SNP N/A|TLB N/A|LCK N/A
    7ffff17bec7f bits_image_fetch_separable_convolution_affine+0x2df (inlined)
    7ffff17bec7f bits_image_fetch_separable_convolution_affine_pad_x8r8g8b8+0x2df (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
    7ffff17d1fd1 general_composite_rect+0x301 (/usr/lib/x86_64-linux-gnu/libpixman-1.so.0.34.0)
  ffffffffffffffff [unknown] ([unknown])
Run Code Online (Sandbox Code Playgroud)

在回溯的底部,有一个名为 的符号[unknown],看起来没问题。但随后就呼叫了线路general_composite_rect()。这个回溯OK吗?

AFAIK,回溯中的第一个调用者应该是类似_start()或 的东西__GI___clone()。但回溯不是这种形式。怎么了?

有什么办法可以解决这个问题吗?截断的(部分)回溯可靠吗?

linux trace performancecounter call-graph perf

2
推荐指数
1
解决办法
2921
查看次数

查询“perf.data”文件以获取符号的总原始执行时间

perf曾经用perf record ./application. perf report向我展示了有关它的各种事情。如何显示运行应用程序所需的总时间以及运行特定“符号”/功能的总时间?perf 似乎经常显示百分比,但我想要原始时间,并且它想要“包容性”时间,即包括孩子。

Ubuntu Linux 18.04 上的 perf v4.15.18

optimization performance performance-testing perf

2
推荐指数
1
解决办法
1472
查看次数

Perf 显示没有内存访问的块中的 L1-dcache-load-misses

下面是一个代码块,perf record 标记为造成所有 L1-dcache 未命中的 10%,但该块完全是 zmm 寄存器之间的移动。这是 perf 命令字符串:

perf record -e L1-dcache-load-misses -c 10000 -a -- ./Program_to_Test.exe
Run Code Online (Sandbox Code Playgroud)

代码块:

Round:
vmulpd zmm1,zmm0,zmm28
VCVTTPD2QQ zmm0{k7},zmm1
VCVTUQQ2PD zmm2{k7},zmm0
vsubpd zmm3,zmm1,zmm2
vmulpd zmm4,zmm3,zmm27
VCVTTPD2QQ zmm5{k7}{z},zmm4

VPCMPGTQ k2,zmm5,zmm26
VPCMPEQQ k3 {k7},zmm5,zmm26
KADDQ k1,k2,k3

VCVTQQ2PD zmm2{k7},zmm0
VDIVPD zmm1{k7},zmm2,zmm28 ; Divide by 100
VPXORQ zmm2{k7},zmm2,zmm2
vmovupd zmm2,zmm1
VADDPD zmm2{k1},zmm1,zmm25
Run Code Online (Sandbox Code Playgroud)

对于该代码块,我使用其他 L1 度量(例如 l1d.replacement)得到了类似的结果。

我的问题是,一个仅是 zmm 寄存器移动的块如何会产生 L1 缓存未命中?我认为寄存器根本不会进入内存。事实上,最后一次内存访问是在该代码块之上的10条指令;其他9条指令都是寄存器到寄存器指令。

linux performance profiling x86-64 perf

2
推荐指数
1
解决办法
1034
查看次数

时钟周期内的缓存未命中延迟

为了测量程序中缓存未命中的影响,我想要计算缓存未命中对用于实际计算的周期造成的延迟。\n我用它来perf stat测量周期、L1 负载、L1 未命中、LLC 负载和 LLC - 我的程序中遗漏了。这是一个示例输出:

\n
               467\xe2\x80\xaf769,70 msec task-clock                #    1,000 CPUs utilized          \n        1\xe2\x80\xaf234\xe2\x80\xaf063\xe2\x80\xaf672\xe2\x80\xaf432      cycles                    #    2,638 GHz                      (62,50%)\n          572\xe2\x80\xaf761\xe2\x80\xaf379\xe2\x80\xaf098      instructions              #    0,46  insn per cycle           (75,00%)\n          129\xe2\x80\xaf143\xe2\x80\xaf035\xe2\x80\xaf219      branches                  #  276,083 M/sec                    (75,00%)\n            6\xe2\x80\xaf457\xe2\x80\xaf141\xe2\x80\xaf079      branch-misses             #    5,00% of all branches          (75,00%)\n          195\xe2\x80\xaf360\xe2\x80\xaf583\xe2\x80\xaf052      L1-dcache-loads           #  417,643 M/sec                    (75,00%)\n           33\xe2\x80\xaf224\xe2\x80\xaf066\xe2\x80\xaf301      L1-dcache-load-misses     #   17,01% of all L1-dcache hits    (75,00%)\n           20\xe2\x80\xaf620\xe2\x80\xaf655\xe2\x80\xaf322      LLC-loads                 #   44,083 M/sec                    (50,00%)\n            6\xe2\x80\xaf030\xe2\x80\xaf530\xe2\x80\xaf728      LLC-load-misses           #   29,25% of all LL-cache hits     (50,00%)\n
Run Code Online (Sandbox Code Playgroud)\n

那么我的问题是:\n如何将缓存未命中数转换为“丢失”时钟周期数? …

performance latency cpu-architecture cpu-cache perf

2
推荐指数
1
解决办法
3370
查看次数

“perf annotate”内存加载/存储时间报告不一致

我很难解释英特尔性能事件报告。

\n

考虑以下主要读/写内存的简单程序:

\n
#include <stdint.h>\n#include <stdio.h>\n\nvolatile uint32_t a;\nvolatile uint32_t b;\n\nint main() {\n  printf("&a=%p\\n&b=%p\\n", &a, &b);\n  for(size_t i = 0; i < 1000000000LL; i++) {\n    a ^= (uint32_t) i;\n    b += (uint32_t) i;\n    b ^= a;\n  }\n  return 0;\n}\n
Run Code Online (Sandbox Code Playgroud)\n

我用gcc -O2以下命令编译它并运行perf

\n
#include <stdint.h>\n#include <stdio.h>\n\nvolatile uint32_t a;\nvolatile uint32_t b;\n\nint main() {\n  printf("&a=%p\\n&b=%p\\n", &a, &b);\n  for(size_t i = 0; i < 1000000000LL; i++) {\n    a ^= (uint32_t) i;\n    b += (uint32_t) i;\n    b ^= a;\n  }\n …
Run Code Online (Sandbox Code Playgroud)

performance assembly x86-64 micro-optimization perf

2
推荐指数
1
解决办法
394
查看次数

在Linux中通过perf添加动态跟踪点以获取未列出的功能

我试图用zap_pte_rangemm/memory.c 跟踪函数perf.但功能没有列在perf probe -F.那么有没有办法动态追踪这个功能?即明确添加跟踪点并重新编译内核?

perf probe -a zap_pte_range
Run Code Online (Sandbox Code Playgroud)

得到:

没有找到构建ID为33b15ec444475ee7806331034772f61666fa6719的[kernel.kallsyms],继续没有符号

无法在内核中找到符号zap_pte_range

错误:无法添加事件.

c trace linux-kernel perf

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