perf_events列表中的内核PMU事件是什么?


11

在搜索什么人能够监测perf_events在Linux上,我找不到什么Kernel PMU event是?也就是说,与perf version 3.13.11-ckt39perf list节目的事件,如:

branch-instructions OR cpu/branch-instructions/    [Kernel PMU event]

总体上有:

Tracepoint event
Software event
Hardware event
Hardware cache event
Raw hardware event descriptor
Hardware breakpoint
Kernel PMU event

而且我想了解它们的含义,来源。除了Kernel PMU event项目外,我对所有人都有某种解释。

perf Wiki教程Brendan Gregg的页面中,我知道:

  • Tracepoints最清晰-这些是内核源代码上的宏,它们是监视的探针点,它们是随ftrace项目引入的,现在每个人都使用
  • Software 是内核的低级计数器和一些内部数据结构(因此,它们与跟踪点不同)
  • Hardware event是一些非常基本的CPU事件,可以在所有体系结构上找到,并且可以通过某种方式轻松地由内核访问
  • Hardware cache event是-的昵称Raw hardware event descriptor如下

    据我了解,Raw hardware event descriptor与(微结构)体系结构有关的事件比Hardware event来自处理器监视单元(PMU)或给定处理器的其他特定功能的事件多,因此它们仅在某些微体系结构上可用(例如,“架构”的意思是“ x86_64”,其余所有实现细节都是“微架构”)。并且可以通过这些奇怪的描述符来进行检测

    rNNN                                               [Raw hardware event descriptor]
    cpu/t1=v1[,t2=v2,t3 ...]/modifier                  [Raw hardware event descriptor]
     (see 'man perf-list' on how to encode it)
    

    -这些描述符,它们指向的事件等等,可以在处理器手册中找到(perf Wiki中的PMU事件);

    但是,当人们知道给定处理器上有一些有用的事件时,他们给它起一个昵称并将其插入linux Hardware cache event以方便访问

    -如果我错了指正(奇怪的全部Hardware cache event是关于something-loadssomething-misses-非常喜欢实际的处理器的高速缓存。)

  • 现在 Hardware breakpoint

    mem:<addr>[:access]                                [Hardware breakpoint]
    

    是一项硬件功能,可能是大多数现代体系结构所共有的,并且在调试器中充当断点?(可能还是可以谷歌搜索的)

  • 最后,Kernel PMU event我没办法去谷歌搜索;

    它也没有出现在Brendan的perf页面的Events列表中,所以是新的吗?

    也许仅仅是PMU专门针对硬件事件的昵称?(为了便于访问,除了昵称外,它在事件列表中还有一个单独的部分。)实际上,Hardware cache events昵称可能是CPU缓存中的硬件事件,而Kernel PMU event昵称是PMU事件吗?(为什么不这样称呼Hardware PMU event?。。)这可能只是一种新的命名方案-硬件事件的昵称被分段了?

    这些事件涉及诸如之类的东西cpu/mem-stores/,再加上一些Linux版本事件在/sys/devices/和中都有描述:

    # find /sys/ -type d -name events
    /sys/devices/cpu/events
    /sys/devices/uncore_cbox_0/events
    /sys/devices/uncore_cbox_1/events
    /sys/kernel/debug/tracing/events
    

    - debug/tracing是for ftrace和tracepoints,其他目录与perf list显示的完全匹配Kernel PMU event

有人可以给我指出什么是什么Kernel PMU events/sys/..events/系统的很好的解释/文档吗?另外,是否/sys/..events/有一些新的工作来使硬件事件系统化或类似?(然后,内核PMU就像“内核性能监视单元”。)

聚苯乙烯

为了提供更好的上下文,perf list使用Kernel PMU events和Hardware cache events的完整列表(未列出跟踪点,但所有1374个都存在)进行了无特权的运行:

$ perf list 

List of pre-defined events (to be used in -e):
 cpu-cycles OR cycles                               [Hardware event]
 instructions                                       [Hardware event]
 ...
 cpu-clock                                          [Software event]
 task-clock                                         [Software event]
 ...
 L1-dcache-load-misses                              [Hardware cache event]
 L1-dcache-store-misses                             [Hardware cache event]
 L1-dcache-prefetch-misses                          [Hardware cache event]
 L1-icache-load-misses                              [Hardware cache event]
 LLC-loads                                          [Hardware cache event]
 LLC-stores                                         [Hardware cache event]
 LLC-prefetches                                     [Hardware cache event]
 dTLB-load-misses                                   [Hardware cache event]
 dTLB-store-misses                                  [Hardware cache event]
 iTLB-loads                                         [Hardware cache event]
 iTLB-load-misses                                   [Hardware cache event]
 branch-loads                                       [Hardware cache event]
 branch-load-misses                                 [Hardware cache event]

 branch-instructions OR cpu/branch-instructions/    [Kernel PMU event]
 branch-misses OR cpu/branch-misses/                [Kernel PMU event]
 bus-cycles OR cpu/bus-cycles/                      [Kernel PMU event]
 cache-misses OR cpu/cache-misses/                  [Kernel PMU event]
 cache-references OR cpu/cache-references/          [Kernel PMU event]
 cpu-cycles OR cpu/cpu-cycles/                      [Kernel PMU event]
 instructions OR cpu/instructions/                  [Kernel PMU event]
 mem-loads OR cpu/mem-loads/                        [Kernel PMU event]
 mem-stores OR cpu/mem-stores/                      [Kernel PMU event]
 ref-cycles OR cpu/ref-cycles/                      [Kernel PMU event]
 stalled-cycles-frontend OR cpu/stalled-cycles-frontend/ [Kernel PMU event]
 uncore_cbox_0/clockticks/                          [Kernel PMU event]
 uncore_cbox_1/clockticks/                          [Kernel PMU event]

 rNNN                                               [Raw hardware event descriptor]
 cpu/t1=v1[,t2=v2,t3 ...]/modifier                  [Raw hardware event descriptor]
  (see 'man perf-list' on how to encode it)

 mem:<addr>[:access]                                [Hardware breakpoint]

 [ Tracepoints not available: Permission denied ]

Answers:


11

谷歌搜索和ack-ing结束了!我有一些答案。

但是首先让我进一步阐明问题的目的:我想清楚地区分系统中的独立流程及其性能指标。例如,处理器的核心,非核心的设备(最近了解到有关信息),处理器上的内核或用户应用程序,总线(=总线控制器),硬盘驱动器都是独立的进程,它们不通过时钟同步。如今,他们所有人都有一些过程监控计数器(PMC)。我想了解计数器的来源。(它在谷歌搜索中也很有帮助:事物的“供应商”将其更好地归零。)

同样,用于搜索的设备:Ubuntu 14.04linux 3.13.0-103-generic处理器Intel(R) Core(TM) i5-3317U CPU @ 1.70GHz(来自/proc/cpuinfo,它具有2个物理核心和4个虚拟核心-这里的物理物质)。

术语,问题涉及的事物

来自英特尔:

  • 处理器是一个core设备(一个设备/一个进程)和一堆uncore设备core是运行程序(时钟,ALU,寄存器等)uncore的设备,是放置在设备上的设备,由于速度和低延迟而靠近处理器(真正的原因)是“因为制造商可以做到”);据我了解,基本上是北桥,就像在PC主板上一样,还有缓存。AMD实际上将这些设备instead of称为NorthBridge uncore`;

  • ubox 出现在我的 sysfs

    $ find /sys/devices/ -type d -name events 
    /sys/devices/cpu/events
    /sys/devices/uncore_cbox_0/events
    /sys/devices/uncore_cbox_1/events
    

    -是一种uncore设备,用于管理最后一级缓存(LLC,即命中RAM之前的最后一个);我有2个核心,因此2个LLC和2个ubox

  • 处理器监视单元(PMU)是监视处理器操作并将其记录在处理器监视计数器(PMC)中的独立设备(计数高速缓存未命中,处理器周期等);它们上存在coreuncore设备; 的core那些与访问rdpmc(读PMC)指令; 的uncore,因为这些装置在手取决于实际的处理器,经由经由模型特定的寄存器(MSR)访问rdmsr(自然);

    显然,它们的工作流程是通过成对的寄存器完成的-1个寄存器组会触发计数器计数,2个寄存器是计数器中的值;可以将计数器配置为在一堆事件后增加,而不仅仅是1个;+这些计数器有一些中断/技术提示;

  • 可以在英特尔的《 IA-32软件开发人员手册第3B卷》第18章“性能监控”中找到更多信息;

    另外,uncore“图18-1”中描述了针对这些“ PMC”版本“建筑性能监测版本1”(手册中有1-4版本,我不知道我的处理器是哪个)的MSR格式。 IA32_PERFEVTSELx MSR”(我的第18-3页),以及“ 18.2.1.2预定义的架构性能事件”和“表18-1。用于预定义的架构性能事件的UMask和事件选择编码”部分,其中显示了事件,显示为Hardware eventperf list

从linux内核:

  • 内核有一个用于管理不同来源的性能计数器(软件(内核的)和硬件)的系统(抽象/层),在中进行了描述linux-source-3.13.0/tools/perf/design.txt。该系统中的事件定义为struct perf_event_attr(file linux-source-3.13.0/include/uapi/linux/perf_event.h),其主要部分可能是__u64 config字段-它可以保存特定于CPU的事件定义(这些英特尔图形上描述的格式的64位字)或内核事件

    配置字的MSB表示其余是否包含[原始CPU或内核的事件]

    内核的事件定义了7个类型的位和56个事件的标识符,它们enum在代码中是-s,在我的情况下是:

    $ ak PERF_TYPE linux-source-3.13.0/include/
    ...
    linux-source-3.13.0/include/uapi/linux/perf_event.h
    29: PERF_TYPE_HARDWARE      = 0,
    30: PERF_TYPE_SOFTWARE      = 1,
    31: PERF_TYPE_TRACEPOINT    = 2,
    32: PERF_TYPE_HW_CACHE      = 3,
    33: PERF_TYPE_RAW           = 4,
    34: PERF_TYPE_BREAKPOINT    = 5,
    36: PERF_TYPE_MAX,         /* non-ABI */
    

    ak是我的别名ack-grep,这是ack在Debian上的名称;ack太棒了);

    在内核的源代码中,可以看到诸如“注册在系统上发现的所有PMU”和结构类型之类的操作struct pmu,这些操作被传递给类似的东西int perf_pmu_register(struct pmu *pmu, const char *name, int type)-因此,人们可以将这个系统称为“内核的PMU”,这将是一个汇总系统上所有PMU的数量;但是这个名称可以解释为内核操作的监视系统,这会产生误导;

    perf_events为了清楚起见,我们将此子系统称为“子系统”。

  • 与任何内核子系统一样,可以将该子系统导出到sysfs其中(导出内核子系统供人们使用);而这正是那些events在我的目录/sys/-导出(部分?)perf_events子系统;

  • 同样,用户空间实用程序perf(内置在linux中)仍然是一个单独的程序,具有自己的抽象;它代表一个请求用户监视的事件,以perf_evsel(files linux-source-3.13.0/tools/perf/util/evsel.{h,c})表示-该结构具有一个字段struct perf_event_attr attr;,但还有一个类似的字段struct cpu_map *cpus;perf实用程序将事件分配给所有或特定CPU的方式。

回答

  1. 实际上,Hardware cache event是(特定ubox于处理器的uncore)可通过协议访问的缓存设备(英特尔设备的)事件的“捷径” Raw hardware event descriptor。而且Hardware event在体系结构中更稳定,据我所知,它可以从core设备中命名事件。我的内核中没有其他3.13到某些其他uncore事件和计数器的“捷径” 。其余所有- SoftwareTracepoints-都是内核的事件。

    我不知道coreHardware events的通过相同的访问Raw hardware event descriptor协议。他们可能不会-因为计数器/ PMU位于上core,所以可能以不同的方式访问它。例如,使用该rdpmu指令而不是rdmsr访问的指令uncore。但这不是那么重要。

  2. Kernel PMU event只是事件,这些事件已导出到中sysfs。我不知道这是怎么做到的(由内核自动将系统上所有发现的PMC或只是硬编码的东西自动添加,如果我添加kprobe-是否导出?等)。但要点是,这些事件Hardware event与内部perf_event系统中的事件或其他事件相同。

    我不知道那些

    $ ls /sys/devices/uncore_cbox_0/events
    clockticks
    

    是。

详细信息 Kernel PMU event

搜索代码会导致:

$ ak "Kernel PMU" linux-source-3.13.0/tools/perf/
linux-source-3.13.0/tools/perf/util/pmu.c                                                            
629:                printf("  %-50s [Kernel PMU event]\n", aliases[j]);

-在函数中发生

void print_pmu_events(const char *event_glob, bool name_only) {
   ...
        while ((pmu = perf_pmu__scan(pmu)) != NULL)
                list_for_each_entry(alias, &pmu->aliases, list) {...}
   ... 
   /* b.t.w. list_for_each_entry is an iterator
    * apparently, it takes a block of {code} and runs over some lost
    * Ruby built in kernel!
    */
    // then there is a loop over these aliases and
    loop{ ... printf("  %-50s [Kernel PMU event]\n", aliases[j]); ... }
}

perf_pmu__scan在同一文件中:

struct perf_pmu *perf_pmu__scan(struct perf_pmu *pmu) {
    ...
                pmu_read_sysfs(); // that's what it calls
}

-也位于同一文件中:

/* Add all pmus in sysfs to pmu list: */
static void pmu_read_sysfs(void) {...}

而已。

Hardware event和的详细信息Hardware cache event

显然,这Hardware event来自英特尔在IA-32软件开发人员手册第3B卷中称为18.2.1.2的“预定义的架构性能事件”。手册的“ 18.1性能监控概述”将其描述为:

第二类性能监视功能称为体系结构性能监视。此类支持相同的计数和基于中断的事件采样用法,但可用事件集较少。架构性能事件的可见行为在处理器实现之间是一致的。使用CPUID.0AH枚举了体系结构性能监视功能的可用性。这些事件在第18.2节中讨论。

-另一种类型是:

从Intel Core Solo和Intel Core Duo处理器开始,有两类性能监视功能。第一类支持使用计数或基于中断的事件采样用法来监视性能的事件。这些事件是非架构性的,从一个处理器模型到另一个处理器模型都不同。

这些事件确实只是与底层“原始”硬件事件的链接,可以通过perf实用程序作为进行访问Raw hardware event descriptor

要检查这一点,请看linux-source-3.13.0/arch/x86/kernel/cpu/perf_event_intel.c

/*
 * Intel PerfMon, used on Core and later.
 */
static u64 intel_perfmon_event_map[PERF_COUNT_HW_MAX] __read_mostly =
{
    [PERF_COUNT_HW_CPU_CYCLES]              = 0x003c,
    [PERF_COUNT_HW_INSTRUCTIONS]            = 0x00c0,
    [PERF_COUNT_HW_CACHE_REFERENCES]        = 0x4f2e,
    [PERF_COUNT_HW_CACHE_MISSES]            = 0x412e,
    ...
}

-准确地0x412e在“表18-1。“ LLC未命中”的UMask和事件选择编码用于预定义的架构性能事件”中找到:

Bit Position CPUID.AH.EBX | Event Name | UMask | Event Select
...
                        4 | LLC Misses | 41H   | 2EH

- H适用于十六进制。所有7都在结构中,再加上[PERF_COUNT_HW_REF_CPU_CYCLES] = 0x0300, /* pseudo-encoding *。(命名有点不同,地址是相同的。)

然后Hardware cache events的结构如下(在同一文件中):

static __initconst const u64 snb_hw_cache_extra_regs
                            [PERF_COUNT_HW_CACHE_MAX]
                            [PERF_COUNT_HW_CACHE_OP_MAX]
                            [PERF_COUNT_HW_CACHE_RESULT_MAX] =
{...}

-沙桥应该是哪个?

其中的一个- snb_hw_cache_extra_regs[LL][OP_WRITE][RESULT_ACCESS]填充为SNB_DMND_WRITE|SNB_L3_ACCESS,其中从上面的def-s开始:

#define SNB_L3_ACCESS           SNB_RESP_ANY
#define SNB_RESP_ANY            (1ULL << 16)                                                                            
#define SNB_DMND_WRITE          (SNB_DMND_RFO|SNB_LLC_RFO)
#define SNB_DMND_RFO            (1ULL << 1)
#define SNB_LLC_RFO             (1ULL << 8)

应该等于0x00010102,但是我不知道如何用某些表检查它。

这给出了一个如何在其中使用的想法perf_events

$ ak hw_cache_extra_regs linux-source-3.13.0/arch/x86/kernel/cpu/
linux-source-3.13.0/arch/x86/kernel/cpu/perf_event.c
50:u64 __read_mostly hw_cache_extra_regs
292:    attr->config1 = hw_cache_extra_regs[cache_type][cache_op][cache_result];

linux-source-3.13.0/arch/x86/kernel/cpu/perf_event.h
521:extern u64 __read_mostly hw_cache_extra_regs

linux-source-3.13.0/arch/x86/kernel/cpu/perf_event_intel.c
272:static __initconst const u64 snb_hw_cache_extra_regs
567:static __initconst const u64 nehalem_hw_cache_extra_regs
915:static __initconst const u64 slm_hw_cache_extra_regs
2364:       memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
2365:              sizeof(hw_cache_extra_regs));
2407:       memcpy(hw_cache_extra_regs, slm_hw_cache_extra_regs,
2408:              sizeof(hw_cache_extra_regs));
2424:       memcpy(hw_cache_extra_regs, nehalem_hw_cache_extra_regs,
2425:              sizeof(hw_cache_extra_regs));
2452:       memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs,
2453:              sizeof(hw_cache_extra_regs));
2483:       memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs,
2484:              sizeof(hw_cache_extra_regs));
2516:       memcpy(hw_cache_extra_regs, snb_hw_cache_extra_regs, sizeof(hw_cache_extra_regs));
$

memcpys的在做__init int intel_pmu_init(void) {... case:...}

只是attr->config1有点奇怪。但是它在perf_event_attr(相同linux-source-3.13.0/include/uapi/linux/perf_event.h文件)中:

...
    union {
            __u64           bp_addr;
            __u64           config1; /* extension of config */                                                      
    };
    union {
            __u64           bp_len;
            __u64           config2; /* extension of config1 */
    };
...

它们在的perf_events系统中注册,并调用int perf_pmu_register(struct pmu *pmu, const char *name, int type)(在中定义linux-source-3.13.0/kernel/events/core.c:):

  • static int __init init_hw_perf_events(void)(文件arch/x86/kernel/cpu/perf_event.c)与通话perf_pmu_register(&pmu, "cpu", PERF_TYPE_RAW);

  • static int __init uncore_pmu_register(struct intel_uncore_pmu *pmu)(文件arch/x86/kernel/cpu/perf_event_intel_uncore.c,也有arch/x86/kernel/cpu/perf_event_amd_uncore.c)与通话ret = perf_pmu_register(&pmu->pmu, pmu->name, -1);

因此,最后,所有事件都来自硬件,一切正常。但在这里人们可以发现:为什么我们LLC-loadsperf list和没有ubox1 LLC-loads,因为这些硬件的事件和他们actualy来自uboxES?

这就是perf实用程序及其perf_evsel结构的事情:当您从请求硬件事件的事件中perf定义所需事件的处理器时(默认为all),并perf_evsel使用请求的事件和处理器设置,然后在聚合时对来自所有处理器的计数器求和perf_evsel(或对其进行一些其他统计)。

可以在tools/perf/builtin-stat.c以下位置看到它:

/*
 * Read out the results of a single counter:
 * aggregate counts across CPUs in system-wide mode
 */
static int read_counter_aggr(struct perf_evsel *counter)
{
    struct perf_stat *ps = counter->priv;
    u64 *count = counter->counts->aggr.values;
    int i;

    if (__perf_evsel__read(counter, perf_evsel__nr_cpus(counter),
                           thread_map__nr(evsel_list->threads), scale) < 0)
            return -1;

    for (i = 0; i < 3; i++)
            update_stats(&ps->res_stats[i], count[i]);

    if (verbose) {
            fprintf(output, "%s: %" PRIu64 " %" PRIu64 " %" PRIu64 "\n",
                    perf_evsel__name(counter), count[0], count[1], count[2]);
    }

    /*
     * Save the full runtime - to allow normalization during printout:
     */
    update_shadow_stats(counter, count);

    return 0;
}

(因此,对于实用程序perf,“单个计数器”甚至不是perf_event_attr,它是通用形式,适合SW和HW事件,它是您查询的事件-相同的事件可能来自不同的设备,并且将它们汇总)

还要注意:struct perf_evsel仅包含1 struct perf_evevent_attr,但它也有一个字段struct perf_evsel *leader;-它是嵌套的。perf_events当您可以将一堆计数器分派在一起时,可以将它们相互比较,等等,这是中的“(事件的(组)事件组)”功能。不知道它是如何工作与独立事件kernelcoreubox。但这perf_evsel就是它的嵌套。而且,这很有可能是perf一起管理多个事件的查询的方式。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.