一、Perf简介:

1、系统级性能优化通常包括两个阶段:性能剖析(performance profiling)和代码优化。性能剖析的目标是寻找性能瓶颈,查找引发性能问题的原因及热点代码。代码优化的目标是针对具体性能问题而优化代码或编译选项,以改善软件性能。本篇主要讲性能分析中常用的工具——perf。

2、Perf的原理:

(1)Perf是内置于Linux内核源码树中的性能剖析(profiling)工具。它基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析。常用于性能瓶颈的查找与热点代码的定位。
(2)通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。
(3)使用 perf可以分析程序运行期间发生的硬件事件,比如 cache miss等;也可以分析软件事件,比如 page fault 和进程切换。

上述部分名词介绍:

1)PMU:性能监控单元(Performance Monitor Unit), CPU提供的一个性能监视单元,用于统计CPU性能数据;
2)Tracepoint:散落在内核源代码中的一些 hook,它们可以在特定的代码被运行到时被触发,这一特性可以被各种 trace/debug 工具所使用。
3)内核运行状态计数,例如:  1) 进程切换   2) Page fault   3) 中断计数

3、Perf安装:

自己网上搜就好了,一般都是内置在linux内核源码的tool目录下的。一般如下是可以的:

sudo apt-get install linux-source

cd /usr/src

cd tools/perf

make && make install

二、Perf命令:

注意:有些命令必须在root用户下才可以执行,或起作用。

1、 perf --version

查看perf当前版本;

2、perf --help

查看帮助文档,即可用指令;

3、perf list

使用perf list命令可以列出所有能够触发perf采样点的事件。

(1)不同的系统会列出不同的结果该列表很。但是按照事件类型都可以归为以下三类:

1)Hardware Event:由PMU硬件产生的事件,比如cache命中;

2)Software Event:内核软件产生的事件,比如进程切换;

3)Trachpoint Event:内核中的静态 tracepoint 所触发的事件,这些 tracepoint 用来判断程序运行期间内核的行为细节,比如 slab 分配器的分配次数等。

(2)同时还可以显示特定模块支持的perf事件:hw/cache/pmu都是硬件相关的;tracepoint基于内核的ftrace;sw实际上是内核计数器。

1)hw/hardware显示支持的硬件事件相关,如: perf list hardware

2)sw/software显示支持的软件事件列表: perf list sw

3)cache/hwcache显示硬件cache相关事件列表: perf list cache

4)pmu显示支持的PMU事件列表: perf list pmu  
5) tracepoint显示支持的所有tracepoint列表,这个列表就比较庞大: perf list tracepoint

4、perf top

实时的观察下CPU时间的花费情况。如下图:

5、perf stat

启动应用程序并分析该程序完整生命周期的性能状况。虽然perf top也可以指定pid,但是对于perf top而言必须先启动应用才能查看信息。perf stat能够运行指令,并且能完整统计应用整个生命周期的信息。

6、perf record

收集采样信息,并将其记录在一个文档里(默认是perf.data),随后可用于perf report对数据文件进行分析。例如:

perf record -F 99 -p 13204 -g -- sleep 30

perf record表示记录,-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒。另外perf record常用选项如下:

-e record指定PMU事件--filter  event事件过滤器
-a  录取所有CPU的事件
-p  录取指定pid进程的事件
-o  指定录取保存数据的文件名
-g  使能函数调用图功能
-C 录取指定CPU的事件

7、perf report

读取perf record创建的文件,并给出热点分析结果

更多指令,以及这些指令的详细介绍参见

Perf-Linux性能测试工具_coding乐园-CSDN博客_linux perf

系统级性能分析工具perf的介绍与使用 - ArnoldLu - 博客园

三、火焰图:

(1)火焰图简介:火焰图(Flame Graph)是由Linux性能优化大师Brendan Gregg发明的,Flame Graph以一个全局的视野来看待时间分布,它从底部往顶部,列出所有可能的调用栈。其他的呈现方法,一般只能列出单一的调用栈或者非层次化的时间分布。

(2)火焰图含义:

1)y 轴表示调用栈, 每一层都是一个函数. 调用栈越深, 火焰就越高, 顶部就是正在执行的函数, 下方都是它的父函数.

2)x 轴表示抽样数, 如果一个函数在 x 轴占据的宽度越宽, 就表示它被抽到的次数多, 即执行的时间长. 注意, x 轴不代表时间, 而是所有的调用栈合并后, 按字母顺序排列的。

3)火焰图就是看顶层的哪个函数占据的宽度最大. 只要有 “平顶”(plateaus), 就表示该函数可能存在性能问题。

4)颜色没有特殊含义, 因为火焰图表示的是 CPU 的繁忙程度, 所以一般选择暖色调.

(3)互动性:火焰图是基于 stack 信息生成的 SVG 图片, 用来展示 CPU 的调用栈,可以与用户互动。

(4)访达查看:点击某一层,火焰图会水平放大,该层占据所有宽度,显示详细信息。此时左上角会显示”reset zoom“,点击后图片就会恢复当原样。

(5)搜索:按下Ctrl+f会显示一个搜索框,用户可以输入关键词过着正则表达式,符合条件的函数会高亮显示。

四、生成火焰图的实例

1、下载工具FlameGraph:

链接 GitHub - brendangregg/FlameGraph: Stack trace visualizer 。我们主要是用到其中的几个文件。

2、记录数据(perf record指令):

perf record -F 99 -p 16637 -g -- sleep 30  #记录数据

此处-F 99表示一秒采样99此;

对-p 16637表示对进程16637进行记录,这个进程号是需要你实现选取的;

sleep 30表示采样的时间是30s;

执行完成后会生成perf.data文件,如下:

3、用perf script工具对perf.data进行解析
perf script > out.perf

执行完成后生成out.perf文件,如下:

4、折叠调用栈(用到FlameGraph中的stackcollapse-perf.pl文件):
./FlameGraph-master/stackcollapse-perf.pl out.perf > out.folded

执行后生成out.folded文件,如下:

5、生成火焰图(用到FlameGraph中的flamegraph.pl文件):
./FlameGraph-master/flamegraph.pl out.folded > perf.svg

执行后生成perf.svr文件,这个就是我们想要的火焰图了。

6、把这个perf.svg文件sz到本地,如下图。用浏览器打开后就是我们看到的火焰图了。

四、其他应用实例

1、查找时间上的热点函数

(1)测试代码如下:

#include <iostream>
#include <vector>using namespace std;void longa()
{int i,j;for(i = 0; i < 1000000; i++)j=i;
}void foo2()
{int i;for(i=0 ; i < 10; i++)longa();
}void foo1()
{int i;for(i = 0; i< 100; i++)longa();
}int main(void)
{foo1();foo2();
}

(2)编译代码  g++ test.cpp -o test

(3)开始记录  perf record -g -e cpu-clock ./test

(4)查看统计结果  perf report

(5)结果如下图所示:

性能分析工具Linux perf使用经验相关推荐

  1. linux性能分析工具:perf入门一页纸

    软件开发中程序运行一段时间出现2类问题最头疼: 1.突然崩溃(调试问题) Windows:可以用WinDbg分析core dump文件,使用应用程序验证器(appverif.exe)对程序进行全面检查 ...

  2. 【ceph】ceph性能分析工具之perf dump代码打点调试统计PerfCounters

    目录 简介 一.查ceph自带的统计 1 命令格式 2 dump 命令输出结果 二.自己添加统计 三.分析案例 io耗时初分析 继续分析 进一步分析 代码修改和验证 四.报错记录 五.附录 1.代码修 ...

  3. 【ceph】ceph性能分析工具之perf dump代码打点调试统计

    目录 简介 一.查ceph自带的统计 1 命令格式 2 dump 命令输出结果 二.自己添加统计 三.分析案例 io耗时初分析 继续分析 进一步分析 代码修改和验证 四.报错记录 五.附录 1.代码修 ...

  4. C++ 性能分析工具调研

    文章目录 0. 前言 1. gprof 3. valgrind 4. gperftools 5. perf 0. 前言 目标:性能分析(profile)包含的内容特别多,但目前我只关注运行时间. 详细 ...

  5. linux 解析pdf下载工具,Linux高级系统级性能分析工具-perf.pdf

    Linux高级系统级性能分析工具-perf Linux 的系统级性能剖析工具‐perf (二) 承刚 TAOBAO  Kernel Team chenggang.qin@ 第三章  Perf top ...

  6. Linux性能分析工具perf基础使用介绍

    perf是Linux内核内置的性能分析工具.从内核版本2.6.31开始出现该工具,如果没有安装,可以使用以下命令进行安装 yum -y install perf.x86_64 这里我们主要介绍一下如何 ...

  7. linux 系统级性能分析工具 perf 的介绍与使用

    目录 1. 背景知识 1.1 tracepoints 1.2 硬件特性之cache 2. 主要关注点 3. perf的使用 3.0 perf引入的overhead 3.1 perf list 3.2 ...

  8. linux 性能分析工具perf

    perf 性能监控分析工具 perf 工具下载 https://cdn.kernel.org/pub/linux/kernel/tools/perf/v5.9.0/perf-5.9.0.tar.gz ...

  9. 系统级性能分析工具perf的介绍与使用

    测试环境:Ubuntu16.04 + Kernel:4.4.0-31 apt-get install linux-source cd /usr/src/tools/perf make &&am ...

  10. Linux常用性能分析工具汇总

    文章目录 性能分析工具 top pstree mpstat vmstat pidstat perf proc tcpdump bcc工具箱 cachestat cachetop memleak fil ...

最新文章

  1. 写一个参数返回二进制中1的个数
  2. 从一亩三分地转——“有代码的地方,就有江湖 - 冯诺伊曼.金庸”
  3. Android 中intent传递序列化信息(传递类)
  4. 网易云音乐:基于分布式图学习PGL的推荐系统优化之路
  5. Leetcode中单链表题总结
  6. 流程流转相关业务与流转的分离
  7. 万万没想到,一个 MongoDB.Driver 的 bug 导致 .NET5 程序死锁!
  8. 根据id获取多维数组路径_clickhouse数据模型之用户路径分析
  9. srsLTE源码学习:RRC:(Radio Resource Control):无线资源控制协议
  10. Software Testing Resource
  11. git pull出现错误的解决办法
  12. matplotlib中ion()和ioff()的使用
  13. Failed to load selinux policy, Freezing | CentOS | Redhat | RHEL
  14. 推荐装机软件更新下载(2006.11.7更新)
  15. 美化你的Xfce桌面
  16. 事情永远做不完,却什么都带不走
  17. 谷歌浏览器 F12或右键检查 开发者工具DevTool打开慢问题
  18. 2011年正月初6学校初六补课,还要170元补课费
  19. This program may be freely redistributed under the terms of the GNU GPL
  20. 虚荣和骄傲会让你跌得很惨

热门文章

  1. CSS3 详细新增内容
  2. HTML5 — 知识总结篇《VI》【路径的写法】
  3. 1091 N-自守数 (15 分)—PAT (Basic Level) Practice (中文)
  4. HTML5 — 知识总结篇《III》【文本元素】
  5. 用idea搭建SSM框架maven项目
  6. pycharm中tensorflow代码不能自动补全或import红线问题解决
  7. window.open()
  8. Oracle中OEM的启动与关闭
  9. 解决:未能找到 CodeDom 提供程序类型 Microsoft.VJSharp.VJSharpCodeProvider
  10. QGroundControl源码编译安装