网站招代理,无版权视频素材网站,设计网站意味着什么,网络建设解决方案专业公司Perf 性能检测工具
Perf 是一个内置于Linux内核中的工具#xff0c;用于性能分析和调优。它可以对系统的CPU使用情况、内存使用情况、磁盘I/O、网络I/O等进行监控和分析#xff0c;并提供了丰富的分析和可视化工具#xff0c;以帮助用户定位和解决性能问题。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 kernels 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的形式进行显示
-pregex用指定正则表达式过滤调用函数例子
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 -gSamples: 1K of event cpu-clock:pppH, 4000 Hz, Event count (approx.): 251003285 lost: 0/0 drop: 0/0Children Self Shared Object Symbol42.35% 0.15% perf [.] __dso__load_kallsyms36.54% 0.10% [kernel] [k] vfs_read35.50% 0.05% libpthread-2.31.so [.] __libc_read35.50% 0.10% [kernel] [k] ksys_read35.15% 0.05% [kernel] [k] proc_reg_read35.10% 0.10% [kernel] [k] seq_read34.48% 0.72% [kernel] [k] seq_read_iter26.92% 0.41% [kernel] [k] s_show26.62% 0.46% [kernel] [k] seq_printf26.10% 0.41% [kernel] [k] seq_vprintf22.84% 5.11% [kernel] [k] vsnprintf22.52% 0.28% [kernel] [k] do_user_addr_fault21.86% 0.19% [kernel] [k] __handle_mm_fault20.94% 0.36% libc-2.31.so [.] __stpncpy_sse2_unaligned20.60% 0.29% [kernel] [k] get_page_from_freelist20.60% 0.05% [kernel] [k] __alloc_pages19.69% 19.69% [kernel] [k] clear_page_orig6.98% 3.36% [kernel] [k] __softirqentry_text_start6.73% 0.80% [kernel] [k] cpuidle_enter_state6.54% 0.26% [kernel] [k] s_next6.50% 6.40% [kernel] [k] __lock_text_start6.44% 0.56% [kernel] [k] update_iter6.33% 6.33% [kernel] [k] format_decode6.23% 0.66% [kernel] [k] pointer5.72% 5.72% [kernel] [k] number5.36% 0.72% [kernel] [k] string4.65% 4.44% [kernel] [k] string_nocheck
For a higher level overview, try: perf top --sort comm,dsoperf 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 /secnot supported cyclesnot supported instructionsnot supported branchesnot 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-pongkmalloc和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处增加一个探测点参考
Tutorial - Perf Wiki (kernel.org)
绿色记忆:利用perf剖析Linux应用程序 (gmem.cc)
第 18 章 perf 入门 Red Hat Enterprise Linux 8 | Red Hat Customer Portal
Linux perf命令详解及常用参数解析 - 寒冰宇若 - 博客园 (cnblogs.com)
系统级性能分析工具perf的介绍与使用 - ArnoldLu - 博客园 (cnblogs.com)
系統級性能分析工具 — Perf | Jason note (jasonblog.github.io)
Linux 性能诊断 perf使用指南-阿里云开发者社区 (aliyun.com)
Linux Perf 性能分析工具及火焰图浅析 – 滴滴云博客 (didiyun.com)
性能优化工具perf – duanple
perf性能分析 | Hexo (melonshell.github.io)
Linux性能分析工具Perf简介 - 老王系统屋 - SegmentFault 思否