如何使用 perf 定期采样缓存未命中率?

问题描述

我想使用 perf 工具定期对流程进行采样,以获取cache miss rate 的分布图。例如,我有一个进程 ID 为 1822 的进程。我想每 0.01 秒获得它的 l1 dcach miss rate。我使用以下命令:

perf record -p 1822  -e L1-dcache-loads,L1-dcache-load-misses -F100 sleep 5

警告:内核地址映射 (/proc/{kallsyms,modules}) 受到限制, 检查 /proc/sys/kernel/kptr_restrict。

如果有合适的 vmlinux,内核函数中的示例可能无法解析 在 buildid 缓存或 vmlinux 路径中找不到该文件

内核模块中的示例根本无法解析。

如果应用了一些重定位(例如 kexec)符号可能会被错误解析 即使使用合适的 vmlinux 或 kallsyms 文件

Couldn't record kernel reference relocation symbol
Symbol resolution may be skewed if relocation was used (e.g. kexec).
Check /proc/kallsyms permission or run as root.
[ perf record: Woken up 1 times to write data ]
[kernel.kallsyms] with build id d3868f47b8075446dac529f92701d0eac6c38c67 not found,continuing without symbols
[ perf record: Captured and wrote 0.061 MB perf.data (1248 samples) ]

此问题发生在操作过程中。这应该允许我拥有 root 权限。但我仍然看到 perf.data 文件。我使用perf record

Available samples
865 L1-dcache-loads                                                                                                                                                                                                      ◆
180 L1-dcache-load-misses                                                                                                                                                                                                ▒
0 l2_rqsts.all_demand_data_rd                                                                                                                                                                                            ▒
0 l2_rqsts.all_demand_miss                                                                                                                                                                                               ▒
181 LLC-loads                                                                                                                                                                                                            ▒
39 LLC-load-misses             

我想同时对两个过程进行采样。我想每 0.1 秒获得一次缓存未命中率。我测了5秒,每个进程应该输出50个采样结果。

但是当我使用-p pid1 pid2时,会出现错误。 而且无论我怎么改,他都只会显示一次结果。我应该怎么办? 或者如果我能在 5 秒内得到缓存未命中率分布的连续图,那就更好了。 谢谢!

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)