文章目录

  • Perf 性能检测工具
    • perf --help
    • Ubuntu20.04安装Perf工具
    • 记录一段时间内系统/进程的性能事件
      • 常用参数
      • 例子
    • 读取生成的数据文件,并显示分析数据
      • 常用参数
      • 例子
    • 实时显示系统/进程的性能统计信息
      • 常用参数
      • 例子
    • 用于分析指定程序的性能概况
      • 常用参数
      • 例子
    • 相关示例
  • 参考

Perf 性能检测工具

Perf 是一个内置于Linux内核中的工具,用于性能分析和调优。它可以对系统的CPU使用情况、内存使用情况、磁盘I/O、网络I/O等进行监控和分析,并提供了丰富的分析和可视化工具,以帮助用户定位和解决性能问题。perf可以进行函数级和指令级的热点查找,以帮助用户发现应用程序中的性能瓶颈。perf还支持事件采样、跟踪和调试等功能,可以帮助用户深入了解系统和应用程序的运行状况。由于perf是一个内核级别的工具,因此它可以对系统的性能进行非常深入的分析,并且对系统的开销非常小。perf已经成为了Linux系统中非常常用的性能分析工具之一。

perf --help

perf --helpusage: perf [--version] [--help] [OPTIONS] COMMAND [ARGS]The most commonly used perf commands are:annotate        解析perf record生成的perf.data文件,显示被注释的代码。archive         根据数据文件记录的build-id,将所有被采样到的elf文件打包。利用此压缩包,可以再任何机器上分析数据文件中记录的采样数据。bench           perf中内置的benchmark,目前包括两套针对调度器和内存管理子系统的benchmark。buildid-cache   管理perf的buildid缓存,每个elf文件都有一个独一无二的buildid。buildid被perf用来关联性能数据与elf文件。buildid-list    列出数据文件中记录的所有buildid。c2c             Shared Data C2C/HITM Analyzer.config          Get and set variables in a configuration file.daemon          Run record sessions on backgrounddata            Data file related processingdiff            对比两个数据文件的差异。能够给出每个符号(函数)在热点分析上的具体差异。evlist          列出数据文件perf.data中所有性能事件。ftrace          simple wrapper for kernel's ftrace functionalityinject          该工具读取perf record工具记录的事件流,并将其定向到标准输出。在被分析代码中的任何一点,都可以向事件流中注入其它事件。iostat          Show I/O performance metricskallsyms        Searches running kernel for symbolskmem            针对内核内存(slab)子系统进行追踪测量的工具kvm             用来追踪测试运行在KVM虚拟机上的Guest OS。list            列出当前系统支持的所有性能事件。包括硬件性能事件、软件性能事件以及检查点。lock            分析内核中的锁信息,包括锁的争用情况,等待延迟等。mem             内存存取情况record          收集采样信息,并将其记录在数据文件中。随后可通过其它工具对数据文件进行分析。report          读取perf record创建的数据文件,并给出热点分析结果。sched           针对调度器子系统的分析工具。script          执行perl或python写的功能扩展脚本、生成脚本框架、读取数据文件中的数据信息等。stat            执行某个命令,收集特定进程的性能概况,包括CPI、Cache丢失率等。test            perf对当前软硬件平台进行健全性测试,可用此工具测试当前的软硬件平台是否能支持perf的所有功能。timechart       针对测试期间系统行为进行可视化的工具top             类似于linux的top命令,对系统性能进行实时分析。version         display the version of perf binaryprobe           用于定义动态检查点。trace           关于syscall的工具。See 'perf help COMMAND' for more information on a specific command.

Ubuntu20.04安装Perf工具

sudo apt install linux-tools-common
sudo apt install linux-tools-5.13.0-40-generic
sudo apt install linux-cloud-tools-5.13.0-40-generic

记录一段时间内系统/进程的性能事件

perf record

常用参数

 -e:选择性能事件-p:待分析进程的id-t:待分析线程的id-a:分析整个系统的性能,即所有CPU采样-C:只采集指定CPU数据-c:事件的采样周期-o:指定输出文件,默认为perf.data-A:以append的方式写输出文件-f:以OverWrite的方式写输出文件-g:记录函数间的调用关系

例子

perf record -a -e cycles -o cycle.perf -g sleep 10
[ perf record: Woken up 18 times to write data ]
[ perf record: Captured and wrote 4.953 MB cycle.perf (~216405 samples) ]

读取生成的数据文件,并显示分析数据

perf report

常用参数

-i:输入的数据文件
-v:显示每个符号的地址
-d <dos>:只显示指定dos的符号
-C:只显示指定comm的信息(Comm. 触发事件的进程名)
-S:只考虑指定符号
-U:只显示已解析的符号
-g[type,min,order]:显示调用关系,具体等同于perf top命令中的-g
-c:只显示指定cpu采样信息
-M:以指定汇编指令风格显示
–source:以汇编和source的形式进行显示
-p<regex>:用指定正则表达式过滤调用函数

例子

perf report -i cycle.perf | more
# To display the perf.data header info, please use --header/--header-only options.
#
#
# Total Lost Samples: 0
#
# Samples: 34K of event 'cpu-clock'
# Event count (approx.): 8508750000
#
# Children      Self  Command          Shared Object               Symbol
# ........  ........  ...............  ..........................  ...............................................
#99.20%     0.00%  swapper          [kernel.kallsyms]           [k] 0xffffffff90c00107|---0xffffffff90c00107||--49.81%--0xffffffff92e94731|          0xffffffff92e9462d|          0xffffffff92e95c3e|          0xffffffff92e953fb|          0xffffffff91963c73|          0xffffffff90d09be0|          ||           --49.81%--0xffffffff90d099a4|                     0xffffffff90d096b3|                     0xffffffff9164cbde|                     0xffffffff9164c607|                     ||                      --49.79%--0xffffffff919731eb|                                ||                                 --49.78%--0xffffffff91972a5b|--49.39%--0xffffffff90c7d81a0xffffffff90d09be0|--49.39%--0xffffffff90d099a40xffffffff90d096b30xffffffff9164cbde|--49.38%--0xffffffff9164c607|--49.37%--0xffffffff919731eb0xffffffff91972a5b99.20%     0.00%  swapper          [kernel.kallsyms]           [k] 0xffffffff90d09be0|---0xffffffff90d09be0|--99.19%--0xffffffff90d099a40xffffffff90d096b30xffffffff9164cbde|--99.19%--0xffffffff9164c607|--99.16%--0xffffffff919731eb|--99.15%--0xffffffff91972a5b--More--

实时显示系统/进程的性能统计信息

perf top

常用参数

-e:指定性能事件
-a:显示在所有CPU上的性能统计信息
-C:显示在指定CPU上的性能统计信息
-p:指定进程PID
-t:指定线程TID
-K:隐藏内核统计信息
-U:隐藏用户空间的统计信息
-s:指定待解析的符号信息
‘‐G’ or‘‐‐call‐graph’ <output_type,min_percent,call_order>
graph: 使用调用树,将每条调用路径进一步折叠。这种显示方式更加直观。
每条调用路径的采样率为绝对值。也就是该条路径占整个采样域的比率。
fractal
默认选项。类似与 graph,但是每条路径前的采样率为相对值。
flat
不折叠各条调用
选项 call_order 用以设定调用图谱的显示顺序,该选项有 2个取值,分别是
callee 与caller。
将该选项设为callee 时,perf按照被调用的顺序显示调用图谱,上层函数被下层函数所调用。
该选项被设为caller 时,按照调用顺序显示调用图谱,即上层函数调用了下层函数路径,也不显示每条调用路径的采样率
注: Perf top需要root权限

例子

sudo perf top -g
Samples: 1K of event 'cpu-clock:pppH', 4000 Hz, Event count (approx.): 251003285 lost: 0/0 drop: 0/0Children      Self  Shared Object            Symbol
+   42.35%     0.15%  perf                     [.] __dso__load_kallsyms
+   36.54%     0.10%  [kernel]                 [k] vfs_read
+   35.50%     0.05%  libpthread-2.31.so       [.] __libc_read
+   35.50%     0.10%  [kernel]                 [k] ksys_read
+   35.15%     0.05%  [kernel]                 [k] proc_reg_read
+   35.10%     0.10%  [kernel]                 [k] seq_read
+   34.48%     0.72%  [kernel]                 [k] seq_read_iter
+   26.92%     0.41%  [kernel]                 [k] s_show
+   26.62%     0.46%  [kernel]                 [k] seq_printf
+   26.10%     0.41%  [kernel]                 [k] seq_vprintf
+   22.84%     5.11%  [kernel]                 [k] vsnprintf
+   22.52%     0.28%  [kernel]                 [k] do_user_addr_fault
+   21.86%     0.19%  [kernel]                 [k] __handle_mm_fault
+   20.94%     0.36%  libc-2.31.so             [.] __stpncpy_sse2_unaligned
+   20.60%     0.29%  [kernel]                 [k] get_page_from_freelist
+   20.60%     0.05%  [kernel]                 [k] __alloc_pages
+   19.69%    19.69%  [kernel]                 [k] clear_page_orig
+    6.98%     3.36%  [kernel]                 [k] __softirqentry_text_start
+    6.73%     0.80%  [kernel]                 [k] cpuidle_enter_state
+    6.54%     0.26%  [kernel]                 [k] s_next
+    6.50%     6.40%  [kernel]                 [k] __lock_text_start
+    6.44%     0.56%  [kernel]                 [k] update_iter6.33%     6.33%  [kernel]                 [k] format_decode
+    6.23%     0.66%  [kernel]                 [k] pointer5.72%     5.72%  [kernel]                 [k] number
+    5.36%     0.72%  [kernel]                 [k] string4.65%     4.44%  [kernel]                 [k] string_nocheck
For a higher level overview, try: perf top --sort comm,dso

perf output 监控接口在多个列中显示数据:

  • Children

    表示该符号名下调用函数性能事件在所有采样中的比例

  • Overhead

    显示函数或库占用的 CPU 百分比。

  • Shared Object

    显示使用函数的程序或库的名称。

  • Symbol

    显示功能名称或符号。在内核空间中执行的功能由 [k] 标识,在用户空间中执行的功能由 [.] 标识。

用于分析指定程序的性能概况

perf stat

常用参数

-e:选择性能事件
-i:禁止子任务继承父任务的性能计数器。
-r:重复执行 n 次目标程序,并给出性能指标在n 次执行中的变化范围。
-n:仅输出目标程序的执行时间,而不开启任何性能计数器。
-a:指定全部cpu
-C:指定某个cpu
-A:将给出每个处理器上相应的信息。
-p:指定待分析的进程id
-t:指定待分析的线程id

例子

# perf stat
sudo perf stat ib_send_bw -d rxe0 -R -s 2M 192.168.159.131
---------------------------------------------------------------------------------------Send BW TestDual-port       : OFF          Device         : rxe0Number of qps   : 1            Transport type : IBConnection type : RC           Using SRQ      : OFFTX depth        : 128CQ Moderation   : 100Mtu             : 1024[B]Link type       : EthernetGID index       : 2Max inline data : 0[B]rdma_cm QPs     : ONData ex. method : rdma_cm
---------------------------------------------------------------------------------------local address: LID 0000 QPN 0x0017 PSN 0xa67937GID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:159:131remote address: LID 0000 QPN 0x0018 PSN 0xf8296aGID: 00:00:00:00:00:00:00:00:00:00:255:255:192:168:159:131
---------------------------------------------------------------------------------------#bytes     #iterations    BW peak[MB/sec]    BW average[MB/sec]   MsgRate[Mpps]2097152    1000             228.77             205.87             0.000103
---------------------------------------------------------------------------------------Performance counter stats for 'ib_send_bw -d rxe0 -R -s 2M 192.168.159.131':10,027.98 msec task-clock                #    0.993 CPUs utilized143      context-switches          #   14.260 /sec1      cpu-migrations            #    0.100 /sec1,260      page-faults               #  125.648 /sec<not supported>      cycles<not supported>      instructions<not supported>      branches<not supported>      branch-misses10.100792733 seconds time elapsed0.274651000 seconds user9.542177000 seconds sys

输出解释如下:

task-clock:任务真正占用的处理器时间,单位为ms

CPUs utilized = task-clock/time elapsed (CPU的占用率)

context-swichees:程序在运行过程中的上下文切换次数

CPU-migrations:程序在运行过程中发生的处理器迁移次数。Linux为了维持多个处理器的负载均衡在特定条件下会将某个任务从一个CPU迁移到另一个CPU。CPU迁移和上下文切换:发生上下文切换不一定会发生CPU迁移,而发生CPU迁移时肯定会发生上下文切换。发生上下文切换有可能只是把上下文从当前CPU换出,下一次调度器还是将进程安排在这个CPU上执行。

page-faults:缺失异常的次数。当应用程序请求的页面尚未建立,请求的页面不在内存中,或者请求的页面虽然在内存中,但物理地址和虚拟地址的映射关系尚未建立时,都会触发一次却也异常。另外TLB不命中,页面访问权限不匹配等情况也会触发缺页异常。

cycles:消耗的处理器周期数。

stalled-cycles-frontend:指令读取或解码的步骤,未能按理想状态发挥并行左右,发生停滞的时钟周期。

stalled-cycles-backend:指令执行步骤,发生停滞的时钟周期。

instructions:执行了多少条指令。IPC为平均每个cpu cycle执行了多少条指令。

branches:遇到的分支指令数。

branch-misses :是预测错误的分支指令数。

相关示例

perf top -e cycles:k     #显示内核和模块中,消耗最多CPU周期的函数perf top -e kmem:kmem_cache_alloc     #显示分配高速缓存最多的函数perf top -g         #得到调用关系图perf top -e cycles         #指定性能事件perf top -p 23015,32476         #查看这两个进程的cpu cycles使用情况perf top -s comm,pid,symbol         #显示调用symbol的进程名和进程号perf top --comms nginx,top         #仅显示属于指定进程的符号perf top --symbols kfree         #仅显示指定的符号perf stat -r 10 ls > /dev/null         #执行10次程序,给出标准偏差与期望的比值perf stat -v ls > /dev/null         #显示更详细的信息perf stat -n ls > /dev/null         #只显示任务执行时间,不显示性能计数器perf stat -a -A ls > /dev/null         #单独给出每个CPU上的信息perf stat -C 0                        #统计CPU 0的信息perf stat -e syscalls:sys_enter ls          #ls命令执行了多少次系统调用perf record -p `pgrep -d ',' nginx`      #记录nginx进程的性能数据perf record ls -g    #记录执行ls时的性能数据perf record -e syscalls:sys_enter ls      #记录执行ls时的系统调用,可以知道哪些系统调用最频繁perf lock record ls      #记录perf lock report      #报告Name:内核锁的名字。
aquired:该锁被直接获得的次数,因为没有其它内核路径占用该锁,此时不用等待。
contended:该锁等待后获得的次数,此时被其它内核路径占用,需要等待。
total wait:为了获得该锁,总共的等待时间。
max wait:为了获得该锁,最大的等待时间。
min wait:为了获得该锁,最小的等待时间。
perf kmem record ls      #记录perf kmem stat --caller --alloc -l 20      #报告Callsite:内核代码中调用kmalloc和kfree的地方。
Total_alloc/Per:总共分配的内存大小,平均每次分配的内存大小。
Total_req/Per:总共请求的内存大小,平均每次请求的内存大小。
Hit:调用的次数。
Ping-pong:kmalloc和kfree不被同一个CPU执行时的次数,这会导致cache效率降低。
Frag:碎片所占的百分比,碎片 = 分配的内存 - 请求的内存,这部分是浪费的。
有使用--alloc选项,还会看到Alloc Ptr,即所分配内存的地址。perf sched record sleep 10    perf report latency --sort max
TASK:进程名和pid。
Runtime:实际的运行时间。
Switches:进程切换的次数。
Average delay:平均的调度延迟。
Maximum delay:最大的调度延迟。
Maximum delay at:最大调度延迟发生的时刻。perf probe --line schedule    #前面有行号的可以探测,没有行号的就不行了perf report latency --sort max    #在schedule函数的12处增加一个探测点

Perf工具统计CPU性能相关推荐

  1. 用于CPU性能SQL Server监视工具

    CPU压力降低了服务器速度 (CPU pressure slowing down the server) This article is the sequel in a series about SQ ...

  2. Linux CPU性能优化 —— CPU使用率及高CPU使用率排查

    文章目录 CPU使用率的定义 查看CPU使用率:top和pidstat 排查高CPU使用率:pref 参考文献 写在前面: 由于之前在开发分布式系统中由于云服务器性能原因,导致系统总是断连等错误.但是 ...

  3. 方便好用的在线CPU性能调优工具--perf的常见用法

    perf 是 Linux 2.6.31 以后内置的性能分析工具.它是一款综合性分析工具,以性能事件采样为基础,可以分析从内核级别,到进程线程级别,甚至到函数及汇编级别的性能问题. 1 perf top ...

  4. linux统计数据查看工具,CPU性能统计数据及Linux监控工具使用

    一.CPU性能统计数据 1.Run Queue Statistics-- 运行队列统计 In Linux, a process can be either runnableor blocked wai ...

  5. 【性能】perf工具简介

    perf 架构图总览 Events 事件主要有哪些 hardware events:CPU performance monitoring counters software events: 基于ker ...

  6. Linux性能优化2.1 CPU性能统计信息

    摘要 性能工具:系统CPU 本章概述了系统级的Linux性能工具.这些工具是你追踪性能问题时的第一道防线.它们能展示整个系统的性能情况和哪些部分表现不好.本章将讨论这些工具可以测量的统计信息,以及如何 ...

  7. 20线程测试cpu性能软件,3DMark推出CPU专用测试工具CPU Profile,可对比不同线程下的CPU性能...

    拼 命 加 载 中 ... 其实3DMark的各个测试里面都混有一个物理测试,这个测试其实就是跑CPU的,我们在测试CPU时也经常单独跑这个物理测试,现在3DMark推出了一个专门跑CPU性能的测试- ...

  8. 【会议记录】基于CPU性能调优的必要性和方法介绍

    前一段时间我参加了阅码场的活动 Yomoday(北京场),现场有很多技术专家,非常多前沿的技术分享.这是其中一个主题的记录,尽量还原当时的分享内容,但也可能有些地方不特别准确. 1 基于CPU性能调优 ...

  9. Linux CPU性能监控工具

    微信公众号:云计算通俗讲义 持续输出技术干货,欢迎关注! 通过本文你将了解: 架构 性能指标 监控工具 故障分析 架构 CPU架构主要包括桌面端和移动端两种. 对于桌面端,主要有Intel和AMD两家 ...

最新文章

  1. 【LeetCode | 二叉树前、中、后序遍历{迭代法}实现】
  2. java 父类转子类_Java多态,对象转型,和简单工厂模式。希望对您有帮助!
  3. 为什么下载源码包需要到官网上去下载?
  4. 码农如何快速打造一个有设计感的网站
  5. 连接数据库的方法---ODBC
  6. 数组中第K个最大元素
  7. 交换机分布缓存_交换机网络嗅探方法 如何欺骗交换机缓存
  8. 10双屏鼠标过不去_灵耀X2 Duo双屏笔记本是怎样“炼”成的?对话华硕笔记本设计团队...
  9. java 安全认证_restful安全认证
  10. VC++常见错误原因解析之error LNK2019: 无法解析的外部符号 public: void __thiscall
  11. 单链表java实现及相关操作(版本1)
  12. 计算机四级网络工程师题库及详细知识点大全
  13. 音频-什么是PCM编码格式?
  14. 《程序员》杂志 · 2017 精华本
  15. 睁开双眼玩立体游戏!3D显示技术解析
  16. Android——基本组件-2
  17. WCF 面向服务的4个原则
  18. 苹果计算机密码bug,苹果iOS 13系统新BUG:快速输入密码,解锁无效
  19. lisp 非对称缓和曲线_利用AutoLISP语言绘制带缓和曲线的铁路曲线平面图
  20. 斗地主手牌最少手数的搜索

热门文章

  1. BZOJ 1143 祭祀
  2. yocto模块使用quilt工具增加patch方法
  3. 爬取电影天堂电影信息
  4. MATLAB求解函数的零点+代码演示
  5. http协议没有已注册的程序
  6. 一个工作一年半的程序员的自述(一)
  7. SSH企业案例_CRM客户管理系统(六):Easyui列表展示
  8. 路由器: IP与网关 不在同一段 解决方法
  9. android手机操作系统 刷机,安卓怎么刷机 安卓系统刷机图文教程
  10. C/C++ 中野指针产生的问题