系统范围的分析器(例如perf)如何将计数器与指令相关联?

时间:2015-02-22 18:16:02

标签: performance optimization linux-kernel operating-system profiling

我试图了解系统范围的分析器的工作原理。我们以 linux perf 为例。对于某个分析时间,它可以提供:

  • 各种聚合的软件性能计数器
  • 每个用户空间进程和内核空间函数花费的时间和硬件计数器(例如#instructions)
  • 有关上下文切换的信息

我几乎可以肯定的是,报告只是对实际情况的估计。所以我认为有一些内核模块以一定的采样率启动软件中断。采样率越低,分析器开销越低。中断可以读取存储性能计数器的模型特定寄存器。

下一部分是将计数器与机器上运行的软件相关联。 那是我不理解的部分

  1. 那么探查器从何处获取数据?

  2. 您是否可以查询任务计划程序以查明中断他时正在运行的内容?不会影响 执行调度程序(例如,而不是继续执行 中断的功能它只会安排另一个,制作 分析器结果不准确)。 task_struct 对象列表是否可用?

  3. 分析器如何甚至关联硬件 甚至在教学水平上的指标?

2 个答案:

答案 0 :(得分:8)

  

所以我认为有一些内核模块以一定的采样率启动软件中断。

Perf不是模块,它是Linux内核的一部分,实现于 kernel/events/core.c以及每个支持的体系结构和cpu模型,例如arch/x86/kernel/cpu/perf_event*.c。但Oprofile是一个模块,具有类似的方法。

Perf通常要求CPU的PMU(性能监视单元)在某些硬件性能计数器(Yokohama, slide 5" 的N个事件后生成中断时•达到阈值时中断:允许采样&#34)。实际上它可以实现为:

  • 选择一些PMU计数器
  • 将其初始化为-N,其中N是采样周期(我们希望在N个事件之后中断,例如,在2百万个周期perf record -c 2000000 -e cycles之后,或者在没有N时计算和调整一些N已设置额外选项或已提供-F
  • 将此计数器设置为想要的事件,并要求PMU在溢出时生成中断(ARCH_PERFMON_EVENTSEL_INT)。它将在我们的计数器增加N之后发生。

所有现代英特尔芯片都支持此功能,例如,Nehalem:https://software.intel.com/sites/default/files/76/87/30320 - Nehalem性能监控单元编程指南

  

EBS - 基于事件的抽样。一种技术,其中计数器预加载了大的负计数,并且它们被配置为在溢出时中断处理器。当计数器溢出中断服务程序时捕获分析数据。

因此,当您使用硬件PMU时,定时器中断没有额外的工作,特殊读取硬件PMU计数器。在任务切换时有一些工作要保存/恢复PMU状态,但是(*_sched_in / *_sched_out kernel / events / core.c)不会更改PMU计数器值,也不会将其导出到用户 - 空间。

有一个处理程序:arch/x86/kernel/cpu/perf_event.c: x86_pmu_handle_irq找到溢出的计数器,calls perf_sample_data_init(&data, 0, event->hw.last_period);来记录当前时间,最后执行的命令的IP(由于out-of,它可能是不精确的大多数英特尔微架构的性质,某些事件的解决方法有限 - PEBS,perf record -e cycles:pp),堆栈跟踪(如果在记录中使用-g),等等。然后处理程序将计数器值重置为{ {1}}(x86_perf_event_set_period,-N - 请注意wrmsrl(hwc->event_base, (u64)(-left) & x86_pmu.cntval_mask);之前的减号

  

采样率越低,探查器开销越低。

Perf允许您使用left选项设置目标采样率,-F表示大约1000 irq / s。由于高开销,不建议使用高费率。十年前,英特尔VTune推荐不超过1000 irq / s(www.cs.utah.edu/~mhall/cs4961f09/VTune-1.pdf" 尝试每个逻辑每秒获得大约1000个样本CPU。"),性能通常不允许非root用户的高速率(当&#34时自动调低到较低的速率;性能中断耗时太长" - 检查你的dmesg ;还要检查-F 1000,例如sysctl -a|grep perf - 这意味着perf将尝试使用不超过25%的CPU)

  

您是否可以查询任务计划程序以查明中断他时正在运行的内容?

没有。但是您可以在sched_switch或其他sched事件中启用tracepoint(列出所有可用于sched:kernel.perf_cpu_time_max_percent=25),并将其用作perf的分析事件。您甚至可以要求perf在此跟踪点记录堆栈跟踪:

perf list 'sched:*'
  

不会影响调度程序的执行

启用跟踪点将使用跟踪点

向函数添加一些perf事件采样工作
  

task_struct对象列表是否可用?   只能通过ftrace ...

     

有关上下文切换的信息

这是软件性能事件,只需使用sched / core.c中的 perf record -a -g -e "sched:sched_switch" sleep 10 事件(间接)调用perf_sw_event。直接呼叫 - 迁移软件事件的示例:kernel/sched/core.c set_task_cpu()PERF_COUNT_SW_CONTEXT_SWITCHES

PS:Gregg对Linux中的perf,ftrace和其他分析和跟踪子系统有很好的幻灯片:http://www.brendangregg.com/linuxperf.html

答案 1 :(得分:2)

这几乎是你所有三个问题的答案。

概要分析有两种类型:计数和抽样。计数措施 总体 数 整个执行期间的事件没有提供任何见解 关于 该 指令或功能 产生 他们 。上 另一方面, 抽样给出了相关性 代码的事件 通过捕获的指令指针样本 。 抽样时, 内核指示处理器发出中断时 选择的 事件计数器超过a 阈。 Ť 他的中断被内核和采样数据捕获 包括指令 指针 值存储在环形缓冲区中。用户空间定期轮询缓冲区 perf工具及其内容 写入磁盘。 在后处理中,指针指针与之匹配 二进制文件中的地址,可以转换为函数名称等等

参考http://openlab.web.cern.ch/sites/openlab.web.cern.ch/files/technical_documents/TheOverheadOfProfilingUsingPMUhardwareCounters.pdf