我试图了解系统范围的分析器的工作原理。我们以 linux perf 为例。对于某个分析时间,它可以提供:
我几乎可以肯定的是,报告只是对实际情况的估计。所以我认为有一些内核模块以一定的采样率启动软件中断。采样率越低,分析器开销越低。中断可以读取存储性能计数器的模型特定寄存器。
下一部分是将计数器与机器上运行的软件相关联。 那是我不理解的部分。
那么探查器从何处获取数据?
您是否可以查询任务计划程序以查明中断他时正在运行的内容?不会影响 执行调度程序(例如,而不是继续执行 中断的功能它只会安排另一个,制作 分析器结果不准确)。 task_struct 对象列表是否可用?
答案 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)。实际上它可以实现为:
-N
,其中N是采样周期(我们希望在N个事件之后中断,例如,在2百万个周期perf record -c 2000000 -e cycles
之后,或者在没有N时计算和调整一些N已设置额外选项或已提供-F
所有现代英特尔芯片都支持此功能,例如,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工具及其内容 写入磁盘。 在后处理中,指针指针与之匹配 二进制文件中的地址,可以转换为函数名称等等