Perf介绍

  • Perf简介

Perf是内置于Linux内核源码树中的性能剖析工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。可用于性能瓶颈的查找与热点代码的定位。 Perf统计的事件包括:硬件性能事件和软件性能事件。硬件性能事件主要借助于CPU内部的PMU进行统计,龙芯处理器的硬件性能事件主要包括:CPU周期、分支指令、TLB重填例外、Cache缺失等。软件性能事件内置于kernel各个功能模块,用于统计与操作系统相关的性能事件,主要包括:系统调用次数、上下文切换次数、任务迁移次数、缺页例外次数等。

  • Perf原理

Perf通过系统调用sys_perf_event_open 陷入到内核中,内核根据perf 提供的信息在PMU(Performance Monitoring Unit)上初始化一个硬件性能计数器(PMC: Performance Monitoring Counter)。PMC随着指定硬件事件的发生而自动累加。在PMC 溢出时,PMU 触发一个PMI(Performance Monitoring Interrupt)中断。内核在PMI 中断的处理函数中保存PMC 的计数值,触发中断时的指令地址,当前时间戳以及当前进程的PID,TID,comm 等信息。我们把这些信息统称为一个采样(sample)。内核会将收集到的sample 放入用于跟用户空间通信的Ring Buffer。用户空间里的perf 分析程序采用mmap 机制从ring buffer 中读入采样,并对其解析。如图所示:
perf原理

PERF安装说明

Perf是内置于Linux内核源码树中的性能剖析工具。目前,龙芯linux-2.6.32-el6内核对perf提供了支持,下载龙芯linux-2.6.32-el6内核源代码后,进入到tools/perf 目录,运行以下两个命令即能完成安装:

1.make –j4
2.sudo ln ./perf /usr/bin

龙芯PERF教程

  • perf包含22种子工具,以下是最常用的5种:
perf list:      查看当前软硬件环境支持的性能事件
perf stat:      分析指定程序的性能概况
perf top:       实时显示系统/进程的性能统计信息
perf record:    记录一段时间内系统/进程的性能事件
perf report:    读取perf record生成的perf.data文件,并显示分析数据
  • perf list列出当前软硬件环境支持的所有性能事件。 包括hardware event、software event、Hardware cache event 、tracepoint event。
  • Loongson3A2000提供了340多个硬件事件,包括FETCH、RMAP、ROQ、FIX、FLOAT、MEMORY、CACHE2MEM共7个模块,详见处理器用户手册。

perflist

  • perf stat分析程序的整体性能,默认事件包括task-clock、context-switch、CPU-migrations、page-faults 4个software event和cycles、instructions、branches、branch-misses 4个hardware event。

perfstat

  • perf stat默认事件简介:
task-clock:任务真正占用的处理器时间,单位为ms。CPUs utilized = task-clock / time elapsed,CPU的占用率,值高,说明程序的多数时间花费在CPU计算上而非IO。
context-switches:上下文的切换次数。
CPU-migrations:处理器迁移次数。Linux为了维持多个处理器的负载均衡,在特定条件下会将某个任务从一个CPU迁移到另一个CPU。
page-faults:缺页异常的次数。当应用程序请求的页面尚未建立、请求的页面不在内存中,或者请求的页面虽然在内存中,但物理地址和虚拟地址的映射关系尚未建立时,都会触发一次缺页异常。另外TLB不命中,页面访问权限不匹配等情况也会触发缺页异常。
cycles:消耗的处理器周期数。
instructions:执行了多少条指令。IPC为平均每个cpu cycle执行了多少条
branches:遇到的分支指令数。
branch-misses:预测错误的分支指令数。
  • perf stat常用参数
-e:指定性能事件。可用-e同时指定最多4个硬件事件,如:
	$ perf stat -e cycles -e instructions -e Tlb-exceptions -e Icache-misses ./a.out
	已知LS3A2K的硬件事件cycles的事件号为128(0x80),也可采用
	-e r[event_id]的方式:$ perf stat -e r80 ./a.out
-p:指定待分析进程的PID
-t:指定待分析线程的TID
-r:重复执行命令求平均,如重复执行3次求平均:$ perf stat -r 3 ./a.out
  • perf top对于一个指定的性能事件(默认cycles),实时显示其函数或指令的热度。其输出如图所示:

perftop

第一列:符号引发的性能事件的比例,默认指占用的cpu周期比例。
第二列:符号所在的DSO(Dynamic Shared Object),可以是应用程序、内核、动态链接库、内核模块。
第三列:DSO的类型。[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态链接库)。[k]表述此符号属于内核或内核模块。
第四列:符号名。有些符号不能解析为函数名,只能用地址表示。
  • perf top常用交互命令:
h:显示帮助。
UP/DOWN/PGUP/PGDN/SPACE:上下和翻页。
a:annotate current symbol,注解当前符号。annotate将性能分析细化到指令。能够给出汇编语言的注解,给出各条指令的采样率。源代码编译时指定选项 -g,生成供gdb调试用的可执行文件,同时perf top的annotate可显示源代码和汇编代码的对应。如图所示。
d:过滤掉所有不属于此DSO的符号。非常方便查看同一类别的符号。
P:将当前信息保存到perf.hist.N中。

perfcommand

  • perf top常用命令行参数:
-e <event>:指明要分析的性能事件。
-p <pid>:仅分析目标进程及其创建的线程。
-k <path>:带符号表的内核映像所在的路径。
-K:不显示属于内核或模块的符号。
-U:不显示属于用户态程序的符号。
-d <n>:界面的刷新周期,默认为2s。
-G:得到函数的调用关系图。
  • perf record收集采样信息,并将其记录在数据文件中, 默认在当前目录下生成数据文件:perf.data。随后可以通过perf report对数据文件进行分析,结果类似于perf top。
  • 使用例子:$ perf record -e instructions ./a.out
  • perf record常用命令行参数:
-e: 指定性能事件(默认事件:cycles)
-p: 指定待分析进程的PID
-t: 指定待分析线程的TID
-a: 分析整个系统的性能(Default)
-c: 事件的采样周期
-o: 指定输出文件(Default: perf.data)
-g: 记录函数间的调用关系
-r <priority>: 将perf top作为实时任务,优先级为<priority>
-u <uid>: 只分析用户<uid>创建的进程
  • perf report读取perf record创建的数据文件,并给出热点分析结果。
注意:源代码编译时指定选项 -g,生成供gdb调试用的可执行文件,同时perf report的annotate可显示源代码和汇编代码的对应。
常用参数 -i:Input file name (default: perf.data)。
使用例子 ①$ perf report ②$ perf report -i perf.data.old
本页面最后修改于2016年7月21日 (星期四) 09:44。

© 2018 by 龙芯开源社区 • Powered by MediaWiki
京ICP备14017781号