Linux程序性能分析和火焰图
Linux程序性能分析和火焰图
Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多。其中应用分析性能方面Dtrace, SystemTap, Perf_events应该算是这方面的集大成者。Dtrace目前只在较高的内核版本有支持,记得是4.8以后, SystemTap则是需要在Red Hat的官方网站下载OS版本对应的调试符号和对应的调试版本内核,配置起来需要花费一定的时间,只有Perf_events使用起来比较方面,但是客观来说,实力也是最弱的,但应对日一些简单的场景也足够了。本文以Perf_events进行示范,算是对这方面感兴趣的朋友开个头,抛砖引玉一下。
Perf_events简称perf是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的函数名以及调用栈(stack)。通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题。
命令如下:
# perf record -F -p -g -- sleep
上面的命令中,perf record表示记录,-F 99表示每秒99次,-p 15533是进程号,即对哪个进程进行分析,也可以对线程进行分析, -g表示记录调用栈,sleep 30则是持续30秒。运行后会产生一个庞大的文本文件。如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。为了便于阅读,perf record命令可以统计每个调用栈出现的百分比,然后从高到低排列。
命令如下:
# perf report -n --stdio
由于文本显示方式对于初学者不是十分直观,于是有了火焰图, 首先对刚才生成的perf.data进行如下两步处理。
# perf script -i perf.data &> perf.unfold
# ./stackcollapse-perf.pl perf.unfold &> perf.folded
然后生成火焰图
#./flamegraph.pl perf.folded > perf.svg
具体的火焰图生成工具可以去如下路径下载:
https://github.com/brendangregg/FlameGraph

关于火焰图
火焰图是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈。y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。x 轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。火焰图是 SVG 图片,可以与用户互动。
--鼠标悬浮
火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。
--点击放大
在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息。左上角会同时显示"Reset Zoom",点击该链接,图片就会恢复原样。
--搜索
按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示。
小结
本文对linux应用性能分析工具perf的使用进行了完整的介绍,并对如何生成火焰图的命令进行了示范,火焰图的应用场景很多,不仅可以处理perf的输出数据还可以处理Dtrace命令的输出,功能强悍,希望本文对大家有所帮助。
Linux程序性能分析和火焰图的更多相关文章
- Linux性能分析利器——火焰图的安装使用
火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原生提供的性能分析工具,会返回 CPU 正在执行的 ...
- Linux下用火焰图进行性能分析【转】
转自:https://blog.csdn.net/gatieme/article/details/78885908 版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原 ...
- Linux下的应用程序性能分析 总结
Linux下的应用程序性能分析,根据内核程序和应用程序的不同,下文分两类进行描述. 我们侧重的是应用级别的程序,推荐google perf tool/kcachegrind组合 一.和内核有关的工具 ...
- 使用linux perf工具生成java程序火焰图
pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...
- linux 内核分析工具 Dtrace、SystemTap、火焰图、crash等
<< System语言详解 >> 关于 SystemTap 的书. 我们在分析各种系统异常和故障的时候,通常会用到 pstack(jstack) /pldd/ lsof/ tc ...
- 用 CPI 火焰图分析 Linux 性能问题
https://yq.aliyun.com/articles/465499 用 CPI 火焰图分析 Linux 性能问题 yangoliver 2018-02-11 16:05:53 浏览1076 ...
- linux系统分析工具续-SystemTap和火焰图(Flame Graph)
本文为网上各位大神文章的综合简单实践篇,参考文章较多,有些总结性东西,自认暂无法详细写出,建议读文中列出的参考文档,相信会受益颇多.下面开始吧(本文出自 “cclo的博客” 博客,请务必保留此出处ht ...
- linux性能分析工具之火焰图
一.环境 1.1 jello@jello:~$ uname -a Linux jello 4.4.0-98-generic #121-Ubuntu SMP Tue Oct 10 14:24:03 UT ...
- Linux火焰图-ubuntu
关注火焰图非常长的时间了!~~一直未能自己做个火焰图出来.今天小试一把. ubuntu18.04 ssh登陆之后执行命令 安装软件 apt-get install -y linux-cloud-too ...
随机推荐
- 2017-10-22—LD激光二极管原理
直接摘抄百科了: 在讲激光产生机理之前,先讲一下受激辐射.在光辐射中存在三种辐射过程, 一是处于高能态的粒子自发向低能态跃迁,称之为自发辐射; 二是处于高能态的粒子在外来光的激发下向低能态跃迁,称之为 ...
- [HDU4669]Editor (栈)
题意 模拟编辑器,还是给链接吧 https://vjudge.net/problem/HDU-4699 思路 两个栈 代码 //poj1050 //n^4暴力 #include<algorith ...
- vue_ajax 请求
yarn add vue-resource axios npm install --save axios pubsub-js // import VueResource from "vue- ...
- (AB)Codeforces Round #528 (Div. 2, based on Technocup 2019 Elimination Round
A. Right-Left Cipher time limit per test 1 second memory limit per test 256 megabytes input standard ...
- linux命令技巧
printf "%-5s %-10s %-4s\n" No Name Mark printf "%-5s %-10s %-4.2f\n" 1 Sarath 80 ...
- 移动端web开发常见问题
1.移动端如何定义字体font-family 三大手机系统的字体: ios 系统 默认中文字体是Heiti SC 默认英文字体是Helvetica 默认数字字体是HelveticaNeue 无微软雅黑 ...
- window10, java环境配置完后在cmd,输入java成功了,但为什么输入javac就失败了
一.Path的配置:按一般的网上教程,配置时都会是复制这段[%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin;] win10的都分开显示,还是比较直观,但由于编辑器的原因,所有变 ...
- What's the meaning of unqualified-id?
catch( const std::runtime_error & e) { .... } When compile, met an error: error: expected unqual ...
- TCP断开那些事
继上一篇后,我们再来看一下四次挥手的过程 这里其实没有必要过多阐述,一张图胜过千言万语. 与三次握手一样,四次挥手的过程中也有许多扩展问题. 当然问的最多的还是:为什么要四次握手?为什么要等待2MSL ...
- 在Fastreport里使用的CRC函数
如标题, 是在Fastreport的脚本里运行的CRC计算函数, 包括CRC-16/CRC-32 基本是从网上找的代码, 然后改出来的 至于为什么要在FR的脚本里运行....呵呵 不要在意这些细节(找 ...