性能分析工具(二)——perf

@(性能分析)

1. 简介

  • perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPU、PMU(Performance Monitoring Unit))功能和软件(软件计数器、tracepoint)功能。
  • 通过perf,应用程序可以利用PMU、tracepoint和内核中的计数器来进行性能统计。它不但可以分析制定应用程序的性能问题(per thread),也可以用来分析内核的性能问题,当然也可以同事分析应用程序和内核,从而全面理解应用程序中的性能瓶颈。
  • 使用perf,可以分析程序运行期间发生的硬件事件,比如instructions retired、processor clock cycles等;也可以分析软件时间,比如page fault和进程切换。
  • perf是一款综合性分析工具,大到系统全局性性能,再小到进程线程级别,甚至到函数及汇编级别。

    2. 背景知识

    2.1 tracepoint

    tracepoints是散落在内核源码中的一些hook,它们可以在特定的代码被执行到时触发,这一特定可以被各种trace/debug工具所使用。perf将tracepoint产生的时间记录下来,生成报告,通过分析这些报告,便可以了解程序运行期间内核的各种细节,对性能症状做出准确的诊断。这些tracepoint的对应的sysfs节点在/sys/kernel/debug/tracing/events目录下。

    2.2 硬件特性之cache

    内存读写是很快的,但是还是无法和处理器指令执行速度相比。为了从内存中读取指令和数据,处理器需要等待,用处理器时间来衡量,这种等待非常漫长。cache是一种SRAM,读写速度非常快,能和处理器相匹配。因此将常用的数据保存在cache中,处理器便无需等待,从而提高性能。cache的尺寸一般都很小,充分利用cache是软件调优非常重要部分。

3. 主要关注点

基于性能分析,可以进行算法优化(空间复杂度和时间复杂度权衡)、代码优化(提高执行速度、减少内存占用)。
评估程序对硬件资源的使用情况,例如各级cache的访问次数、各级cache的丢失次数、流水线停顿周期、前端总线访问次数等。
评估程序对操作系统资源的使用情况,系统调用次数、上下文切换次数、任务迁移次数。

事件可以分为三种:
Hardware Event由PMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。
Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,tick数等。
Tracepoint Event是内核中静态tracepoint所触发的事件,这些tracepoint用来判断程序运行期间内核的行为细节,比如slab分配器的分配次数等。

4. 利用Perf工具生成火焰图分析Mysql性能

4.1 火焰图

火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有“平顶”plateaus,就表示该函数可能存在性能问题。
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。

4.2 应用

性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果;

  1. 利用perf监控mysqld, 生成perf.data文件(注意生成后的perf.data的权限,需要w权限来进行后面的解析)

    1
    2
    3
    4
    5
    sudo perf record -e cpu-clock -g -p [pid]

    #-g 说明perf record额外记录函数的调用关系
    #-e cpu-clock 指perf record监控的指标为cpu周期
    #-p 指定需要record的进程pid
  2. 用perf script工具对perf.data进行解析

1
2
perf script -i perf.data &> perf.unfold
#解析后的data输出到未折叠的perf
  1. 将perf.unfold中的符号进行折叠:(利用github上的FlameGraph项目中的包)

    1
    ./stackcollapse-perf.pl perf.unfold &> perf.folded
  2. 最后生成svg图:

    1
    ./flamegraph.pl perf.folded > perf.svg

Alt text

宽顶代表性能瓶颈的地方,占cpu时间比例较高。点击svg图片的每一层能够看到内部调用关系。