PEBS记录的内存访问样本少于实际存在的样本

时间:2017-06-05 20:05:39

标签: linux memory perf

我一直在尝试使用PerfPEBS计数器记录程序进行的内存访问。我的目的是记录程序所做的所有内存访问(我选择SpecCPU2006中的程序)。通过调整某些参数,我似乎记录了比实际程序更多的样本。我知道,正如之前所说的那样,记录所有内存访问样本很难,但是把它放在一边,我想知道PEBS如何记录比实际样本更多的样本?

我按照以下步骤操作: -

首先,我修改了/proc/sys/kernel/perf_cpu_time_max_percent值。 最初为25%,我将其更改为95%。这是因为我想看看是否可以记录最大内存访问样本数。这也可以让我使用更高的perf_event_max_sample_rate,最多通常是100,000,但现在我可以将它设置为更高的值,而不会降低它。

perf_event_max_sample_rate使用了更高的值 244,500 ,而不是 100,000 的最大允许值。

我现在所做的是使用perf-stat来记录程序中内存存储信息的总数。我得到了以下数据: -

./perf stat -e cpu/mem-stores/u ../../.././libquantum_base.arnab 100
N = 100, 37 qubits required
Random seed: 33
Measured 3277 (0.200012), fractional approximation is 1/5.
Odd denominator, trying to expand by 2.
Possible period is 10.
100 = 4 * 25

 Performance counter stats for '../../.././libquantum_base.arnab 100':

       158,115,509      cpu/mem-stores/u                                            

       0.591718162 seconds time elapsed

perf-stat表示大致 ~1.88亿个事件,这应该是一个正确的指标,因为它直接来自硬件计数器值。

但现在,当我运行perf record -e命令并使用 PEBS 计数器来计算可能的所有内存存储事件时: -

./perf record -e cpu/mem-stores/upp -c 1 ../../.././libquantum_base.arnab 100
WARNING: Kernel address maps (/proc/{kallsyms,modules}) are restricted,
check /proc/sys/kernel/kptr_restrict.

Samples in kernel functions may not be resolved if a suitable vmlinux
file is not found in the buildid cache or in the vmlinux path.

Samples in kernel modules won't be resolved at all.

If some relocation was applied (e.g. kexec) symbols may be misresolved
even with a suitable vmlinux or kallsyms file.

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.
N = 100, 37 qubits required
Random seed: 33
Measured 3277 (0.200012), fractional approximation is 1/5.
Odd denominator, trying to expand by 2.
Possible period is 10.
100 = 4 * 25
[ perf record: Woken up 32 times to write data ]
[ perf record: Captured and wrote 7.827 MB perf.data (254125 samples) ]

我可以看到 254125个样本被录制。这比perf stat返回的要少得多。 我只在用户空间记录所有这些访问(我在两种情况下都使用-u)

为什么会这样?我是否以任何错误的方式记录内存存储事件?或者CPU行为有问题吗?

0 个答案:

没有答案