2022最火的Linux性能分析工具--perf

►►► 介绍

perf是Linux性能分析中,比较常用的一款工具。它基于时间采集原理,以性能事件为基础,支持针对CPU处理器相关性能指标与操作系统相关性能指标的性能分析。常被用来查找、定位源码级性能问题。如,perf top,就常用来定位热点函数。

►►► 安装

如果系统中直接执行 perf --help不能执行,centos系统可以使用 yum install perf -y 进行安装,ubuntu系统可以使用 apt install linux-tools-common -y 安装

►►► 帮助

# perf -h


 usage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]

 The most commonly used perf commands are:
   annotate        Read perf.data (created by perf record) and display annotated code解析perf record生成的perf.data文件,显示被注释的代码。
   
   archive         Create archive with object files with build-ids found in perf.data file根据数据文件记录的build-id,将所有被采样到的elf文件打包,利用此压缩包,可以在任何机器上分析数据文件中记录的采样数据。
   
   bench           General framework for benchmark suites。perf中内存的benchmark,目前包括两套针对调度器和内存管理子系统的benchmark。
   
   buildid-cache   Manage build-id cache.管理perf的build-id缓存,每个elf文件都有一个独一无二的build-id,build-id被perf用来关联性能数据和elf文件
   
   buildid-list    List the buildids in a perf.data file  列出perf.data中记录的所有build-id。
   
   c2c             Shared Data C2C/HITM Analyzer.
   config          Get and set variables in a configuration file.获取配置文件中设置的变量
   data            Data file related processing
   diff            Read perf.data files and display the differential profile 对比两个perf.data文件差异,能够给出每个函数在热点分析上的具体差异。
   
   evlist          List the event names in a perf.data file  列出perf.data文件中所有性能事件
   
   ftrace          simple wrapper for kernel's ftrace functionality
   inject          Filter to augment the events stream with additional information 该工具读取perf record工具记录的事件流,并将其定向到标准输出。在被分析代码中的任何一点,都可以向事件流中注入其它事件。
   
   kallsyms        Searches running kernel for symbols
   kmem            Tool to trace/measure kernel memory properties 针对内核内存(slab)子系统进行追踪测量的工具
   
   kvm             Tool to trace/measure kvm guest os 用来追踪测试运行在KVM虚拟机上的Guest OS。
   
   list            List all symbolic event types 列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。
   
   lock            Analyze lock events 列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。
   mem             Profile memory accesses  内存存取情况
   record          Run a command and record its profile into perf.data  收集采样信息,并将其记录在perf.data数据文件中。随后可通过其它工具对数据文件进行分析。
   
   report          Read perf.data (created by perf record) and display the profile 读取perf record创建的数据文件,并给出热点分析结果。
   
   sched           Tool to trace/measure scheduler properties (latencies)  针对调度器子系统的分析工具
   
   script          Read perf.data (created by perf record) and display trace output 
   stat            Run a command and gather performance counter statistics 执行某个命令,收集特定进程的性能概况,包括CPI、Cache丢失率等
   
   test            Runs sanity tests.perf对当前软硬件平台进行健全性测试,可用此工具测试当前的软硬件平台是否能支持perf的所有功能。
   
   timechart       Tool to visualize total system behavior during a workload 针对测试期间系统行为进行可视化的工具
   
   top             System profiling tool.  类似于linux的top命令,对系统性能进行实时分析。
   version         display the version of perf binary
   probe           Define new dynamic tracepoints  用于定义动态检查点。
   trace           strace inspired tool  关于syscall的工具。

 See 'perf help COMMAND' for more information on a specific command.

►►► 对系统性能进行实时分析

perf top

# perf top -h

Usage: perf top [<options>]

    -a, --all-cpus        system-wide collection from all CPUs
    -b, --branch-any      sample any taken branches
    -c, --count <n>       event period to sample
    -C, --cpu <cpu>       list of cpus to monitor
    -d, --delay <n>       number of seconds to delay between refreshes
    -D, --dump-symtab     dump the symbol table used for profiling
    -E, --entries <n>     display this many functions
    -e, --event <event>   event selector. use 'perf list' to list available events
    -f, --count-filter <n>
                          only display functions with more events than this
    -F, --freq <freq or 'max'>
                          profile at this frequency
    -g                    enables call-graph recording and display
    -i, --no-inherit      child tasks do not inherit counters
    -j, --branch-filter <branch filter mask>
                          branch stack filter modes
    -K, --hide_kernel_symbols
                          hide kernel symbols
    -k, --vmlinux <file>  vmlinux pathname
    -M, --disassembler-style <disassembler style>
                          Specify disassembler style (e.g. -M intel for intel syntax)
    -m, --mmap-pages <pages>
                          number of mmap data pages
    -n, --show-nr-samples
                          Show a column with the number of samples
    -p, --pid <pid>       profile events on existing process id
    -r, --realtime <n>    collect data with this RT SCHED_FIFO priority
    -s, --sort <key[,key2...]>
                          sort by key(s): pid, comm, dso, symbol, parent, cpu, srcline, ... Please refer the man page for the complete list.
    -t, --tid <tid>       profile events on existing thread id
    -U, --hide_user_symbols
                          hide user symbols
    -u, --uid <user>      user to profile
    -v, --verbose         be more verbose (show counter open errors, etc)
    -w, --column-widths <width[,width...]>
                          don't try to adjust column width, use these fixed values
    -z, --zero            zero history across updates
        --asm-raw         Display raw encoding of assembly instructions (default)
        --call-graph <record_mode[,record_size],print_type,threshold[,print_limit],order,sort_key[,branch]>
                          setup and enables call-graph (stack chain/backtrace):

                                record_mode:    call graph recording mode (fp|dwarf|lbr)
                                record_size:    if record_mode is 'dwarf', max size of stack recording (<bytes>)
                                                default: 8192 (bytes)
                                print_type:     call graph printing style (graph|flat|fractal|folded|none)
                                threshold:      minimum call graph inclusion threshold (<percent>)
                                print_limit:    maximum number of call graph entry (<number>)
                                order:          call graph order (caller|callee)
                                sort_key:       call graph sort key (function|address)
                                branch:         include last branch info to call graph (branch)
                                value:          call graph value (percent|period|count)

                                Default: fp,graph,0.5,caller,function
        --children        Accumulate callchains of children and show total overhead as well
        --comms <comm[,comm...]>
                          only consider symbols in these comms
        --demangle-kernel
                          Enable kernel symbol demangling
        --dsos <dso[,dso...]>
                          only consider symbols in these dsos
        --fields <key[,keys...]>
                          output field(s): overhead, period, sample plus all of sort keys
        --force           don't complain, do it
        --group           put the counters into a counter group
        --hierarchy       Show entries in a hierarchy
        --ignore-callees <regex>
                          ignore callees of these functions in call graphs
        --ignore-vmlinux  don't load vmlinux even if found
        --max-stack <n>   Set the maximum stack depth when parsing the callchain. Default: kernel.perf_event_max_stack or 127
        --num-thread-synthesize <n>
                          number of thread to run event synthesize
        --objdump <path>  objdump binary to use for disassembly and annotations
        --overwrite       Use a backward ring buffer, default: no
        --percent-limit <percent>
                          Don't show entries under that percent
        --percentage <relative|absolute>
                          How to display percentage of filtered entries
        --proc-map-timeout <n>
                          per thread proc mmap processing timeout in ms
        --raw-trace       Show raw trace event output (do not use print fmt or plugins)
        --show-total-period
                          Show a column with the sum of periods
        --source          Interleave source code with assembly code (default)
        --stdio           Use the stdio interface
        --sym-annotate <symbol name>
                          symbol to annotate
        --symbols <symbol[,symbol...]>
                          only consider these symbols
        --tui             Use the TUI interface
[root@centos7 ~]# perf top -a
Samples: 646K of event 'cpu-clock', 4000 Hz, Event count (approx.): 12702138322 lost: 0/0 drop: 0/0
Overhead  Shared Object            Symbol
  29.70%  php-fpm                  [.] 0x00000000006250c2   

Samples:采集cpu时钟事件的总样本数, 可以在命令中跟上 -e 事件 参数来指定跟踪的事件,perf list 命令,列出所有可跟踪的事件。

Event count:事件总数量

Overhead:符号引起的性能事件在总采样本中的百分比

Shared Object :符号所在的DSO(Dynamic Shared Object),一般是应用程序、内核、动态连接库、模块

[.]表示此符号属于用户态的ELF文件,包括可执行文件与动态连接库;[k]表述此符号属于内核或模块。

Symbol:符号名或函数名,未知时,用十六进制显示

perf top 常用的扩展参数有
在这里插入图片描述

[root@centos7 ~]# perf list

List of pre-defined events (to be used in -e):

  alignment-faults                                   [Software event]
  bpf-output                                         [Software event]
  context-switches OR cs                             [Software event]
  cpu-clock                                          [Software event]
  cpu-migrations OR migrations                       [Software event]
  dummy                                              [Software event]
  emulation-faults                                   [Software event]
  major-faults                                       [Software event]
  minor-faults                                       [Software event]
  page-faults OR faults                              [Software event]
  task-clock                                         [Software event]

  msr/tsc/                                           [Kernel PMU event]

  rNNN                                               [Raw hardware event descriptor]
  cpu/t1=v1[,t2=v2,t3 ...]/modifier                  [Raw hardware event descriptor]
   (see 'man perf-list' on how to encode it)

  mem:<addr>[/len][:access]                          [Hardware breakpoint]

  block:block_bio_backmerge                          [Tracepoint event]
  block:block_bio_bounce                             [Tracepoint event]
  block:block_bio_complete                           [Tracepoint event]
  block:block_bio_frontmerge                         [Tracepoint event]

Software 是软件事件

Hardware\cache\Kernel PMU 都是硬件事件

Tracepoint是基于内核的ftrace

# 指定跟踪的事件 perf top -e block:block_rq_issue Samples: 11  of event 'block:block_rq_issue', 1 Hz, Event count (approx.): 1 lost: 0/0 drop: 1/8 Overhead
 100.00%
  14.29%  0,0 R 8 (4a 01 00 00 10 00 00 00 08 00) 0 + 0 [kworker/1:0]
# 跟踪某个进程的事件情况
[root@centos7 ~]# perf top -p 2087
Samples: 2K of event 'cpu-clock', 4000 Hz, Event count (approx.): 520562500 lost: 0/0 drop: 0/0
Overhead  Shared Object     Symbol
  29.87%  php-fpm           [.] 0x00000000006250c2

►►► 具体跟踪某一个进程

perf record -g p pid

[root@centos7 ~]# perf record -g -p 2181
# 收集一段较长时间后,ctrl+c 停止

执行命令之后,会在当前路径下生成一个 perf.data文件

►►► 分析perf.data文件

在有perf.data文件的路径下,执行 perf report

[root@centos7 ~]# perf report
Samples: 142K of event 'cpu-clock', Event count (approx.): 35597750000, Thread: php-fpm
  Children      Self  Command  Shared Object       Symbol
+   31.44%     0.00%  php-fpm  php-fpm             [.] 0x000056149fda70c2                                                                                    ◆
+   30.78%    30.78%  php-fpm  php-fpm             [.] 0x00000000006250c2   

看到里面的+号的行,可以回车,逐级往下定位

►►► 查看某个进程在一段时间内

调用CPU情况 perf stat

perf stat -p 进程id
# 执行一段时间后,ctrl+c停止
[root@centos7 ~]# perf stat -p 2399
^C
 Performance counter stats for process id '2399':

         93,774.02 msec task-clock                #    0.399 CPUs utilized
            21,295      context-switches          #    0.227 K/sec
               541      cpu-migrations            #    0.006 K/sec
                 0      page-faults               #    0.000 K/sec
   <not supported>      cycles
   <not supported>      instructions
   <not supported>      branches
   <not supported>      branch-misses

     235.027326843 seconds time elapsed 

在这里插入图片描述

通过这个,我们也能观察到进程使用CPU的情况,帮助性能分析。

最后: 可以在公众号:伤心的辣条 ! 自行领取一份216页软件测试工程师面试宝典文档资料【免费的】。以及相对应的视频学习教程免费分享!,其中包括了有基础知识、Linux必备、Shell、互联网程序原理、Mysql数据库、抓包工具专题、接口测试工具、测试进阶-Python编程、Web自动化测试、APP自动化测试、接口自动化测试、测试高级持续集成、测试架构开发测试框架、性能测试、安全测试等。

现在我邀请你进入我们的软件测试学习交流群:746506216】,备注“入群”, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路。

喜欢软件测试的小伙伴们,如果我的博客对你有帮助、如果你喜欢我的博客内容,请 “点赞” “评论” “收藏” 一 键三连哦!

软件测试工程师自学教程:

这才是2022最精细的自动化测试自学教程,我把它刷了无数遍才上岸字节跳动,做到涨薪20K【值得自学软件测试的人刷】

接口性能测试 — 软件测试人必会618实战场景分析

软件测试工程师月薪2W以上薪资必学技能 — Python接口自动化框架封装.

美团面试真题_高级测试25K岗位面试 — 软件测试人都应该看看

测试开发之全面剖析自动化测试平台 — 软件测试人的必经之路

软件测试必会_Jmeter大厂实战 — 仅6步可实现接口自动化测试

Jmeter实战讲解案例 — 软件测试人必会

在这里插入图片描述

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/m0_67695717/article/details/126248151