linux下性能分析工具Perf安装与用法

这篇具有很好参考价值的文章主要介绍了linux下性能分析工具Perf安装与用法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

1、Perf介绍

2、火焰图分类

 (1)CPU

 (2)Memory Flame Graphs

 (3)Off-CPU Flame Graphs

 (4)Hot/Cold Flame Graphs

 (5)Differential

 3、火焰图安装命令

(1)安装Perf工具

(2)下载可视化工具FlameGraph

 4、火焰图demo测试

(1)生成CPU火焰图1

(2)火焰图表解析

(3)当前程序图标分析

a> 入口函数地址确定

b> 获取对应地址入口函数

 (4)生成火焰图2

 (5)生成差分火焰图


1、Perf介绍

perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫“Performance counters“的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关性能指标与操作系统相关性能指标的性能剖析,可用于性能瓶颈的查找与热点代码的定位。

Perf的主要功能和用途如下:

  1. 事件采样:Perf使用硬件性能计数器来采样事件,如CPU指令、缓存命中、缓存失效等,从而获取系统在运行时的性能数据。

  2. 调用图:Perf可以生成函数调用图,显示函数之间的调用关系和耗时,帮助识别程序的热点和性能瓶颈。

  3. 火焰图:火焰图是Perf输出的一种可视化图表,它可以直观地展示函数调用的耗时情况和函数的调用关系,以便快速准确地识别最频繁的代码路径,帮助快速定位性能瓶颈。

  4. 内存分析:Perf可以收集内存事件,如内存访问、缺页异常等,帮助识别内存性能问题。

  5. 锁分析:Perf可以监测锁的使用情况,帮助发现多线程程序中的竞争问题。

  6. Tracing支持:Perf支持Linux Trace Toolkit Next Generation (LTTng)和eBPF等跟踪工具,用于深入分析系统的行为。

  7. 报告生成:Perf能够生成详细的报告和统计信息,方便用户理解和分析性能数据。

2、火焰图分类

(1)CPU

用途:检测导致CPU运行繁忙的原因。

perf安装,程序性能分析及调试,linux,运维,服务器

(2)Memory Flame Graphs

用途:检测应用程序内存使用量增加的原因。

perf安装,程序性能分析及调试,linux,运维,服务器

 (3)Off-CPU Flame Graphs

用途:有些性能问题不是CPU的性能问题,即进程和线程不在CPU上运行时花费角度的时间,而是在程序请求期间花费了不少时间,这种情况也会成比例的影响性能。

perf安装,程序性能分析及调试,linux,运维,服务器

 (4)Hot/Cold Flame Graphs

用途:将CPU和非CPU火焰图结合在一起。它在一个图表中显示了所有线程的运行时间,并允许直接比较在CPU和非CPU上的代码路径持续时间。

perf安装,程序性能分析及调试,linux,运维,服务器

 (5)Differential

       用途:红蓝差异火焰图,分析不同时刻CPU性能变化的原因。

perf安装,程序性能分析及调试,linux,运维,服务器

 3、火焰图安装命令

(1)安装Perf工具

$ sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y    //下载Perf
$ perf -v    //查看安装Perf的版本

(2)下载可视化工具FlameGraph

下载地址:GitHub - brendangregg/FlameGraph: Stack trace visualizer

 4、火焰图demo测试

测试程序如下:

#include <stdio.h>
#define DEF_PRINT    


void funcA()
{
    for(int i=0; i < 10*10000;i++)
    {
#ifdef DEF_PRINT
       printf("funcA\n");
#endif
    }
}

void funcB()
{
    for(int i=0; i < 20*10000;i++)
    {
#ifdef DEF_PRINT
         printf("funcB\n");
#endif
    }
}

void funcC()
{
    for(int i=0; i < 30*10000;i++)
    {
#ifdef DEF_PRINT
         printf("funcC\n");
#endif
    }
}

void printf1();
void printf2();
void funcD()
{
    for(int i=0; i < 20*10000;i++)
    {
#ifdef DEF_PRINT
         printf("funcD\n");
#endif
    }
    printf1();
}

void printf1()
{
    for(int i=0; i < 10*10000;i++)
    {
#ifdef DEF_PRINT
         printf("printf1\n");
#endif
    }
    printf2();
}

void printf2()
{
    for(int i=0; i < 10*10000;i++)
    {
#ifdef DEF_PRINT
        printf("printf2\n");
#endif
    }
}

int main()
{
    while (true) {
        funcA();
        funcB();
        funcC();
        funcD();
    }
    return 0;
}

 程序编译命令:

g++ -g -O0 main.cpp -o main //-g带调试信息编译,禁止优化O0,

(1)生成CPU火焰图1

生成火焰图步骤如下:

程序运行结果如下:

perf安装,程序性能分析及调试,linux,运维,服务器

//上面main程序运行时,使用top查看,进程PID为5606,CPU为86.3%左右。

$ sudo perf record -F 99 -p 5606 -g -- sleep 30
//-F 99 表示每秒99次采样, -p 5606 是进程号, 即对哪个进程进行分析, -g 表示记录调用栈, sleep 30 则是持续30秒。

$ sudo perf script -i perf.data &>perf.unfold
//perf script 工具对 perf.data 进行解析,生成折叠后的调用栈。

$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded
//下载的可视化工具FlameGraph在当前文件上一层,用 stackcollapse-perf.pl 将 perf 解析出的内容 perf.unfold 中的符号进行折叠。

$ ../FlameGraph/flamegraph.pl perf.folded >perf1.svg
//生成svg图

使用浏览器打开perf.svg图,效果如下:

perf安装,程序性能分析及调试,linux,运维,服务器

(2)火焰图表解析

 上图中每个方块代表堆栈中的一个函数,也叫堆栈帧。

y轴:表示堆栈深度,火焰越高,表示函数调用层级越深,最顶部的方块表示当前CPU上运行的函数,每一块的函数下方都是当前函数的调用方。

x轴:表示当前函数的采样数,与大多数图表不同,它不显示从左到右的时间流逝。左到右的排序没有意义(它按字母顺序排序以最大程度地合并帧),方框的宽度显示了它在CPU上运行的总时间(基于采样计数)。哪个方块的宽度比较大,就表示该函数可能存在性能问题。

注意:图标中颜色不具有显著意义,通常是随机选择的暖色调。这种可视化称为"火焰图",因为它最初用于显示CPU上的热点,而且看起来像火焰。

它也是交互式的:将鼠标悬停在SVG上以显示详细信息,并单击进行缩放。

(3)当前程序图标分析

从(1)中火焰图中看出,没有demo中定义的函数,这是因为printf函数占用改进程的CPU性能较高,而for循环逻辑占用性能较低,可以点击火焰图上的搜索按键Search进行搜索,本文搜索程序入口函数。

确定入口函数的步骤如下:

a> 入口函数地址确定

输入下面命令

$ readelf -h main

可执行文件信息如下: 

perf安装,程序性能分析及调试,linux,运维,服务器

b> 获取对应地址入口函数

输入下面命令:

$ readelf -s main

perf安装,程序性能分析及调试,linux,运维,服务器

 由上图可知入口函数为_start,所以搜索_start函数。

_start搜索结果如下:

perf安装,程序性能分析及调试,linux,运维,服务器

点击__libc_start_main函数,进入对于函数调用过程,如下:

perf安装,程序性能分析及调试,linux,运维,服务器

上面火焰图中printf函数占用该进程CPU性能较高,printf的函数输出内容到显示的过程可参考下面链接:

printf函数打印(一)—— 过程解析篇_printf调用过程_仲夏夜之梦~的博客-CSDN博客

printf函数打印(二)—— 缓冲区篇(文件读写再探究)_printf flush_仲夏夜之梦~的博客-CSDN博客

 (4)生成火焰图2

将上面的代码中的#define DEF_PRINT  行进行屏蔽,这样函数就不会打印输出到屏幕上。重新编译代码,运行。

perf安装,程序性能分析及调试,linux,运维,服务器

 生成火焰图步骤跟上面(1)中一样,只是-p参数的进程ID号不同,生成的svg图片如下:

perf安装,程序性能分析及调试,linux,运维,服务器

由svg图表可知,funcA在mainNoPrint进程中,占用该进程CPU 10%,funcB占用该进程CPU 20%,funcC占用该进程CPU 30%,funcD占用该进程CPU 40%。 

 (5)生成差分火焰图

运行mainNoPrint函数,抓取系统所有进程的CPU,命令如下:

$ sudo perf record -F 99 -a -g -- sleep 30     //a表示对所有进程堆栈数据进行抓取
$ sudo perf script -i perf.data &>perf.unfold
$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded1
$ ../FlameGraph/flamegraph.pl perf.folded1 >perf1.svg

 生成的火焰图如下:

perf安装,程序性能分析及调试,linux,运维,服务器

 停止mainNoPrint程序,抓取系统所有进程的CPU,命令如下:

$ sudo perf record -F 99 -a -g -- sleep 30
$ sudo perf script -i perf.data &>perf.unfold
$ ../FlameGraph/stackcollapse-perf.pl perf.unfold &>perf.folded2
$ ../FlameGraph/flamegraph.pl perf.folded2 >perf2.svg

生成的火焰图如下:

perf安装,程序性能分析及调试,linux,运维,服务器

以perf.folded2的为基准,生成差分火焰图,命令如下:

$./FlameGraph/difffolded.pl perf.folded2 perf.folded1|../FlameGraph/flamegraph.pl >diff1.svg

 生成的差分火焰图如下:

perf安装,程序性能分析及调试,linux,运维,服务器

 由红色部分图可知,CPU中funcD等函数占用的CPU增加了,蓝色部分相对于上次CPU减少了。

附加:

1、火焰图的介绍也可参考:

 Linux下用火焰图进行性能分析_perf火焰图分析_CHENG Jian的博客-CSDN博客

 2、可视化工具官方可参考:Flame Graphs (brendangregg.com)

 3、其他性能分析工具可参考:C++ performance 性能分析工具(sanitizers valgrind gprof gperftools perf)的使用_performance测试工具_超级大洋葱806的博客-CSDN博客文章来源地址https://www.toymoban.com/news/detail-765682.html

到了这里,关于linux下性能分析工具Perf安装与用法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Linux各类性能分析工具用法详解

    在Linux性能分析和优化过程中,选用一个好的工具能极大的提高自己的工作效率。这里以Brendan Gregg的Linux性能工具图谱为线索,梳理了Linux系统下各个模块的性能分析工具,并对部分常用工具的用法进行了详细说明。掌握这些工具,可以极大的提高开发者程序性能优化的效果和

    2024年02月11日
    浏览(51)
  • 辅助性能优化——长安链性能分析工具原理及用法

    如何提升区块链系统性能是很多开发者都会关注的事,但是有些对区块链并非十分熟悉的开发者可能会感到没有头绪。长安链提供了性能分析工具帮助开发者梳理系统耗时,优化系统性能。下面对长安链性能分析工具原理及使用进行介绍。 time_counter.sh是长安链性能分析工具,

    2024年02月13日
    浏览(53)
  • test perf-01-性能测试之 JMeter

    Apache JMeter 可以用于测试静态和动态资源(Web动态应用程序)的性能。 它可以用于模拟服务器、服务器组、网络或对象上的负载,以测试其强度或分析不同负载类型下的总体性能。 JMeter Tutorial Apache JMeter可以用于测试静态和动态资源(Web动态应用程序)的性能。 它可以用于模拟服

    2024年02月03日
    浏览(37)
  • Linux超全整理Linux性能分析工具汇总

    出于对Linux操作系统的兴趣,以及对底层知识的强烈欲望,因此整理了这篇文章。本文也可以作为检验基础知识的指标,另外文章涵盖了一个系统的方方面面。如果没有完善的计算机系统知识,网络知识和操作系统知识,文档中的工具,是不可能完全掌握的,另外对系统性能

    2024年02月07日
    浏览(43)
  • 超全整理!Linux性能分析工具汇总合集

    高能预警:文章涵盖了一个系统的方方面面,如果没有完善的 计算机系统知识、网络知识 和 操作系统知识 ,文档中的工具是不可能完全掌握的,另外,对系统性能分析和优化是一个长期的过程。 本文主要是结合Linux 大牛,Netflix 高级性能架构师 Brendan Gregg 更新 Linux 性能调

    2024年02月08日
    浏览(46)
  • 性能分析与调优: Linux 磁盘I/O 观测工具

    目录 一、实验 1.环境 2.iostat 3.sar 4.pidstat 5.perf 6. biolatency 7. biosnoop 8.iotop、biotop 9.blktrace 10.bpftrace 11.smartctl 二、问题 1.如何查看PSI数据 2.iotop如何安装 3.smartctl如何使用 (1)主机 表1-1 主机 主机 架构 组件 IP 备注 prometheus 监测 系统 prometheus、node_exporter  192.168.204.18 grafana 监测

    2024年01月16日
    浏览(67)
  • Linux CPU 性能分析工具火焰图(Flame Graphs)认知

    博文内容为 《BPF Performance Tools》 读书笔记整理 详细了解小伙伴可以访问作者官网: https://www.brendangregg.com/flamegraphs.html 有油管上分享的作者在 USENIX ATC 2017 的视屏 理解不足小伙伴帮忙指正 不必太纠结于当下,也不必太忧虑未来,当你经历过一些事情的时候,眼前的风景已经

    2024年02月20日
    浏览(54)
  • Linux系统运维:性能监视和分析工具sar命令详解

    目          录 一、sar工具介绍 二、sar工作原理 (一)原理概述 (二)sar数据收集器 三、sar命令语法 四、sar主要功能介绍 (一)功能概述 (二)CPU统计数据 (三)磁盘I/O统计数据 (四)网络统计数据 1、是使用-n DEV选项的sar输出 2、关于网络错误的信息可以用sar -n EDE

    2024年02月21日
    浏览(70)
  • linux之perf(2)list事件

    Linux之perf(2)list事件 Author:Onceday Date:2023年9月3日 漫漫长路,才刚刚开始… 全系列文章请查看专栏 : Perf性能分析_Once_day的博客-CSDN博客。 参考文档: Tutorial - Perf Wiki (kernel.org) perf-list(1) - Linux manual page (man7.org) 1. 概述 perf list 用于列出可用的性能事件,这些事件可以用于 perf

    2024年02月09日
    浏览(32)
  • linux之perf(8)annotate标注

    Linux之perf(8)annotate标注 Author:Onceday Date:2023年10月12日 漫漫长路,才刚刚开始… 全系列文章请查看专栏 : Perf性能分析_Once_day的博客-CSDN博客。 注:该文档内容采用了GPT4.0生成的回答,部分文本准确率可能存在问题 。 参考文档: Tutorial - Perf Wiki (kernel.org) perf-annotate(1) - Linux m

    2024年02月07日
    浏览(31)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包