perf分析CPU性能
1.⽕焰图
⽕焰图整个图形看起来就像⼀团跳动的⽕焰, 这也正是其名字的由来. 燃烧在⽕苗尖部的就是 CPU 正在执⾏的操作, 不过需要说明的是颜⾊是随机的, 本⾝并没有特殊的含义, 纵向表⽰调⽤栈的深度, 横向表⽰消耗的时间。因为调⽤栈在横向会按照字母排序, 并且同样的调⽤栈会做合并, 所以⼀个格⼦的宽度越⼤越说明其可能是瓶颈。综上所述, 主要就是看那些⽐较宽⼤的⽕苗, 特别留意那些类似平顶⼭的⽕苗。
2. perf命令⽣成⽕焰图
perf命令是 Linux 系统原⽣提供的性能分析⼯具,会返回 CPU 正在执⾏的函数名以及调⽤栈(stack)。通常,它的执⾏频率是
99Hz(每秒99次),如果99次都返回同⼀个函数名,那就说明 CPU 这⼀秒钟都在执⾏同⼀个函数,可能存在性能问题。
Perf命令⽣成⽕焰图的操作步骤如下:
2.1出应⽤程序或内核消耗CPU的PID
命令窗⼝下输⼊top,结果如下,我们以media为例,其pid为27867。
2.2 执⾏perf record 命令,记录该PID的⾏为
命令⾏输⼊:perf record -a -g -p 27867 -- sleep 60,其中:
-g 选项是告诉perf record额外记录函数的调⽤关系
-a 表⽰对所有CPU采样
-p 指定需要record的进程pid
-- sleep 60表⽰60秒后退出
60秒后,在当前⽬录下会⽣成⼀个perf.data⽂件
2.3 perf report命令
perf report –i perf.data命令可以统计每个调⽤栈出现的百分⽐, 然后从⾼到低排列。按上下⽅向键以及回车键,展开⽐例最⾼的函数后,你就可以得到下⾯这个调⽤关系链图:
制作svg图片
2.4 ⽕焰图分析
perf record⽣成的结果不易阅读,所以才有了⽕焰图。⽕焰图是基于 perf 结果产⽣的 SVG 图⽚,⽤来展⽰ CPU 的调⽤栈。能从perf record 记录⽣成⽕焰图的⼯具可以通过
perf script -i ../perf.data  | ./ --all |  ./ > ksoftirqd.svg
执⾏成功后,使⽤浏览器打开 ksoftirqd.svg ,你就可以看到⽣成的⽕焰图了。如下图所⽰:
y 轴表⽰调⽤栈,每⼀层都是⼀个函数。调⽤栈越深,⽕焰就越⾼,顶部就是正在执⾏的函数,下⽅都是它的⽗函数。x 轴表⽰抽样数,如果⼀个函数在 x 轴占据的宽度越宽,就表⽰它被抽到的次数多,即执⾏的时间长。注意,x 轴不代表时间,⽽是所有的调⽤栈合并后,按字母顺序排列的。
⽕焰图就是看顶层的哪个函数占据的宽度最⼤。只要有"平顶"(plateaus),就表⽰该函数可能存在性能问题。颜⾊没有特殊含义,因为⽕焰图表⽰的是 CPU 的繁忙程度,所以⼀般选择暖⾊调。
⽕焰图是 SVG 图⽚,可以与⽤户互动。
(1)⿏标悬浮
⽕焰的每⼀层都会标注函数名,⿏标悬浮时会显⽰完整的函数名、抽样抽中的次数、占据总抽样次数的百分⽐。
(2)点击放⼤
在某⼀层点击,⽕焰图会⽔平放⼤,该层会占据所有宽度,显⽰详细信息。左上⾓会同时显⽰"Reset Zoom",点击该链接,图⽚就会恢复原样。
(3)搜索
按下 Ctrl + F 会显⽰⼀个搜索框,⽤户可以输⼊关键词或正则表达式,所有符合条件的函数名会⾼亮显⽰

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。