我使用 perf 作为基本事件计数器。我正在开发一个遭受数据缓存存储未命中的程序。其中比例高达80%。
我知道缓存原则上是如何工作的。它会在各种未命中情况下从内存加载,并在需要时从缓存中删除数据。我不明白的是:存储未命中和加载未命中之间有什么区别。它与加载和存储有何不同。你怎么能储存错过呢?
perf stat -e <events> <command> 许多不同的事件通常会返回这样的输出
127.352.815.472 r53003c [23,76%]
65.712.112.871 r53019c [23,81%]
178.027.463.861 r53010e [23,88%]
162.854.142.303 r5302c2 [24,05%]
...
Run Code Online (Sandbox Code Playgroud)
百分比记录是什么意思?
perf stat -d ./sample.out输出为:
Performance counter stats for './sample.out':
0.586266 task-clock (msec) # 0.007 CPUs utilized
2 context-switches # 0.003 M/sec
1 cpu-migrations # 0.002 M/sec
116 page-faults # 0.198 M/sec
7,35,790 cycles # 1.255 GHz [81.06%]
<not counted> stalled-cycles-frontend
<not supported> stalled-cycles-backend
<not counted> instructions
<not counted> branches
<not counted> branch-misses
<not supported> L1-dcache-loads:HG
<not counted> L1-dcache-load-misses:HG
<not counted> LLC-loads:HG
<not supported> LLC-load-misses:HG
0.088013919 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
我读了为什么会出现 .但我甚至得到了基本的指示器,如指令,分支机构等.任何人都可以建议如何让它工作?
有趣的是:
sudo perf stat sleep 3
给出输出:
Performance counter stats …Run Code Online (Sandbox Code Playgroud) 我刚开始使用 Google Compute Engine。我想使用 Linux 性能工具对我的应用程序进行一些各种性能事件测量,并最终进行示例分析。我已在 Ubuntu 16.04 LTS VM 上安装了 linux perf 工具。然而,即使是像周期这样的基本事件也会显示为“不支持”。我猜测底层 KVM 管理程序没有启用虚拟 PMU 支持,尽管我相信 KVM 确实通过非默认标志设置支持这一点。有什么办法可以让它发挥作用吗?
# perf stat -e cycles -a sleep 10
Performance counter stats for 'system wide':
<not supported> cycles
10.000598339 seconds time elapsed
Run Code Online (Sandbox Code Playgroud) 我正在尝试在我的 CPU 上分析一组进程。为了非常精确,我想使用perf stat命令来查看我的进程使用了多少 CPU 周期。这与 top 不同,在那里我只看到快照中使用的 CPU 百分比。
不幸的是,我没有找到同时分析多个进程的方法。这可能吗?
作为第二个问题:是否可以不仅看到使用的 CPU 周期,还可以看到在同一时间间隔内使用的 CPU 周期总量(或百分比)?
目前,我可以告诉trace-cmd(一个 ftrace 前端)使用 ftrace 的函数图基础设施来跟踪指定的工作负载。使用一些跟踪数据处理工具,我可以查看调用函数的频率以及每个函数调用的相应总持续时间。示例输出可能如下所示,其中我跟踪了我的工作负载生成的 ext4 函数调用:
# trace-cmd post-processing example output
# function name, frequency, total duration (us)
ext4_alloc_inode(),1,35.567
ext4_read_inode_bitmap(),1,12.076
ext4_init_io_end(),2,41.216
ext4_journal_check_start(),39,716.3
ext4_da_write_end(),10,102.661
ext4_da_get_block_prep(),9,257.46999999999997
ext4_block_write_begin(),2,88.069
ext4_bio_write_page(),1,33.016
Run Code Online (Sandbox Code Playgroud)
我已经看到了可以由、、等生成的令人难以置信的火焰图,这让我相信我应该能够实现与使用或 的输出类似的输出。但是,有一些障碍:eBPFsystemtapperftrace-cmdperfeBPF
perf. 作为参考,您可以查看在更短的时间内跟踪 bash 的示例输出。eBPF无法确定是否可以获得与我的trace-cmd后处理示例输出类似的数据/输出。对于那些比我更熟悉eBPF或perf比我更熟悉的人,我想知道:
eBPF或perf实现我的目标?如果您感觉特别慷慨,将不胜感激能帮助我实现目标的示例代码/命令。
最大采样频率的值是如何由linux内核决定的?如果 perf 在同一台机器上执行,为什么这个值会改变?
使用 perf 时,我注意到 perf_event_max_sample_rate 的值发生了变化吗?为什么?这个值不应该保持不变吗?
根据perf. 不幸的perf是没有显示整个函数名称,只有以下内容:
std::__detail::_Map_base<piece, std::pair<piece const, int>, std::allocator<std::pair<piece const, int> >, std::__detail::_Select1st, std::equa
Run Code Online (Sandbox Code Playgroud)
在std::equa我无法向右滚动之后。如何找出整个函数名称以知道它是哪个函数?我在父函数中使用该地图做了很多事情,所以它可能是多件事。
第一件事:
我的 Dockerfile
FROM alpine:latest
# Set the working directory to /app
WORKDIR /app/
# Install any needed packages specified in requirements.txt
RUN yes | apk add vim
RUN echo "http://dl-cdn.alpinelinux.org/alpine/edge/testing" | tee -a /etc/apk/repositories
RUN apk add --update perf
Run Code Online (Sandbox Code Playgroud)
问题,这些是在容器内运行的命令:
/ # cat /proc/sys/kernel/perf_event_paranoid
-1
/ # perf stat -d sleep 1
Error:
No permission to enable task-clock event.
You may not have permission to collect stats.
Consider …Run Code Online (Sandbox Code Playgroud) 我试图了解更改/proc/sys/kernel/perf_event_mlock_kb.
让我感到困惑的是,两个来源都使用两个不同的单位 - 页数和内存 Kb。同时,_kb名称的后缀暗示该文件定义了 Kb 的数量。
我的理解是否正确,该措辞意味着该数字应该可以通过页面大小来判断,如果我在具有两个 vCPU 的机器上将文件设置为 8046,那么 perf 将能够为事件缓冲区占用多达 16Mb 的内存?
perf ×10
linux ×4
performance ×3
profiling ×2
alpine-linux ×1
bpf ×1
c++ ×1
caching ×1
command-line ×1
cpu-cache ×1
docker ×1
ebpf ×1
ftrace ×1
kvm ×1
linux-kernel ×1
std ×1
trace ×1
x86 ×1