- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在尝试了解“perf”输出中“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%)。我想了解这个数字是如何得出的?
我在 Intel(R) Xeon(R) CPU E5-2698 v4 @ 2.20GHz 上运行“perf”。
最佳答案
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中.
关于linux - Perf 工具统计输出 : multiplex and scaling of "cycles",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48414787/
我开始致力于用 C 或 C++ 实现基本并行串行数据转换器 (MUX)。基本上,该程序从某些文件中获取数据并在单个文件中串行显示它们。 我就从这个开始,在网上搜索了一下,没有找到太多信息。 有我可以使
在 Multiplex_read() 函数中,有一个 for 循环似乎没有运行,我不知道它发生了什么: int write_pins[] = { 0,1,2,3,4,5,6 }; int max_mi
我有一个页面已经同时发出多个 AJAX 请求。他们使用 Comet 模型,所以总是有多个 HTTP 连接打开,等待来自服务器的更多数据。随着页面在未来变得越来越复杂,可能还会有更多。我担心打开太多连接
我正在尝试了解“perf”输出中“cycles”事件的多路复用和缩放。 下面是perf工具的输出: 144094.487583 task-clock (msec) #
我有这段代码可以将 http/s 请求重定向到登录页面,除了 TimeoutHandler 无效外,它可以正常工作,我的意思是 session 不会在 3 秒后超时: func main(){
我正在使用 Python 3.6、asyncio 和 websockets图书馆。我正在尝试为基于 websocket 的服务构建一个客户端,其工作原理如下: 客户端可以使用自定义id、方法和一些pa
我正在为我们的员工整合一个界面,以上传他们需要行业统计信息的产品列表(目前一次手动上传一个)。 然后,每个产品都将通过网络服务 API 提供给我们的统计引擎。 我会回复的。 Stat 引擎将从我的 a
我正在阅读 JDK 7 文档 ( here ) 中有关 channel 的内容,并偶然发现了这个: Multiplexed, non-blocking I/O, which is much more
我是一名优秀的程序员,十分优秀!