广告位联系
返回顶部
分享到

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

linux 来源:互联网 作者:佚名 发布时间:2024-05-18 23:05:22 人浏览
摘要

1、Perf介绍 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫Performance counters的内核子系统实现,基于事件采样原理,以性能事件为基础,支持针对处理器相关

1、Perf介绍

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

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

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

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

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

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

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

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

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

2、火焰图分类

(1)CPU

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

(2)Memory Flame Graphs

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

(3)Off-CPU Flame Graphs

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

(4)Hot/Cold Flame Graphs

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

(5)Differential

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

 3、火焰图安装命令

(1)安装Perf工具

1

2

$ 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测试

测试程序如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

61

62

63

64

65

66

67

68

69

70

71

72

73

74

75

76

77

78

#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;

}

程序编译命令:

1

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

(1)生成CPU火焰图1

生成火焰图步骤如下:

程序运行结果如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

//上面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图,效果如下:

(2)火焰图表解析

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

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

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

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

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

(3)当前程序图标分析

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

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

a> 入口函数地址确定

输入下面命令

1

$ readelf -h main

可执行文件信息如下: 

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

输入下面命令:

1

$ readelf -s main

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

_start搜索结果如下:

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

(4)生成火焰图2

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

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

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

(5)生成差分火焰图

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

1

2

3

4

$ 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

生成的火焰图如下:

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

1

2

3

4

$ 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.folded2的为基准,生成差分火焰图,命令如下:

1

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

生成的差分火焰图如下:

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


版权声明 : 本文内容来源于互联网或用户自行发布贡献,该文观点仅代表原作者本人。本站仅提供信息存储空间服务和不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权, 违法违规的内容, 请发送邮件至2530232025#qq.cn(#换@)举报,一经查实,本站将立刻删除。
原文链接 :
相关文章
  • linux关闭numa的教程

    linux关闭numa的教程
    linux关闭numa 以下内容在Centos8操作系统演示 1、编辑/etc/default/grub 2、在 GRUB_CMDLINE_LINUX里添加 numa=off 3、输入命令 grub2-mkconfig -o /boot/grub2/grub
  • Linux下性能分析工具Perf安装与用法
    1、Perf介绍 perf是Linux下的一款性能分析工具,能够进行函数级与指令级的热点查找。它由一个叫Performance counters的内核子系统实现,基于事件
  • Linux使用perf分析CPU占用情况的方法步骤

    Linux使用perf分析CPU占用情况的方法步骤
    1. 如何使用perf工具 1.1 perf安装 参考perf工具安装和使用 perf安装命令: 1 2 3 4 sudo apt-get install linux-tools-$(uname -r) linux-tools-generic -y sudo apt-get
  • Linux如何定时删除7天前的日志文件
    打开Linux cron任务编辑模式 1 crontab -e 输入任务命令 1 0 0 * * * find /home/sto/*log* -type f -mtime +7 -delete 明天0点0分搜索目录/home/sto的log文件 将7天前
  • Linux提权技巧全面汇总介绍
    在Linux系统中,提权是指获取更高的权限,这通常通过使用特定的命令或工具来完成,在这篇文章中,我们将探讨一些常见的Linux提升权限的技巧:
  • Linux服务器上配置基于SSH密钥的身份验证及使用方
    SSH(Secure Shell)是一种加密协议,用于管理和与服务器通信。在使用 Linux 服务器时,您经常会花费大量时间在通过 SSH 连接到服务器的终端
  • Linux使用cron定时任务被隐藏的解决方法

    Linux使用cron定时任务被隐藏的解决方法
    一、问题现象 线上服务器运行过程中,进程有莫名进程被启动,怀疑是有定时任务自动启动,当你用常规方法去查看,比如使用crontab去查看
  • linux删除 buff/cache缓存的操作方法

    linux删除 buff/cache缓存的操作方法
    1.查看当前内存占用 1 free -h 如图,缓存占用了将近9G,接下来进行清理 释放页缓存 1 echo 1 /proc/sys/vm/drop_caches 释放dentries和inodes 1 echo 2 /pro
  • linux下端口被占用问题以及解除方式介绍

    linux下端口被占用问题以及解除方式介绍
    linux下端口被占用及解除 问题 最近开始学linux,写一个网络编程有关的程序时,服务端绑定端口 客户端第一次连接的时候,服务端能够正常打
  • Linux杀死指定端口的进程的教程
    Linux杀死指定端口的进程 1.查看端口 终端输入:lsof -i tcp:port 将port换成被占用的端口(如:8080) 将会出现占用端口的进程信息。 2.kill进程 找
  • 本站所有内容来源于互联网或用户自行发布,本站仅提供信息存储空间服务,不拥有版权,不承担法律责任。如有侵犯您的权益,请您联系站长处理!
  • Copyright © 2017-2022 F11.CN All Rights Reserved. F11站长开发者网 版权所有 | 苏ICP备2022031554号-1 | 51LA统计