写点什么

perf + 火焰图用法 小结

用户头像
hashyong
关注
发布于: 2021 年 05 月 16 日

要对新服务做性能测试,分析代码热点,初识 perf,做下总结


perf + 火焰图用法

要对新服务做性能测试,分析代码热点,初识 perf,做下总结


  • 通过它,应用程序可以利用 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 60perf script > out.perf
复制代码

制作火焰图

  • 从 github 上 clone 下来


git clone https://github.com/brendangregg/FlameGraph.gitcd FlameGraph
复制代码


  • 处理 perf script


./stackcollapse-perf.pl out.perf > out.folded
复制代码


  • 绘制 SVG


./flamegraph.pl out.folded > pmCount.svg
复制代码

火焰图局限性

调用栈不完整


  • 当调用栈过深时,某些系统只返回前面的一部分(比如前 10 层)。


函数名缺失


  • 有些函数没有名字,编译器只用内存地址来表示(比如匿名函数)。

火焰图示例

  • http://res.imtt.qq.com/res_mtt/weather/pmCpuCount.svg


  • 从图中看出,jce 的 display 方法是代码热点,占用 cpu 资源很高, 优化之后预计性能提升 20%+

后台服务性能测试常见指标

测试指标

QPS(吞吐量)

  • 每秒钟系统能够处理的请求数、任务数

响应时间

  • 服务处理一个请求或一个任务的耗时

错误率

  • 一批请求中结果出错的请求所占比例

压测

参数

  • 并发数

  • 请求个数

分析

  • req 个数

  • 有效 rsp 个数

  • 耗时分布

  • 耗时随 QPS 上升的曲线

  • QPS

  • 第一次出现异常,即当前系统已经开始出现异常(QPS=有效 RSP/主调超时时间)

  • 异常率统计

  • 异常率=失败 RSP/REQ

优化

分析服务瓶颈

  • top

  • vmstat

  • google-perftools

专项优化

  • CPU 分析

  • perf

  • 火焰图

  • 内存分析

参考

发布于: 2021 年 05 月 16 日阅读数: 59
用户头像

hashyong

关注

enjoy coding 2018.04.04 加入

github: https://github.com/hashyong

评论

发布
暂无评论
perf + 火焰图用法 小结