Kernel 为什么我能';t对电源/能量核心使用性能事件修饰符/

Kernel 为什么我能';t对电源/能量核心使用性能事件修饰符/,kernel,perf,Kernel,Perf,我正在尝试使用事件电源/能量核心/使用perf工具读取内核空间中的系统电源,命令如下: perf stat -a -e power/energy-cores/:k -I 1000 sleep 10 :k是一个修饰符,它只收集内核空间中的事件,如本文档中所述,但当我使用此:k时,我得到以下错误: user@dkphome:/sys/bus/event_source/devices/cpu$ sudo perf stat -a -e power/energy-cores/:k -I 1000 sl

我正在尝试使用事件电源/能量核心/使用perf工具读取内核空间中的系统电源,命令如下:

perf stat -a -e power/energy-cores/:k -I 1000 sleep 10
:k是一个修饰符,它只收集内核空间中的事件,如本文档中所述,但当我使用此:k时,我得到以下错误:

user@dkphome:/sys/bus/event_source/devices/cpu$ sudo perf stat -a -e
power/energy-cores/:k -I 1000 sleep 30
event syntax error: '..nergy-cores/:k'
                                   \___ parser error
Run 'perf list' for a list of valid events

  Usage: perf stat [<options>] [<command>]

     -e, --event <event>   event selector. use 'perf list' to list available events
user@dkphome:/sys/bus/event_source/devices/cpu$sudo perf stat-a-e
电源/能量核心/:k-I 1000睡眠30
事件语法错误:“…Energy cores/:k”
\___分析器错误
运行“perf list”以获取有效事件的列表
用法:perf stat[][]
-e、 --事件选择器。使用“性能列表”列出可用事件
首先我认为这个事件不支持:k修饰符,但我做了其他测试,现在我认为这可能是一个bug,或者我尝试使用了错误的语法。为了测试它,我尝试了以下其他事件:

cache misses事件可以通过两种方式调用:cache misses或cpu/cache misses/所以我用修饰符尝试了这两种方式

user@dkphome:/sys/bus/event_source/devices/cpu$ sudo perf stat -a -e cache-misses:k -I 1000 sleep 5
#           time             counts unit events
     1.000429017            287.589      cache-misses:k                                              
     2.000828552            195.999      cache-misses:k                                              
     3.001086195            216.885      cache-misses:k                                              
     4.001438671            240.842      cache-misses:k                                              
     5.000702347            314.469      cache-misses:k                                              
user@dkphome:/sys/bus/event_source/devices/cpu$ sudo perf stat -a -e cpu/cache-misses/:k -I 1000 sleep 5
event syntax error: '..ache-misses/:k'
                                   \___ parser error
Run 'perf list' for a list of valid events

  Usage: perf stat [<options>] [<command>]

     -e, --event <event>   event selector. use 'perf list' to list available events
user@dkphome:/sys/bus/event_source/devices/cpu$ sudo perf stat -a -e cpu/cache-misses/ -I 1000 sleep 5
#           time             counts unit events
     1.000379149          1.949.866      cpu/cache-misses/                                           
     2.000628057          1.023.040      cpu/cache-misses/                                           
     3.000906500          1.284.476      cpu/cache-misses/                                           
     4.001197960            853.127      cpu/cache-misses/                                           
     5.000762257            722.242      cpu/cache-misses/ 
user@dkphome:/sys/bus/event_source/devices/cpu$sudo perf stat-a-e缓存未命中:k-I 1000 sleep 5
#时间计数单位事件
1.000429017 287.589缓存未命中:k
2.000828552 195.999缓存未命中:k
3.001086195 216.885缓存未命中:k
4.001438671 240.842缓存未命中:k
5.000702347 314.469缓存未命中:k
user@dkphome:/sys/bus/event_source/devices/cpu$sudo perf stat-a-e cpu/cache misses/:k-I 1000 sleep 5
事件语法错误:“…ache未命中/:k”
\___分析器错误
运行“perf list”以获取有效事件的列表
用法:perf stat[][]
-e、 --事件选择器。使用“性能列表”列出可用事件
user@dkphome:/sys/bus/event_source/devices/cpu$sudo perf stat-a-e cpu/cache misses/-I 1000 sleep 5
#时间计数单位事件
1.000379149 1.949.866 cpu/缓存未命中/
2.000628057 1.023.040 cpu/缓存未命中/
3.000906500 1.284.476 cpu/缓存未命中/
4.001197960 853.127 cpu/缓存未命中/
5.000762257722.242 cpu/缓存未命中/
有人知道我如何在能量/能量核心/事件中使用:k修饰符吗

结果: 正如正确答案所指出的,它在没有:的情况下工作,但不幸的是,对我来说,修饰符似乎不支持它

user@dkphome:~$ sudo perf stat -a -e power/energy-cores/k -I 1000 sleep 5
#           time             counts unit events
     1.000099515    <not supported> Joules power/energy-cores/k                                        
     2.000246523    <not supported> Joules power/energy-cores/k                                        
     3.000440743    <not supported> Joules power/energy-cores/k                                        
     4.000673143    <not supported> Joules power/energy-cores/k                                        
     5.000722624    <not supported> Joules power/energy-cores/k                                        
user@dkphome:~$ sudo perf stat -a -e power/energy-cores/ -I 1000 sleep 5
 #           time             counts   unit events
     1.000128209               0,19 Joules power/energy-cores/                                         
     2.000257170               0,25 Joules power/energy-cores/                                         
     3.000406715               0,26 Joules power/energy-cores/                                         
     4.000571140               0,20 Joules power/energy-cores/                                         
     5.000711815               1,01 Joules power/energy-cores/                                         
     5.000882867               0,00 Joules power/energy-cores/                                         
user@dkphome:~$sudo perf stat-a-e电源/能源核心/k-I 1000睡眠5
#时间计数单位事件
1.000099515焦耳功率/能量芯/k
2.000246523焦耳功率/能量芯/k
3.000440743焦耳功率/能量芯/k
4.000673143焦耳功率/能量芯/k
5.000722624焦耳功率/能量芯/k
user@dkphome:~$sudo perf stat-a-e电源/能源核心/-I 1000睡眠5
#时间计数单位事件
1.000128209 0,19焦耳功率/能量芯/
2.000257170 0,25焦耳功率/能量芯/
3.000406715 0,26焦耳功率/能量芯/
4.000571140,20焦耳功率/能量芯/
5.000711815 1,01焦耳功率/能量芯/
5.000882867 0,00焦耳功率/能量芯/

通常,当您开始使用
perf
命令测量任何事件时,第一步是运行
perf list
并检查您的系统是否支持该事件
power/energy cores
。我将给出一个在我的系统上运行perf list的示例

~/linux-4.11.3/tools/perf$。/perf list

预定义事件列表(在-e中使用):

分支指令或分支[硬件事件]

分支未命中[硬件事件]

power/energy内核/[内核PMU事件]

这样,您就可以确定您的系统是否支持对事件功率/能量核心的测量

确认后,应使用以下语法测量此事件:

/perf stat-a-e电源/能源核心/-I 1000睡眠30
(非:k或非:u)

编辑#1:

如果您可以像下面那样指定事件
电源/能量核心
,则可以使用:k或:u:-

/perf stat-a-e energy cores:k-I 1000 sleep 30
(但是
perf
无法识别
energy cores
事件,除非您指定这样的完全限定事件名称:
power/energy cores

但正如我在第二次编辑中所建议的,这些计数器无论如何都不支持用户空间和内核空间分离

编辑#2:

不幸的是,这些RAPL计数器没有根据内核空间或用户空间分隔值。此外,与这些事件相关的性能监视单元也不能执行采样

这就是证明