概述

perf是一款Linux性能分析工具。Linux性能计数器是一个新的基于内核的子系统,它提供一个性能分析框架,比如硬件(CPUPMU(Performance Monitoring Unit))功能和软件(软件计数器tracepoint)功能。通过perf,应用程序可以利用PMUtracepoint和内核中的计数器来进行性能统计。它不但可以分析制定应用程序的性能问题(per thread),也可以用来分析内核的性能问题。

调优方向

  • Hardware EventPMU部件产生,在特定的条件下探测性能事件是否发生以及发生的次数。比如cache命中。
  • Software Event是内核产生的事件,分布在各个功能模块中,统计和操作系统相关性能事件。比如进程切换,tick数等。
  • Tracepoint Event是内核中静态tracepoint所触发的事件,这些tracepoint用来判断程序运行期间内核的行为细节(这些tracepint的对应的sysfs节点在/sys/kernel/debug/tracing/events目录下)。比如slab分配器的分配次数等。

perf 使用

序号 命令 作用
1 annotate 解析perf record生成的perf.data文件,显示被注释的代码。
2 archive 根据数据文件记录的build-id,将所有被采样到的elf文件打包。利用此压缩包,可以再任何机器上分析数据文件中记录的采样数据。
3 bench perf中内置的benchmark,目前包括两套针对调度器和内存管理子系统的benchmark。
4 buildid-cache 管理perf的buildid缓存,每个elf文件都有一个独一无二的buildid。buildid被perf用来关联性能数据与elf文件。
5 buildid-list 列出数据文件中记录的所有buildid。
6 diff 对比两个数据文件的差异。能够给出每个符号(函数)在热点分析上的具体差异。
7 evlist 列出数据文件perf.data中所有性能事件。
8 inject 该工具读取perf record工具记录的事件流,并将其定向到标准输出。在被分析代码中的任何一点,都可以向事件流中注入其它事件。
9 kmem 针对内核内存(slab)子系统进行追踪测量的工具。
10 kvm 用来追踪测试运行在KVM虚拟机上的Guest OS。
11 list 列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。
12 lock 分析内核中的锁信息,包括锁的争用情况,等待延迟等。
13 mem 内存存取情况
14 record 收集采样信息,并将其记录在数据文件中。随后可通过其它工具对数据文件进行分析。
15 report 读取perf record创建的数据文件,并给出热点分析结果。
16 sched 针对调度器子系统的分析工具。
17 stat 执行某个命令,收集特定进程的性能概况,包括CPI、Cache丢失率等。
18 test perf对当前软硬件平台进行健全性测试,可用此工具测试当前的软硬件平台是否能支持perf的所有功能。
19 timechart 针对测试期间系统行为进行可视化的工具
20 top 类似于linux的top命令,对系统性能进行实时分析。
21 trace 关于syscall的工具。
22 probe 用于定义动态检查点。

全局性概况

  • perf list: 查看当前系统支持的性能事件;
  • perf bench: 对系统性能进行摸底;
  • perf test: 对系统进行健全性测试;
  • perf stat: 对全局性能进行统计;

    全局细节

  • perf top: 可以实时查看当前系统进程函数占用率情况;

  • perf probe: 可以自定义动态事件;

    特定功能分析

  • perf kmem: 针对slab子系统性能分析;

  • perf kvm: 针对kvm虚拟化分析;
  • perf lock: 分析锁性能;
  • perf mem: 分析内存slab性能;
  • perf sched: 分析内核调度器性能;
  • perf trace: 记录系统调用轨迹;

常用命令

  1. # 监控系统中所有的进程(包含隐藏进程)
  2. perf top -s comm,pid
  3. # 按照进程的压力从大到小排序
  4. perf top --sort comm,dso
  5. # 查看某个进程的详细信息
  6. perf top -p 20001