最近我在性能计数器周围挖掘东西.我搜索了perfmon2和libpfm4 http://perfmon2.sourceforge.net/,我还发现了perf命令https://perf.wiki.kernel.org/index.php/Main_Page,并发布了linux的内核源代码. 我发了libpfm4和perf命令的perf源代码链接,而libpfm4似乎只能提供cpu的循环计数或指令计数.
我找不到任何示例代码或如何检索L1-dcache-loads等信息的示例代码,这些信息似乎可以通过使用perf获得,我在stackoverflow上查找了它,并找到了讨论perf命令和libpfm4之间关系的文章:使用硬件性能Linux中的计数器 人们说libpfm4的作者对perf命令的贡献者Ingo之一感到愤怒,但后来他实际上帮助查看了perf的代码.
那么有人可以解释perfmon2或libpfm4与perf命令之间的关系.我可以使用libpfm4检索像L1-dcache这样的信息,就像使用perf命令一样.非常感谢你!
假设我选择perf的事件instructions,LLC-load-misses,LLC-store-misses.进一步假设我测试一个prog 改变其输入的程序.是valgrind应该给我相同的输入和相同的计数器"相同"功能的结果吗?也就是说,如果一个值perf上升,那个值valgrind应该总是相同吗?valgrind在分析我的代码时,我应该注意模拟是否有任何影响?
编辑:BTW,在人们烧烤我没有试验自己之前,我不得不说我(有点)有,问题是我有一个Sandybridge处理器,并且perf有一个"错误"阻止我测量LLC-*事件.有一个补丁,但我不想重新编译我的内核......
我在ubuntu 13.04 servier中使用perf.内核3.8.0-19-通用.我使用相同的操作系统在kvm中运行虚拟机.
我想从主机端介绍来宾os.所以我按照指导操作并执行以下步骤:
但该报告的输出未知
97.33% [guest/17599] [unknown] [g] 0xffffffff816d4470
2.67% [guest/17599] [unknown] [u] 0x00007fe66f2f88fb
Run Code Online (Sandbox Code Playgroud)
为什么输出未知?使用perf kvm top将具有类似的输出.
运行时,perf它会找到我的程序的内核符号和符号,但它找不到外部模块符号.我已经编写了一个内核模块,我加载了insmod如何使用perf它来查找其符号?
我正在运行2.6.37.6内核(无法升级),我perf还不支持矮人选项,但我认为它是一个符号问题.我已经编译了一切-g -fno-omit-frame-pointer
我正在使用perf来了解我的程序的每个函数对总执行时间的开销.为此,我使用cpu-cycles事件:
perf record -e cpu-cycles -c 10000 <binary-with-arguments>
Run Code Online (Sandbox Code Playgroud)
当我查看输出时,我看到与每个函数相关的一些百分比.但是对我来说没有意义的是这样的情况:函数A在函数B中被调用而在其他地方没有.但是我获得的函数A的开销百分比高于B.如果B调用A,则意味着B应该包含A的开销.或者我在这里遗漏了什么?
Linux内核:4.10.0-20-generic(也在4.11.3上试过)
Ubuntu:17.04
我一直试图使用收集内存访问的统计信息perf stat.我能够收集内存存储的统计信息,但内存加载的计数返回0值.
以下是内存存储的详细信息: -
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,510 cpu/mem-stores/u
0.559922797 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
对于内存加载,我得到0计数,如下所示: -
perf stat -e cpu/mem-loads/u ./libquantum_base.arnab 100
N = 100, 37 qubits required
Random seed: …Run Code Online (Sandbox Code Playgroud) 我通常perf record -a --call-graph dwarf -p XXX sleep 1先记录一些函数调用,然后perf report查看该数据,但是如果我还能看到源代码行号以准确知道每个函数调用的位置,那将非常有帮助。例如:
- 4.18% testbinary testbinary [.] malloc
- malloc
- 99.57% operator new(unsigned long)
+ 7.28% MyFunction()
Run Code Online (Sandbox Code Playgroud)
我想知道调用的确切MyFunction()位置new operators(不用看整个函数源代码就可以猜测)
PS:二进制与 -m64 -O2 -ggdb3
我有一个测试用例来观察iTLB负载,iTLB负载未命中
perf stat -e dTLB-loads,dTLB-load-misses,iTLB-loads,iTLB-load-misses -p 22479
Run Code Online (Sandbox Code Playgroud)
并得到输出:
进程ID"22479"的性能计数器统计信息:
1,262,817 dTLB-loads
13,950 dTLB-load-misses # 1.10% of all dTLB cache hits
75 iTLB-loads
6,882 iTLB-load-misses # 9176.00% of all iTLB cache hits
3.999720948 seconds time elapsed
Run Code Online (Sandbox Code Playgroud)
我不知道如何解释iTLB负载仅75但iTLB负载未命中6,882?
lscpu showes:Intel(R)Xeon(R)CPU E5-2620 v4 @ 2.10GHz
编辑:
我可以解释如下:
做(75 + 6882)次iTLB负载,有75次点击但6882次未命中?
编辑:
ocperf.py list | wc -l
Downloading https://download.01.org/perfmon/mapfile.csv to mapfile.csv
Traceback (most recent call last):
File "/home/marschen/tools/pmu-tools-master/ocperf.py", line 1012, in <module>
emap = find_emap()
File "/home/marschen/tools/pmu-tools-master/ocperf.py", line 831, in find_emap
event_download.download(el, toget)
File …Run Code Online (Sandbox Code Playgroud) 背景: 我有2个服务器,所有os内核版本都是4.18.7,它有CONFIG_BPF_SYSCALL = y
我创建了一个shell脚本'x.sh'
i=0
while (( i < 1000000 ))
do (( i ++ ))
done
Run Code Online (Sandbox Code Playgroud)
并运行命令: perf stat ./x.sh
所有的shell版本都是"4.2.6(1)-release"
S1: CPU - Intel(R)Xeon(R)CPU E5-2630 v4 @ 2.20GHz,以及微码 - 0xb00002e和perf stat结果
5391.653531 task-clock (msec) # 1.000 CPUs utilized
4 context-switches # 0.001 K/sec
0 cpu-migrations # 0.000 K/sec
107 page-faults # 0.020 K/sec
12,910,036,202 cycles # 2.394 GHz
27,055,073,385 instructions # 2.10 insn per cycle
6,527,267,657 branches # 1210.624 M/sec
34,787,686 branch-misses # 0.53% of all branches …Run Code Online (Sandbox Code Playgroud) 对于某些情况,我正在分析Memcached的执行情况,并且我想在执行特定功能期间监视dTLB丢失。假设Memcached产生了多个线程,则每个线程都可能并行执行该函数。我发现的一个特定解决方案是Perf具有切换事件功能(使用perf探针监视特定功能期间的性能统计信息),应该让我通过在功能进入和退出时设置探针以及分别在每个探针上切换事件计数器的开/关来实现此目的。
我的问题是:
(a)据我了解,性能切换事件是Linux内核3.x分支的一部分。这是否已合并到Linux内核4.x的最新LTS版本中?如果没有,还有其他选择吗?
(b)此处介绍了我发现的另一个解决方法:监视流程执行子集的性能。但是我不太确定这是否可以解决当前的问题。我很担心,因为Memcached是多线程的,因此让每个线程产生一个新的子进程可能会导致过多的开销。
有什么建议么?