VAn*_*rei 5 optimization performance profiling operating-system linux-kernel
我试图了解系统范围的分析器是如何工作的.我们以linux perf为例.对于某个分析时间,它可以提供:
我几乎可以肯定的是,报告只是对实际情况的估计.所以我认为有一些内核模块以一定的采样率启动软件中断.采样率越低,分析器开销越低.中断可以读取存储性能计数器的模型特定寄存器.
下一部分是将计数器与机器上运行的软件相关联.这是我不理解的部分.
那么探查器从何处获取数据?
您是否可以查询任务计划程序以查明中断他时正在运行的内容?这不会影响调度程序的执行(例如,不是继续中断的函数,而是只调度另一个,使得分析器结果不准确).task_struct对象列表是否可用?
所以我认为有一些内核模块以一定的采样率启动软件中断.
Perf不是模块,它是Linux内核的一部分,在kernel/events/core.c中实现, 并且适用于每个支持的体系结构和cpu模型,例如arch/x86/kernel/cpu/perf_event*.c.但Oprofile是一个模块,具有类似的方法.
Perf通常要求CPU的PMU(性能监视单元)在某些硬件性能计数器的N次事件之后产生中断(Yokohama,幻灯片5 " •达到阈值时中断:允许采样 ").实际上它可以实现为:
-N,其中N是采样周期(我们希望在N个事件之后中断,例如,在2百万个周期之后perf record -c 2000000 -e cycles,或者当没有设置或-F给出额外选项时由perf计算和调整一些N )所有现代英特尔芯片均支持此功能,例如Nehalem:https://software.intel.com/sites/default/files/76/87/30320 - Nehalem性能监控单元编程指南
EBS - 基于事件的抽样.一种技术,其中计数器预加载了大的负计数,并且它们被配置为在溢出时中断处理器.当计数器溢出中断服务程序时捕获分析数据.
因此,当您使用硬件PMU时,定时器中断没有额外的工作,特殊读取硬件PMU计数器.在任务切换时有一些工作要保存/恢复PMU状态,但是(*_sched_in/ *_sched_outkernel/events/core.c)不会更改PMU计数器值,也不会将其导出到用户空间.
有一个处理程序:arch/x86/kernel/cpu/perf_event.c: x86_pmu_handle_irq它找到溢出的计数器并调用 perf_sample_data_init(&data, 0, event->hw.last_period);记录当前时间,最后执行的命令的IP(由于大多数英特尔微体系结构的无序性,它可能是不精确的,某些事件的解决方法有限 - PEBS ,perf record -e cycles:pp),stacktrace(如果-g在记录中使用)等.然后处理程序将计数器值重置为-N(x86_perf_event_set_period,wrmsrl(hwc->event_base, (u64)(-left) & x86_pmu.cntval_mask);- 注意之前的减号left)
采样率越低,分析器开销越低.
Perf允许您使用-F选项设置目标采样率,-F 1000意味着大约1000 irq/s.由于高开销,不建议使用高费率.十年前,英特尔VTune推荐不超过1000 irq/s(www.cs.utah.edu/~mhall/cs4961f09/VTune-1.pdf" 尝试每个逻辑CPU每秒获得大约1000个样本. "),性能通常不允许非root的高速率(当"执行中断花费太长时间时自动调低到较低速率" - 检查你的dmesg; sysctl -a|grep perf例如检查kernel.perf_cpu_time_max_percent=25- 这意味着perf将尝试使用不超过25% CPU)
您是否可以查询任务计划程序以查明中断他时正在运行的内容?
不可以.但您可以在sched_switch或其他sched事件中启用tracepoint(列出所有sched中可用的:) perf list 'sched:*',并将其用作perf的分析事件.您甚至可以要求perf在此跟踪点记录堆栈跟踪:
perf record -a -g -e "sched:sched_switch" sleep 10
Run Code Online (Sandbox Code Playgroud)
这不会影响调度程序的执行
启用跟踪点将使用tracepoint向函数添加一些perf事件采样工作
task_struct对象列表是否可用?只能通过ftrace ...
有关上下文切换的信息
这是软件PERF事件,只是打电话perf_sw_event与PERF_COUNT_SW_CONTEXT_SWITCHES从SCHED/core.c(间接)事件.直接调用示例 - 迁移软件事件:kernel/sched/core.c set_task_cpu():p->se.nr_migrations++; perf_sw_event(PERF_COUNT_SW_CPU_MIGRATIONS, 1, NULL, 0);
PS:Gregg在Linux上的perf,ftrace和其他分析和跟踪子系统上有很好的幻灯片:http://www.brendangregg.com/linuxperf.html
这几乎回答了您的所有三个问题。
分析由两种类型组成:计数和抽样。计数测量整个执行过程中事件的总数,但不提供有关生成事件的指令或函数的任何信息。另一方面,采样通过捕获的指令指针样本给出事件与代码的相关性。采样时,内核指示处理器在所选事件计数器超过阈值时发出中断。该中断被内核捕获,并且包括指令指针值的采样数据被存储到环形缓冲区中。用户空间性能工具定期轮询缓冲区并将其内容写入磁盘。在后处理中,指令指针与二进制文件中的地址相匹配,可以将其转换为函数名称等
| 归档时间: |
|
| 查看次数: |
1931 次 |
| 最近记录: |