性能分析利器之perf浅析( 三 )

  • major-faults:页错误,内存页已经被swap到硬盘上,需要I/O换回
  • minor-faults :页错误,内存页在物理内存中,只是没有和逻辑页进行映射
  • 5.2. perf stat
    【性能分析利器之perf浅析】perf stat可以对程序运行过程中的性能计数器(包括Hardware,software counters)进行统计,分析程序的整体消耗情况:
    $perf stat lsPerformance counter stats for 'ls': 2.164836 task-clock (msec) # 0.808 CPUs utilized51 context-switches # 0.024 M/sec4 cpu-migrations # 0.002 M/sec333 page-faults # 0.154 M/sec5506056 # 2.543 GHz0 stalled-cycles-frontend # 0.00% frontend cycles idle0 stalled-cycles-backend # 0.00% backend cycles idle6100570 instructions # 1.11 insns per cycle1298744 branches # 599.927 M/sec18509 branch-misses # 1.43% of all branches0.002679758 seconds time elapsed具体各个字段的含义在perf list中已经列出了,这里分析一下重要的数据:
    • task-clock (msec): cpu处理task所消耗的时间,单位ms,0.808 CPUs utilized的表示cpu使用率为80.8% = 2.164836 / 2.679758. 该值越高代表程序是CPU bound而非IO bound 类型 。
    • instructions:执行的指令条数,insns per cycle: 即IPC,每个cpu周期执行的指令条数,1.11 = 6100570(instructions) / 5506056(cycles),IPC比上面的CPU使用率更能说明CPU的使用情况,关于IPC有一篇brendangregg的文章,很好的说明CPU使用率不是一个很好的性能分析指标
    • stalled-cycles-frontend和stalled-cycles-backend表示CPU停滞统计,具体可参考
    perf stat可以加上-e选项来设置自己关心的事件统计,具体参数可以通过上面的perf list来查看
    5.3. perf top
    perf top类似系统的命令top,可以实时的查看当前系统各个进程的各个函数的性能计数分析:$sudo perf top
    性能分析利器之perf浅析

    文章插图
     
    perf top的和perf record的功能参数差不多,我们可以加上-e:来统计特定的event,-g: 开启call-graph, -p:分析特定的进程
    平常我们用的更多的是perf record,因为它可以将profiler的结果输出到文件,然后通过perf report来进行分析,或者通过可视化工具进行分析和输出 。所以下面着重介绍perf record
    5.4. perf record
    perf reord可以运行一个命令,但更多的是对已运行的进程进行性能分析,并将分析结果输出到perf.data(默认该文件名)中 。不会像perf top一样实时输出分析结果 。输出perf.data可以通过perf report进行分析,或者通过perf script输出结果给第三方输出可视化的视图 。用前面的示例代码进行测试如下:
    $perf record -g -F 99 ./a.out$perf report
    性能分析利器之perf浅析

    文章插图
     
    perf record几个总要参数说明一下:
    • -F: 事件采样的频率, 单位HZ, 更高的频率会获得更细的统计,但会带来更多的开销
    • -g: 进行堆栈追踪,生成调用关系图,等价于–call-graph, 默认情况下,-g等同于–call-graph fp,即通过frame pointer来进行堆栈追踪 。如果frame pointer被优化掉的话,可以通过dwarf, lbr进行堆栈追踪
    • sleep: 采样的时间
    5.5. perf可视化分析
    perf 提供了内置的可视化分析工具 perf timechart,例如:
    $perf timechart record ./a.out$perf timechart
    性能分析利器之perf浅析

    文章插图
     
    perf timechart输出的是进程运行过程中系统调度的情况,无法对程序的具体代码段进行性能分析,但可以看出总结运行情况:running,idle,I/O等,
    Brendangregg写了两款对perf采样结果进行可视化分析的开源工具:Flame Graphs和HeatMap. FlameGraphs即所谓的火焰图,是大家使用比较多的工具,能清晰的展示程序各个函数的性能消耗 。HeatMap可以从采样数据中的延迟数据来进行消耗展示 。
    下面是对之前实例代码的采样数据perf.data进行FlameGraphs的绘制:
    $perf script |./stackcollapse-perf.pl|./flamegraph.pl > fg_output.svg
    性能分析利器之perf浅析

    文章插图
     
    perf_flamegraph.png
    6. 参考Perf官方wiki
    https://perf.wiki.kernel.org/index.php/Main_Page
    Perf 维基百科
    https://en.wikipedia.org/wiki/Perf_(Linux)
    Perf – Linux下的系统性能调优工具,第 1 部分
    https://www.ibm.com/developerworks/cn/linux/l-cn-perf1/index.html
    Linux 效能分析工具: Perf
    http://wiki.csie.ncku.edu.tw/embedded/perf-tutorial
    Linux内核调试技术——kprobe使用与实现
    https://blog.csdn.net/luckyApple1028/article/details/52972315


    推荐阅读