perf + 火焰图用法 小结
要对新服务做性能测试,分析代码热点,初识perf,做下总结
perf + 火焰图用法
perf简介
Perf (Performance Event), Linux 系统原生提供的性能分析工具, 会返回 CPU 正在执行的函数名以及调用栈(stack)
通过它,应用程序可以利用 PMU,tracepoint 和内核中的特殊计数器来进行性能统计。它不但可以分析指定应用程序的性能问题 (per thread)
,也可以用来分析内核的性能问题,当然也可以同时分析应用代码和内核,从而全面理解应用程序中的性能瓶颈通常,它的执行频率是 99Hz(每秒99次),如果99次都返回同一个函数名,那就说明 CPU 这一秒钟都在执行同一个函数,可能存在性能问题
sudo perf record -F 99 -p 13204 -g -- sleep 30
上面的代码中,perf record表示记录,-F 99表示每秒99次,-p 13204是进程号,即对哪个进程进行分析,-g表示记录调用栈,sleep 30则是持续30秒
运行后会产生一个庞大的文本文件。如果一台服务器有16个 CPU,每秒抽样99次,持续30秒,就得到 47,520 个调用栈,长达几十万甚至上百万行。
为了便于阅读,perf record命令可以统计每个调用栈出现的百分比,然后从高到低排列
火焰图简介
火焰图(flame graph), 是基于 perf 结果产生的 SVG 图片,用来展示 CPU 的调用栈
y 轴表示调用栈,每一层都是一个函数。调用栈越深,火焰就越高,顶部就是正在执行的函数,下方都是它的父函数。
x轴表示抽样数,如果一个函数在 x 轴占据的宽度越宽,就表示它被抽到的次数多,即执行的时间长。注意,x 轴不代表时间,而是所有的调用栈合并后,按字母顺序排列的。
火焰图就是看顶层的哪个函数占据的宽度最大。只要有"平顶"(plateaus),就表示该函数可能存在性能问题。
颜色没有特殊含义,因为火焰图表示的是 CPU 的繁忙程度,所以一般选择暖色调。
火焰图互动性
火焰图是 SVG 图片,可以与用户互动。
鼠标悬浮
火焰的每一层都会标注函数名,鼠标悬浮时会显示完整的函数名、抽样抽中的次数、占据总抽样次数的百分比。下面是一个例子
Function: Taf::TC_Thread::threadEntry (7,665 samples, 49.9%)
点击放大
- 在某一层点击,火焰图会水平放大,该层会占据所有宽度,显示详细信息
- 左上角会同时显示"Reset Zoom",点击该链接,图片就会恢复原样。
搜索
- 按下 Ctrl + F 会显示一个搜索框,用户可以输入关键词或正则表达式,所有符合条件的函数名会高亮显示
实例
登录宿主机或者容器
go -d A
查看进程pid
ps aux|grep name
使用perf记录和生成
perf record -F 99 -p 101503 -m 4 -g -a -- sleep 60
perf script > out.perf
制作火焰图
从github上clone下来
git clone https://github.com/brendangregg/FlameGraph.git
cd FlameGraph
处理perf script
./stackcollapse-perf.pl out.perf > out.folded
绘制SVG
./flamegraph.pl out.folded > pmCount.svg
火焰图局限性
调用栈不完整
- 当调用栈过深时,某些系统只返回前面的一部分(比如前10层)。
函数名缺失
- 有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。
火焰图示例
- 从图中看出,jce 的display方法是代码热点,占用cpu资源很高, 优化之后预计性能提升20%+
后台服务性能测试常见指标
测试指标
QPS(吞吐量)
- 每秒钟系统能够处理的请求数、任务数
响应时间
- 服务处理一个请求或一个任务的耗时
错误率
- 一批请求中结果出错的请求所占比例
压测
参数
- 并发数
- 请求个数
分析
- req个数
- 有效rsp个数
- 耗时分布
- 耗时随QPS上升的曲线
- QPS
- 第一次出现异常,即当前系统已经开始出现异常(QPS=有效RSP/主调超时时间)
- 异常率统计
- 异常率=失败RSP/REQ
优化
分析服务瓶颈
- top
- vmstat
- google-perftools
专项优化
- CPU分析
- perf
- 火焰图
- 内存分析
- CPU分析
参考
perf + 火焰图用法 小结的更多相关文章
- [转]perf + 火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- perf + 火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- 火焰图(Flame Graphs)的安装和基本用法
火焰图(Flame Graphs) 一.概述: 火焰图(flame graph)是性能分析的利器,通过它可以快速定位性能瓶颈点. perf 命令(performance 的缩写)是 Linux 系统原 ...
- 使用perf生成Flame Graph(火焰图)
具体的步骤参见这里: <flame graph:图形化perf call stack数据的小工具> 使用SystemTap脚本制作火焰图,内存较少时,分配存储采样的数组可能失败,需 ...
- 使用linux perf工具生成java程序火焰图
pre.cjk { font-family: "Nimbus Mono L", monospace } p { margin-bottom: 0.1in; line-height: ...
- perf + Flame Graph火焰图分析程序性能
1.perf命令简要介绍 性能调优时,我们通常需要分析查找到程序百分比高的热点代码片段,这便需要使用 perf record 记录单个函数级别的统计信息,并使用 perf report 来显示统计结果 ...
- 使用perf + FlameGraph生成进程火焰图
FlameGraph代码:https://github.com/cobblau/FlameGraph 使用方法 1,perf record --call-graph dwarf -p 12345 2, ...
- 火焰图&perf命令
最近恶补后端技术,发现还是很多不懂,一直写业务逻辑容易迷失,也没有成长.自己做系统,也习惯用自己已知的知识来解决,以后应该多点调研,学到更多的东西应用起来. 先学一个新的性能分析命令. NAME pe ...
- Linux程序性能分析和火焰图
Linux程序性能分析和火焰图 Linux程序的性能分析工具数量比较多,涉及到整个操作系统的方方面面,可能是开源的原因吧,相对于Windows来说丰富太多.其中应用分析性能方面Dtrace, Syst ...
随机推荐
- curl http code 0
使用curl进行post请求后,接收status code ,结果返回的结果是0 ,但是请求返回的数据是正常的. 检查后发现是执行顺序问题: $response = [ 'statusCode' =& ...
- yum 安装 php5.6
yum 安装 php5.6 安装 PHP rpm -Uvh http://ftp.iij.ad.jp/pub/linux/fedora/epel/6/i386/epel-release-6-8.noa ...
- Eclipse中修改git地址、用户、密码
1. 修改Url Window > Preferences > Team > Git > Configuration > Repository Settings 2. 修 ...
- Selenium自动化测试之结果处理
Selenium自动化测试之结果处理 一.断言 断言相当于性能测试中的检查点,常用断言种类很多,具体可以查看断言API:判断预期结果和实际结果是否一致,断言成功,程序继续处理,失败则终止运行,示例如下 ...
- Android 异步开发之 AsyncQueryHandler 批量添加联系人
AsyncQueryHandler: 官方解释是一个异步帮助类(A helper class to help make handling asynchronous ContentResolver qu ...
- lwip IP address handling 关于 IP 地址的 操作 API接口
lwip 2.0.3 IP address handling /** * @file * IP address API (common IPv4 and IPv6) */ 1.u32_t ipadd ...
- 解决Js跨域访问的问题
1,最近有个需求,用Js获取Html标签<input type="file"/>的路径!遇到代码拒绝访问,提示安全验证,不允许跨域访问,简单的设置一下浏览器即可,不过对 ...
- 编程开发之--Oracle数据库--存储过程和存储函数(2)
上一小结我们简单介绍了存储过程和存储函数,对存储过程和存储函数有了一个基本的了解,接下来介绍在java程序中如何调用我们创建的存储过程和存储函数 1.在应用程序中调用我们的存储过程 创建一个简单的Ja ...
- jQuery $ 的作用
$符号总体来说有两个作用: 1.作为一般函数调用:$(param) (1).参数为函数:当DOM加载完成后,执行此回调函数 $(function(){//dom加载完成后执行 //代码 }) (2). ...
- JanusGraph 图数据库安装小记 ——以 JanusGraph 0.3.0 为例
由于近期项目中有使用图数据的需求,经过对比,我们选择尝试使用 JanusGraph.本篇小记记录了我们安装 JanusGraph 以及需要一起集成的 Cassandra + Elasticsearch ...