目录
1. perf 作用
2. perf 安装
3. perf 使用示例
3.1 耗时统计,画出火焰图
1. 下载绘制火焰图的开源pl代码
2. 执行以下命令
3. 用浏览器打开svg文件,看当前进程各子模块耗时占比
1. perf 作用
Perf 是Linux kernel自带的系统性能优化工具。 Perf的优势在于与Linux Kernel的紧密结合,它可以最先应用到加入Kernel的new feature。pef可以用于查看热点函数,查看cashe miss的比率,从而帮助开发者来优化程序性能,也可以分析程序运行期间发生的硬件事件,比如 instructions retired ,processor clock cycles 等;您也可以分析
软件事件,比如 Page Fault 和进程切换,这使得 Perf 拥有了众多的性能分析能力,
通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread),也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈。
举例来说,使用 Perf 可以计算每个时钟周期内的指令数,称为 IPC,IPC 偏低表明代码没有很好地利用 CPU。Perf 还可以对程序进行函数级别的采样,从而了解程序的性能瓶颈究竟在哪里等等。Perf 还可以替代 strace,可以添加动态内核 probe 点,还可以做 benchmark 衡量调度器的好坏。。。
它和Oprofile性能调优工具等的基本原理都是对被监测对象进行采样,最简单的情形是根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文。假如一个程序 90% 的时间都花费在函数 foo() 上,那么 90% 的采样点都应该落在函数 foo() 的上下文中。运气不可捉摸,那么只要采样频率足够高,采样时间足够长,那么以上推论就比较可靠。因此,通过 tick 触发采样,我们便可以了解程序中哪些地方最耗时间,从而重点分析。
上面介绍了perf的原理,“根据 tick 中断进行采样,即在 tick 中断内触发采样点,在采样点里判断程序当时的上下文”,我们可以改变采样的触发条件使得我们可以获得不同的统计数据,例如 以时间点 ( 如 tick) 作为事件触发采样便可以获知程序运行时间的分布;以 cache miss 事件触发采样便可以知道 cache miss 的分布,即 cache 失效经常发生在哪些程序代码中。如此等等。
2. perf 安装
sudo apt-get install linux-tools-common
sudo apt-get install linux-tools-"$(uname -r)"
sudo apt-get install linux-cloud-tools-"$(uname -r)"
sudo apt-get install linux-tools-generic
sudo apt-get install linux-cloud-tools-generic
若安装出现 类似 “Unable to locate package linux-cloud-tools-4.4.50-040450-generic” 现象,
则 解决方法:
1). 更换软件源, 然后 sudo apt-get update, 以及 sudo apt-get upgrade, 然后 再次安装
2). 源码安装
sudo apt-get install linux-source
cd /usr/src/linux-source-4.4.0/tools/perf
make
make install
sudo cp ./perf /usr/bin/perf
测试是否安装成功:perf --version, 例如
johnpc@john:~$ perf --version
perf version 5.15.99
3. perf 使用示例
3.1 耗时统计,画出火焰图
1. 下载绘制火焰图的开源pl代码
地址:GitHub - brendangregg/FlameGraph: Stack trace visualizer
主要使用其中的两个脚本:stackcollapse-perf.pl 和 flamegraph.pl
2. 执行以下命令
top #查看你要监控的进程的PID, 此处比如wps的PID为 171622
sudo perf record -F 99 -a -g -p 171622 #在当前目录下生成 perf.data 记录文件
sudo perf script -f > wps.perf # 将 perf.data文件转换成 xxx.perf 文件
sudo /path-to/stackcollapse-perf.pl wps.perf > wps.folded #从 xxx.perf文件生成 xxx.folded文件
sudo /path-to/flamegraph.pl wps.perf > wps.svg #从 xxx.folded 文件生成 xxx.svg 制图文件
perf record 各参数的含义:
-F 99:每秒采样99
-a:记录系统范围内所有cpu的集合
-g:记录调用栈
-p:指定进程id--sleep n
:n秒后停止
-f :File perf.data not owned by current user or root (use -f to override)
3. 用浏览器打开svg文件,看当前进程各子模块耗时占比
点击每个长方块,可以进入看到其子模块的耗时占比。
如果svg图出现 unknown 函数,使用如下命令
sudo perf record -e cpu-clock --call-graph dwarf
-p pid
范例:perf record -e cpu-clock -g -p 29713 --call-graph dwarf
使用–call-graph dwarf 之后record生成的perf.data很大,大家生成的时候要时刻注意设备剩余空间是否足够。
参考:
perf性能分析工具使用分享 - 知乎
【Ubuntu】Perf工具的使用 - 第一PHP社区
系统性能分析工具--Perf - 知乎