perf的基本使用方法

目录

  • 前言
  • perf的基本使用方法
    • perf list
    • perf stat
    • perf top
    • perf record/perf report
    • perf -e
    • perf probe
    • perf sched
      • perf sched map
      • perf sched script
      • perf sched replay
    • perf lock
    • perf kmem
    • perf timechart
    • perf script
  • 参考文档

前言

Perf 是用来进行软件性能分析的工具,可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计,用来分析内核和应用程序的性能。
perf可以完成如下的性能分析

  • 计算每个时钟周期内的指令数 进行函数级别的采样
  • 了解性能瓶颈 替代strace
  • 添加动态内核 probe 点
  • 做 benchmark 衡量调度器的好坏

perf性能分析需要了解如下背景知识

  • cache 流水线
  • 超标量体系结构
  • 乱序执行
  • 分支预测
  • PMU计数
  • tracepoint

perf的基本使用方法

以下面的实例,说明perf的基本用法

perf list

列出所有能够触发 perf 采样点的事件,主要区分为如下三类事件:

Task-clock-msecs:CPU 利用率,该值高,说明程序的多数时间花费在 CPU 计算上而非 IO。
Context-switches:进程切换次数,记录了程序运行过程中发生了多少次进程切换,频繁的进程切换是应该避免的。
Cache-misses:程序运行过程中总体的 cache 利用情况,如果该值过高,说明程序的 cache 利用不好
CPU-migrations:表示进程 t1 运行过程中发生了多少次 CPU 迁移,即被调度器从一个 CPU 转移到另外一个 CPU 上运行。
Cycles:处理器时钟,一条机器指令可能需要多个 cycles,
Instructions: 机器指令数目。
IPC:是 Instructions/Cycles 的比值,该值越大越好,说明程序充分利用了处理器的特性。
Cache-references: cache 命中的次数
Cache-misses: cache 失效的次数。
注:通过指定 -e 选项,您可以改变 perf stat 的缺省事件

perf top

用于实时显示当前系统的性能统计信息。该命令主要用来观察整个系统当前的状态,比如可以通过查看该命令的输出来查看当前系统最耗时的内核函数或某个用户进程

可以查看到热点为main函数
使用-g选项可以查看到具体某个函数所花费的时间以及函数的调用路径:

root@VM-0-9-ubuntu:~# perf record -e raw_syscalls:sys_enter ls
root@VM-0-9-ubuntu:~# perf report

查看系统调用主要发生在哪里

perf sched map

显示了所有的CPU和上下文切换事件

可以查看schedule的trace

perf sched replay

这个工具更是专门为调度器开发人员所设计,它试图重放 perf.data 文件中所记录的调度场景
perf sched replay采集记录的调度器事件,通过生成具有类似运行时间和上下文切换的线程来模拟工作负载。
root@VM-0-9-ubuntu:/home/ubuntu/test# perf sched replay -r 1

perf lock

锁是内核同步的方法,一旦加了锁,其他准备加锁的内核执行路径就必须等待,降低了并行。因此对于锁进行专门分析应该是调优的一项重要工作

该 告有三个部分:
1.根据 Callsite 显示的部分
Callsite: 即内核代码中调用 kmalloc 和 kfree 的地方。比如上图中的函数 __sigqueue_alloc
Hit:表示调用kmalloc的次数,为 1表示该函数在 record 期间一共调用了 kmalloc 一次
Total_alloc/Per :显示为 160/160,第一个值 160表示函数 __sigqueue_alloc总共分配的内存大小,Per 表示平均值。
Frag :内部碎片的比例。虽然相对于 Buddy System,Slab 正是要解决内部碎片问题,但 slab 依然存在内部碎片,比如一个 cache 的大小为 1024,但需要分配的数据结构大小为 1022,那么有 2 个字节成为碎片。Frag 即碎片的比例。
Ping-pong :是一种现象,在多 CPU 系统中,多个 CPU 共享的内存会出现”乒乓现象”。一个 CPU 分配内存,其他 CPU 可能访问该内存对象,也可能最终由另外一个 CPU 释放该内存对象。而在多 CPU 系统中,L1 cache 是 per CPU 的,CPU2 修改了内存,那么其他的 CPU 的 cache 都必须更新,这对于性能是一个损失。Perf kmem 在 kfree 事件中判断 CPU ,如果和 kmalloc 时的不同,则视为一次 ping-pong,理想的情况下 ping-pone 越小越好。Ibm developerworks 上有一篇讲述 oprofile 的文章,其中关于 cache 的调优可以作为很好的参考资料。
2.根据被调用地点显示部分
3.汇总数据
显示总的分配的内存和碎片情况,Cross CPU allocation 即 ping-pong 的汇总

注:Perf kmem 和 perf lock 实际上都是 perf tracepoint 的特例,您也完全可以用 Perf record > – e kmem:* 或者 perf record – e lock:*> 来完成同样的功能。但重要的是,这些工具在内部对原始数据进行了汇总和分析,因而能够产生信息更加明确更加有用的统计 表。

perf timechart

上图的最上面一行是图例,蓝色表示忙碌,红色表示 idle,灰色表示等待,等等。接下来是 per-cpu 信息,再下面是 per-process 信息.Timechart 可以显示更详细的信息,上图实际上是一个矢量图形 SVG 格式,用 SVG viewer 的放大功能,我们可以将该图的细节部分放大,timechart 的设计理念叫做”infinitely zoomable”。放大之后便可以看到一些更详细的信息,类似 上的 google 地图,找到国家之后,可以放大,看城市的分布,再放大,可以看到某个城市的街道分布,还可以放大以便得到更加详细的信息。

perf script

Tom Zanussi 将 perl 和 python 解析器嵌入到 perf 程序中,从而使得 perf 能够自动执行 perl 或者 python 脚本进一步进行处理,从而为 perf 提供了强大的扩展能力。因为任何人都可以编写新的脚本,对 perf 的原始输出数据进行所需要的进一步处理。这个特性所带来的好处很类似于 plug-in 之于 eclipse

参考文档

1.Perf – Linux下的系统性能调优工具,第 1 部分
2.Perf – Linux下的系统性能调优工具,第 2 部分
3.perf Examples
4.Linux性能分析工具Perf简介
5.系统级性能分析工具perf的介绍与使用
6.CHAPTER 12. GETTING STARTED WITH PERF
7.Documentation/tools/perf/perf-probe.txt
8.Documentation/tools/perf/perf-lock.txt

声明:本站部分文章及图片源自用户投稿,如本站任何资料有侵权请您尽早请联系jinwei@zod.com.cn进行处理,非常感谢!

上一篇 2020年9月25日
下一篇 2020年9月25日

相关推荐