[英]Perf tool stat output: multiplex and scaling of “cycles”
我试图了解“性能”输出中“周期”事件的复用和缩放。
以下是perf工具的输出:
144094.487583 task-clock (msec) # 1.017 CPUs utilized
539912613776 instructions # 1.09 insn per cycle (83.42%)
496622866196 cycles # 3.447 GHz (83.48%)
340952514 cache-misses # 10.354 % of all cache refs (83.32%)
3292972064 cache-references # 22.854 M/sec (83.26%)
144081.898558 cpu-clock (msec) # 1.017 CPUs utilized
4189372 page-faults # 0.029 M/sec
0 major-faults # 0.000 K/sec
4189372 minor-faults # 0.029 M/sec
8614431755 L1-dcache-load-misses # 5.52% of all L1-dcache hits (83.28%)
156079653667 L1-dcache-loads # 1083.223 M/sec (66.77%)
141.622640316 seconds time elapsed
我了解内核使用多路复用为每个事件提供了访问硬件的机会。 因此最终的输出是估算值。
显示“周期”事件(83.48%)。 我试图了解这个数字是如何得出的?
我在2.20GHz的Intel®Xeon®CPU E5-2698 v4上运行“性能”。
彼得·科德斯(Peter Cordes)的答案是正确的。
PMU事件非常复杂,计数器的数量有限,某些事件是特殊的,某些逻辑事件可能由多个硬件事件组成,甚至事件之间可能存在冲突。
我相信Linux并不了解这些限制,它只是尝试从列表中激活事件-更准确地说是事件组。 如果无法激活所有事件,它将停止,并激活多路复用。 每当多路复用计时器结束时,它将有效地旋转事件列表,现在从第二个开始激活激活事件,然后从第三个开始激活…Linux不知道它仍然可以激活循环事件,因为它很特殊。
几乎没有记录的选项可以通过在名称后添加:D
来固定某些事件的优先级。 我系统上的示例:
$ perf stat -e cycles -e instructions -e cache-misses -e cache-references -e L1-dcache-load-misses -e L1-dcache-loads ...
119.444.297.774 cycles:u (55,88%)
130.133.371.858 instructions:u # 1,09 insn per cycle (67,81%)
38.277.984 cache-misses:u # 7,780 % of all cache refs (72,92%)
491.979.655 cache-references:u (77,00%)
3.892.617.942 L1-dcache-load-misses:u # 15,57% of all L1-dcache hits (82,19%)
25.004.563.072 L1-dcache-loads:u (43,85%)
固定说明和周期:
$ perf stat -e cycles:D -e instructions:D -e cache-misses -e cache-references -e L1-dcache-load-misses -e L1-dcache-loads ...
120.683.697.083 cycles:Du
132.185.743.504 instructions:Du # 1,10 insn per cycle
27.917.126 cache-misses:u # 4,874 % of all cache refs (61,14%)
572.718.930 cache-references:u (71,05%)
3.942.313.927 L1-dcache-load-misses:u # 15,39% of all L1-dcache hits (80,38%)
25.613.635.647 L1-dcache-loads:u (51,37%)
这导致与省略周期和指令相同的复用:
$ perf stat -e cache-misses -e cache-references -e L1-dcache-load-misses -e L1-dcache-loads ...
35.333.318 cache-misses:u # 7,212 % of all cache refs (62,44%)
489.922.212 cache-references:u (73,87%)
3.990.504.529 L1-dcache-load-misses:u # 15,40% of all L1-dcache hits (84,99%)
25.918.321.845 L1-dcache-loads:u
请注意,您还可以对事件进行分组( -e \\{event1,event2\\}
)-这意味着事件总是一起读取-如果不能一起激活组合则根本不读取事件。
1:总是可以添加的软件事件例外。 内核代码的相关部分位于kernel / events / core.c中 。
IDK为什么在cycles
或instructions
根本没有任何多路复用,因为在CPU上有用于这2个事件的专用计数器,不能将其编程为对任何其他事件进行计数。
但是对于其他人,我很确定这些百分比是按照CPU时间的分数表示的,有一个硬件计数器对该事件进行计数。
例如, cache-references
占程序运行的144094.487583 CPU毫秒的83.26%,或〜119973.07 ms。 总计数从其计数时间开始推断。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.